あなたが探している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)
これはあなたの元のアイデアにかなり近いです。