帆も櫂もないFactor入門第6回。前回深みにはまったparsing wordsのことはひとまず忘れます。

ここまで、対話環境であるlistenerで遊んでいるだけだったのですが、ここで簡単なスクリプトを書いてみました。題材はどう書く? orgから17歳教。生年月日を入力すると、17歳とXヶ月X日と表示するスクリプトです。

エラー処理皆無。"Factorらしい"書き方とか全然できていなさそうですが。

USING: kernel math.parser calendar math io ;
IN: age17code
: duration>monthsInInteger ( duration -- x ) duration>months >integer ;
: getDaysPart ( duration -- x ) dup duration>monthsInInteger months time- duration>days >integer ;
: whenAge17 ( timestamp -- timepstamp ) 17 years time+ ;
: age17duration ( timestamp -- duration ) whenAge17 now swap time- ;
: age17and ( timestamp -- months days ) age17duration dup duration>monthsInInteger swap getDaysPart ;
"生まれた年は? (西暦で): " write flush
readln string>number
"生まれた月は?: " write flush
readln string>number
"生まれた日は?: " write flush
readln string>number
<date> age17and
! stack: months days
swap number>string
"あなたは17歳と" write write "ヶ月" write
number>string write "日です" print

書いてみての発見。

  • 対話環境だと読み込まれているvocaburaryでもスクリプトには宣言しないとダメ。USING: kernel ;も必要なのか!
  • word定義するときには、IN:しておかないとダメ。へー。
  • write/printは、flushしとかないと実行途中では出てこない。
  • 時間の加算は+じゃなくてtime+