6

オブジェクトに匿名メッセージを送信することは可能ですか? このような 3 つのオブジェクトを構成したいと考えています (FP と考えてください)。

 " find inner product "
 reduce + (applyToAll * (transpose #(1 2 3) #(4 5 6)))

ここでreduceapplyToAlltransposeはオブジェクトであり+*と の 2 つの配列は、これらのオブジェクトに送信される匿名メッセージに渡される引数です。ブロックを使用して同じことを達成することは可能ですか? (ただし、明示的な使用法はありませんvalue:)。

4

3 に答える 3

5
aRealObject reduceMethod: +; 
            applyToAll: *; 
            transpose: #(#(1 2 3) #(4 5 6));
            evaluate

aRealObject が適切なメソッドを定義している場合に機能します。ブロックが必要な場所はどこですか?

于 2010-11-08T08:35:40.680 に答える
3

あなたが探しているdoesNotUnderstand:reduceが実装されていないオブジェクトであるが、とにかく+送信すると、代わりにそのdoesNotUnderstand:メソッドが呼び出されます。通常、エラーが発生するだけです。ただし、デフォルトをオーバーライドして、セレクターと他の引数にアクセスし、+それらを使用して好きなことを行うことができます。

簡単にするために、クラスを作成しますReduce。クラス側で、メソッドを定義します。

doesNotUnderstand: aMessage
    ^aMessage argument reduce: aMessage selector

次に、次のように使用できます。

Reduce + (#(1 2 3) * #(4 5 6))

予想通り、Squeakワークスペースでは32と答えます。

*適切なセマンティクスを持つコレクションにすでに実装されているため、これは機能します。

ApplyToAllまたは、次のクラス側メソッドを使用してクラスを追加します。

doesNotUnderstand: aMessage
    ^aMessage argument collect: [:e | e reduce: aMessage selector]

SequenceableCollectionまた、このメソッドを:に追加します。

transposed
    ^self first withIndexCollect: [:c :i | self collect: [:r | r at: i]]

その後、あなたは書くことができます

Reduce + (ApplyToAll * #((1 2 3) #(4 5 6)) transposed)

これはあなたの元のアイデアにかなり近いです。

于 2010-11-18T14:07:14.217 に答える