Gaucheのコンパイル.

Gauche&Schemeで外部ファイルを呼び出す際、loadの評価のタイミングについて注意しなければならない。「Gaucheのloadは実行時に評価される」ので、たとえばアクセスする外部ファイルにマクロが定義されている場合、使い方によってはエラーとなってしまうケースがある。

;; in “foo.scm”
(define-syntax foo
(syntax-rules () ((_ arg) (quote arg))))

;; in your program
(begin (load "foo") (foo (1 2 3)))
⇒ error, bad procedure: ‘1’

(load "foo")
(foo (1 2 3)) ⇒ '(1 2 3)
;; From 「For Gauche 0.9.5」

begin関数を使って、foo.scmをloadしているが、エラーが吐かれている。これは、Gaucheのコンパイラがまずbegin全体をコンパイルしてしまうためである。マクロが有効になるタイミングとして、loadの呼び出しを含むトップレベルフォームが評価された後であることから、begin全体のコンパイルの際にはマクロは評価されておらずにエラーを吐く、という結果となってしまう。

一方で、(load “foo”)を評価した後に(foo (1 2 3))を評価するような形式を取っているので上記の結果にはならない。

ちなみに、このような混乱を避けるためにも、requireuseを使うことが推奨されている。

One clap, two clap, three clap, forty?

By clapping more or less, you can signal to us which stories really stand out.