流浪のFactor入門第7回。本日は、"fried quotation" についてです。

Fried quotationとは何か? ドキュメントをみてみましょう。

The fry vocabulary implements fried quotation. Conceptually, fried quotations are quotations with "holes" (more formally, fry specifiers), and the holes are filled in when the fried quotation is pushed on the stack.

fried quotationとは「穴」があいているquotationで、スタックにpushされたときに、その穴が埋められるものをいいます。fried quotationは " '["からはじまります。「穴」は"_"または"@"です。実例をみてみましょうか。

( scratchpad ) 4 '[ _ 1 + ]
--- Data stack:
[ 4 1 + ]
( scratchpad ) 30 15 '[ _ _ mod ]
--- Data stack:
[ 4 1 + ]
[ 30 15 mod ]

"_"がスタック上の値で穴うめされているのが分かります。

( scratchpad ) 2 [ sq ] '[ @ . ] call
4

"@"は、"_ call"のsyntax sugarだそうです。上の例では、[ sq ] call になっているわけですね。

fried quotationはcurryとかcomposeより便利な手段、だそうなので、本来は先にcurryとかcomposeをみるべきなのかもしれません。次回の宿題です。

さて、前回たどたどしいFizzBuzzをかきましたが、fried quotationで書き直してみます。

IN: fizzbuzz
USING: kernel io math math.parser prettyprint sequences fry ;
: modN? ( x n -- ? ) mod 0 = ;
: fb ( x n str -- x/str ) pick number?
[ '[ _ dup _ modN? [ drop _ ] when ] call ]
[ 2drop ]
if ;
: pp ( x/str -- ) dup number? [ number>string ] when print ;
100 [ 1 + 15 "FizzBuzz" fb 3 "Fizz" fb 5 "Buzz" fb pp ] each

fried quotationを濫用しすぎな気がしますが( "'[ _ _ _ 2drop ]"とか酷いな)、これ便利だな。

(2009.3.24 9:59) 無意味なfried quotationがあったので直しました