doc = function (...) { doc = new.env(parent = emptyenv()) doc$words = lapply(list(...), add_node, doc = doc) doc } par = function (...) { structure(list(...), class = c("par", "docnode")) } sentence = function (words) { structure(words, class = c("sentence", "docnode")) } # Note: for this simple example the `doc` argument to `add_node` is unused but # for a real document API that allows nessted structures it becomes # indispensable. add_node = function (node, doc) { UseMethod('add_node') } add_node.par = function (node, doc) { lapply(node, add_node, doc = doc) } add_node.sentence = function (node, doc) { unclass(node) }