脈略のないメモです。
fib
フィボナッチ数列を求める Word がこんなにシンプルに書けるなんて素敵だなぁ。
: fib ( n -- n ) 1 - 0 1 rot [ dup rot + ] times nip ;
rot は、3番目の値を TOS (Top Of Stack) に持ってくる。
IN: scratchpad 1 2 3 --- Data stack: 1 2 3 IN: scratchpad rot --- Data stack: 2 3 1
dup は TOS の値をコピーして積む。
IN: scratchpad 1 dup --- Data stack: 1 1
times は TOS にある整数を「回数」と解釈してクォーテーションを実行する。
IN: scratchpad 0 3 [ 10 + ] times . 30
nip は2番目の値を削除。
IN: scratchpad 1 100 1000 nip --- Data stack: 1 1000
bar
標準 FORTH っていう今は絶版になってる本を図書館で借りて読んだことがあった。
この本に載ってる bar という Word を Factor で書いてみる。
bar は
*
を繰り返し印字するんだけど、コンソールの横幅は限られてるから、リミットを設ける(下のコードの場合、ブログの関係上 30)。: bar ( n -- ) 30 min [ "*" write ] times "\n" write ; IN: scratchpad { 40 30 10 1 5 10 15 } [ bar ] each ****************************** ****************************** ********** * ***** ********** ***************
each は、Perl 風に言えばそのまま foreach my $var (@array) { ... }
だね。
でもこれは高階関数だから、Common Lisp で言えば (mapc #'fn lis)
に近いかな(副作用が主な目的で、元のリストから新しいリストを作ったりはしない)。
io
ファイルに何か書きだそうと思ったら、Web で拾ったサンプルがなんか上手く行かなくて、いろいろ試してたら下の書き方は実行できたのでメモしておきます。
IN: scratchpad USE: io.encodings.utf8 IN: scratchpad "hello.txt" utf8 [ 8 [ "hello Factor." print ] times ] with-file-writer
エンコードの指定のところがミソかと。
Factor 勉強中メモは別サイトにまとめている。
basicwerk.com/memoize/