簡體   English   中英

在smalltalk中的懶惰列表s表達矩陣

[英]Lazy list s-expression matrix in smalltalk

所以我有一個名為LazyMatrix的smalltalk創建的類。 該類只有1個實例變量,不能是除Object之外的任何子類。 LazyMatrix的實例變量稱為塊,必須是后面的。 我像這樣初始化LazyMatrix:

initialize
block:=[nil]

將有一種設置值的方法

setRow:column:value:

此方法將通過將新塊設置為[#(ij value)。[nil]]來重新定義塊。 每個后續調用都會向塊中添加一個3的數組,因此它會像[#(ij value)。[#(ij value)。[nil]]]那樣擴展,就像s表達式或“惰性列表”一樣。

所以我需要訪問這個塊的頭部(即[#(ij value))以及這個bock的尾部(即[#(ij value)。[nil]])。 我怎么用smalltalk做這個? 我知道塊上的調用值將返回尾部...現在我需要返回頭部。

向您的塊添加數組不會讓您隨時隨地。 考慮行為而不是數據結構

我想你的老師確實為你提供了整體想法:給出一行和一列,回答相關的值; 否則請問“尾巴”的答案。

簡直是你將如何使用塊封閉(這里的“尾巴”是預先設定的塊)實現它在Smalltalk。 在塊內部,放置執行測試和回答以及尾遞歸的代碼。 不要使數據結構,尾部和頭部只是隱喻這種編碼風格的原因。

我剛剛在Squeak中實現了你的LazyMatrix,它只是幾行代碼。 可愛的例子,確實。 根本沒有涉及陣列或集合。

提示:這個難題的關鍵是要意識到每次調用setRow:column:value:都可以創建一個新塊,它獨立於之前創建的所有塊。

我想你可以在這里用兩種方式。 第一個(我不推薦)是將你的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值,就可以在Cons類中簡單地編寫headtail方法。 您還可以在EmptyList類中定義headtail方法,以便現在EmptyListCons是多態的。

補充 :好的,只是為了好玩,一個使用塊和數組的實現,功能樣式:

| 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM