genSeq
を渡す引数は、呼び出す前に評価されます。
NB。 PythonやJavascriptなどの言語とは異なり、括弧はメソッドを呼び出すために使用されず、代わりにメソッドにメッセージを送信するために使用されます。したがって、gen
とgen()
は同じです。なぜなら、Ioメソッドは常に使用されているからです。メソッドを呼び出すことなく、getSlot
NBを使用してアクセスできます。 Hacker Newsにコメントするには、このリンクを助けるかもしれない:
genSeq := method (gen,
len := Random value(100) floor
0 to(len) map(i, gen call) // <= gen call ie. call the block
)
genString := method (
genSeq(block(genChar)) join // <= wrapped in a block()
)
別の方法としては、渡すことです:http://news.ycombinator.com/item?id=1539431
一つの解決策は、代わりにblock()
(匿名関数)を通過し、その後、genSeq
の中からそれを呼び出すことですシーケンス(文字列)と実行perform
その上:怠惰な引数を評価するために
genSeq := method (gen,
len := Random value(100) floor
0 to(len) map(i, perform(gen)) // run string as method
)
genString := method (
genSeq("genChar") join // method name is a sequence
)
そして、もう一つの選択肢は次のとおりです。
genSeq := method ( // no defined parameters. Lazy time!
len := Random value(100) floor
0 to(len) map(i, call evalArgAt(0)) // <= arg is evaluated here!
)
genString := method (
genSeq(genChar) join
)
ところで...制御文字を避けるために、私はまた、(Random
オブジェクトのためのドキュメントを見つけることができませんでしたが、以下のランダムな推測であり、それは働いた!)、この変更を行いました。
genChar := method(
Random value(33, 128) floor asCharacter
)
素晴らしい詳細説明。はい、すべてをブロックに変更するとバグが修正されました。また、ブロックはforAllメソッドに必要です。これはジェネレータのリストを受け取り、関数のテスト値を作成するために複数回コールします。 – mcandre