読者です 読者をやめる 読者になる 読者になる

レガシーコード生産ガイド

私に教えられることなら

自作FORTHでカカシ班を呼ぶ(DOER / MAKE)

forth

最近はThinking Forthを寝る前に読みつつ、たまにjf64に手を加えたりしてる。

毎日5分ぐらい読んではそのまま寝たりしながらも一応終盤まで目を通してて、ちょっと面白そうだったDOERMAKE実装してみた。自作処理系の命名規則を使ってdoer>make>にした。

イカの例の様に、doer>で宣言したワードの実行内容をmake>によって切り替えることができる。

doer> tako  ( 宣言 )
tako        ( 宣言しただけでは何も実行しない )

( takoの内容を、ika!と出力するコードに書き換えるワード ika を作る )
: ika  make> tako  ." ika!" cr ;

ika  ( 書き換える )
tako ( => ika!と表示。乗っ取られてしまった!  )

make>以降のワードを実行するので、次々にワードの内容を切り替える変なワードを作ることもできる。

doer> ニンジャ
: 参上!  ニンジャ space ." 参上!" cr ;

: うずまきナルト
   make> ニンジャ  ." うずまきナルト" ( 1回目はここ以降 )
   make> ニンジャ  ." うちはサスケ"   ( 2回目はここ以降 )
   make> ニンジャ  ." はるのサクラ"   ( 3回目はここ以降が実行される。 )
   tail-recur ( 4回目で最初に戻る。1度の実行で延々とループすることは無い ) ;

うずまきナルト 参上!   ( => うずまきナルト 参上! )
参上!                  ( => うちはサスケ 参上!   )
参上!                  ( => はるのサクラ 参上!   )
参上!                  ( => うずまきナルト 参上! )

ワードニンジャが実行される度に内容が書き換わっている。

まあ、例えばCommon Lispなら関数をsetfしてfuncall、で終わる話なんだけど、かなりローレベルなやり方と短いコードでできるのが面白いなと思った。こういうことは高度に抽象化された言語/処理系じゃないとできない、みたいな変な思い込みがあったんだけど、Thinking Forthがだいぶん解きほぐしてくれた感覚がある。(それと同時に何かぁゃιぃ思想を植え付けられ始めてる気もする。)

広告を非表示にする