Skip to content
2010/08/15 / highmt

forthでdeferを書いてみる

http://www.complang.tuwien.ac.at/forth/gforth/Docs-html/Defining-Words-Tutorial.html

Assignment: Define defer ( "name" -- ), which creates a word that stores an XT (at the start the XT of abort), and upon execution executes the XT. Define is ( xt "name" -- ) that stores xt into name, a word defined with defer. Indirect recursion is one application of defer.

むずかしくなってきた。

まず、deferは、

  • ( “name” – )
  • 初期値は ‘ abort
  • 実行すると XT execute

ということなんで、

: my-defer ( "name" -- )
create ['] abort ,
does> ( -- )
@ execute ;

こうだよね。

次に、isは、

  • ( xt “name” – )
  • deferで定義した"name”にxtを入れる

ということなので、

: my-is ( xt "name" -- )
' >body ! ;

こうだよね。

最後の間接再帰は、相互再帰的な例を書けばいいのかな?
あーなるほど。後方参照はdeferで回避できますよ、という例になっているなのか。

my-defer is-even

: is-odd ( n -- flag )
dup 0 = if drop 0 else
dup 1 = if drop -1 else
1 - is-even
then then ;

: is-even-impl ( n -- flag )
dup 0 = if drop -1 else
dup 1 = if drop 0 else
1 - is-odd
then then ;

' is-even-impl my-is is-even

こうかな?

例なのでマイナス渡すと変なことになるけど、とりあえず相互再帰してるっぽい。

0 is-odd . 0  ok
1 is-odd . -1  ok
10 is-odd . 0  ok
11 is-odd . -1  ok
0 is-even . -1  ok
1 is-even . 0  ok
10 is-even . -1  ok
11 is-even . 0  ok

なんとなく感覚はつかめてきたけど、「’」とか「create」が”name”をどうやって扱ってるのかまだわからないまま。
forthのことだからなんかプリミティブがあるとは思うんだけど、まだたどりつけてない。

広告
%d人のブロガーが「いいね」をつけました。