我认为你可以在这里以两种方式去。第一个(我不推荐)将你的s表达式建模为lambda微积分中的列表。你基本上使用块作为功能,你就完成了。 Here你可以喜欢使用lambda微积分编写列表的解释。举个例子,在Smalltalk中你会写
empty = λfx.x
为
empty := [:f :x | x].
现在,去这条道路将是一个面向对象的语言,我不会做基本上可以写一个函数式程序。如果你想对列表使用符号方法,那么你应该用对象来建模。拥有EmptyList
类和Cons
类(Cons
将有element
和list
研究所VAR),让你做创建列表:
listWithOne := Cons element: 1 list: EmptyList new.
的head
和tail
方法可以平凡写在Cons
类通过返回inst var值。您还可以在EmptyList
类中定义head
和tail
方法,以便现在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)).
HTH
所以我将它初始化为'block:= [:i:j | 0]'。然后'setRow:column:value: | arr尾巴头| \t arr:= Array new:3。 \t arr at:1 put:i。 arr at:2 put:j。 arr at:3 put:val。 \t tail:= block。 \t head:= [:r:c | ARR。 \t \t((R =(改编于:1))和:(C =(ARR在:2))) \t \t ifTrue:[(ARR于:3)] \t \t ifFalse:[尾巴] \t \t]。 \t block:= head。' 这是一个好办法吗?你提到过不使用数组......我该如何做这样的事情?感谢您的帮助。 – 2013-04-10 22:04:33
初始化是正确的。如果你问第一个块的任何行或列,它将回答为零。现在,假设你只有一个单独的块,它会回答例如如果行是3并且列5,则为42。对于任何其他行或列,它将改为评估第一个块。这很容易写下来,并将在一个地方模拟一个全零和一个单独的矩阵。现在,如果您创建第三个区块来回答例如69如果行是5,列是3,否则它评估第二个块,你将得到一个有2个非零值的矩阵。看到?没有阵列参与。 – 2013-04-11 07:17:50
好的,我把它写成这样,一切似乎工作。还有一个问题......如果我想编写一些方法来将所有存储在矩阵中的值加上/乘以一些标量,那么最好的方法是什么?我应该使用某种形式的注射:?谢谢。 – 2013-04-11 11:21:23