我认为你可以在这里有两种方式。第一个(我不推荐)是将您的 s 表达式建模为 lambda 演算中的列表。你基本上使用块作为函数,你就完成了。在这里,您可以喜欢使用 lambda 演算编写列表的解释。例如,在 Smalltalk 中你会写
empty = λfx.x
作为
empty := [:f :x | x].
现在,走这条路基本上就是用 OO 语言编写函数式程序,而我不会这样做。如果您想对列表使用符号方法,那么您应该使用对象对其进行建模。有一个EmptyList
类和一个Cons
类(Cons
将有一个element
和一个list
inst var),以便您通过执行以下操作创建一个列表:
listWithOne := Cons element: 1 list: EmptyList new.
只需返回 inst var 值,即可在类中轻松编写head
and方法。你也可以在类中定义和方法,这样现在和都是多态的。tail
Cons
head
tail
EmptyList
EmptyList
Cons
补充:好的,只是为了好玩,一个使用块和数组的实现,函数式:
| empty cons head tail test |
empty := [nil].
cons := [:i :j :value :old | [Array with:i with:j with:value with:old]].
head := [:list | list value ifNotNil: [:v | v copyFrom:1 to:3]].
tail := [:list | list value at: 4].
test := cons value: 1 value: 1 value: 'Hi' value: (cons value: 1 value: 2 value: 'Ho' value: empty).
"Print each one"
head value: test.
head value: (tail value: test).
head value: (tail value: (tail value: test)).
高温高压