1

そのため、LazyMatrix という名前の smalltalk で作成するクラスがあります。このクラスにはインスタンス変数が 1 つしかなく、Object 以外のサブクラスになることはできません。LazyMatrix のインスタンス変数はブロックと呼ばれ、バックでなければなりません。LazyMatrix を次のように初期化します。

initialize
block:=[nil]

値を設定する方法があります

setRow:column:value:

このメソッドは、新しいブロックを [#(ij value).[nil]] として設定することにより、ブロックを再定義します。後続の各呼び出しでは、ブロックに 3 の配列が追加されるため、[#(ij 値).[#(ij 値).[nil]]] のように展開され、s 式または「遅延リスト」によく似ています。

したがって、このブロックの先頭 (つまり [#(ij value) ) とこのブロックの末尾 (つまり [#(ij value).[nil]] ) にアクセスする必要があります。これを smalltalk で行うにはどうすればよいですか? ブロックで value を呼び出すと末尾が返されることはわかっています...今度は先頭を返す必要があります。

4

2 に答える 2

4

ブロックに配列を追加しても、どこにも行きません。データ構造ではなく、動作の観点から考えてください。

行と列が与えられたら、関連する値に答えてください。それ以外の場合は、「尻尾」に答えを求めます。

これは文字通り、ブロック クロージャを使用して Smalltalk で実装する方法です (「テール」は以前に設定されたブロックです)。ブロック内に、テストと応答、および末尾再帰を行うコードを配置します。データ構造を作成しないでください。テールとヘッドは、このスタイルのコーディングについて推論するための単なるメタファーです。

あなたの LazyMatrix を Squeak に実装しました。これはほんの数行のコードです。確かに、かわいい例です。また、配列やコレクションはまったく関係ありません。

ヒント:このパズルの鍵は、setRow:column:value: を呼び出すたびに、以前に作成されたすべてのブロックから独立した新しいブロックを作成できることを理解することです。

于 2013-04-10T17:16:54.710 に答える
0

ここでは2つの方法で行くことができると思います。最初のもの (これはお勧めしません) は、s 式をラムダ計算のリストとしてモデル化することです。基本的にブロックを関数として使用すれば完了です。ここでは、ラムダ計算を使用してリストを作成する方法について説明します。例として、Smalltalk では次のように記述します。

empty = λfx.x

なので

empty := [:f :x | x].

さて、その道を進むことは、基本的にオブジェクト指向言語で関数型プログラムを書くことになりますが、私はそうしません。リストにシンボリックなアプローチを使用したい場合は、オブジェクトでモデル化する必要があります。次のようにしてリストを作成できるように、EmptyListクラスとConsクラス (Consとinst var があります) を用意しますelementlist

listWithOne := Cons element: 1 list: EmptyList new.

inst var 値を返すだけで、メソッドとメソッドを簡単にクラスにhead記述tailできます。クラスでとメソッドをCons定義することもできるので、とは多態的です。headtailEmptyListEmptyListCons

追加: わかりました、楽しみのために、ブロックと配列を使用する実装、関数型スタイル:

| 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

于 2013-04-09T13:33:20.597 に答える