遞迴資料類型 |
|
假設您想要表示為標示節點和編號葉子的樹。
要建立此資料結構,則需要為每個變體節點建立一個建立函式:InteriorNode
和 LeafNode
。且當遍歷資料結構時,您需要判斷會的陳述式來處理不同資料。函式 deftype
[3] 會根據一個簡單規格建立建立函式。函式 cases
會傳回用於遍歷資料結構的切換函式。
require'DefType' deftype 'bintree' { 'number'; Node = { name ='string', left ='bintree', right='bintree', }; } local function node(name, left, right) return Node{name=name, left=left, right=right} end local tree = node( 'cow', node('rat', 1, 2), node('pig', node('dog', 3, 4), 5) ) ------------------------------------------------------------------------------ local leafsum leafsum = cases 'bintree' { number = function(n) return n end; Node = function(node) return leafsum(node.left) + leafsum(node.right) end; } io.write('leaf sum = ', leafsum(tree), '\n\n') ------------------------------------------------------------------------------ local function indented(level, ...) io.write(string.rep(' ', level), unpack(arg)) end local treewalki treewalki = cases 'bintree' { number = function(n) io.write(' @LeafNode ', n, '\n') end; Node = function(node, level) local plus1 = level+1 io.write(' {\n') indented(plus1, '@InteriorNode ', node.name, '\n') indented(plus1, '@left') treewalki(node.left, plus1) indented(plus1, '@right') treewalki(node.right, plus1) indented(level, '}\n') end; } local function treewalk(t) io.write('@Tree') treewalki(t, 0) end treewalk(tree)
leaf sum = 15 @Tree { @InteriorNode cow @left { @InteriorNode rat @left @LeafNode 1 @right @LeafNode 2 } @right { @InteriorNode pig @left { @InteriorNode dog @left @LeafNode 3 @right @LeafNode 4 } @right @LeafNode 5 } }
樹狀圖則是由 Lout[2] 根據 [fig1.lt] 產生。Ghostscript 則用於將 EPS 轉換為 JPG。