Interlispにはdefineqと言う特殊形式がありました。これはグローバル環境で一気に関数を複数定義出来る機能です。Common Lispで言うとlabelsの大域関数版、Schemeで言うとletrecのグローバル手続き版、って言ったところでしょうか。
Scheme(R5RS)でのdefineqの定義は以下の通り、です。
まあ、シンプルで大したマクロじゃないですね。取り立てて役に立ちそうには見えないですし。
何に使うか、みたいなのは次回で。
ちなみに、SchemeのR5RSマクロでの大域環境での何らかのセッティングは、複数のテンプレを一気に変換先として設定しても上手く反映出来ません。と言うかまさしく引っかかるのは複数のdefineなんですけどね。
唯一defineを、クロージャ関係無しに囲めるのはbeginだけ、なんで、それこそお約束通りに「逐次実行」のbeginで、こう言う場合は包んでしまいましょう。
Scheme(R5RS)でのdefineqの定義は以下の通り、です。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(define-syntax defineq | |
(syntax-rules () | |
((_ (var e) ...) | |
(begin (define var e) ...)))) |
何に使うか、みたいなのは次回で。
ちなみに、SchemeのR5RSマクロでの大域環境での何らかのセッティングは、複数のテンプレを一気に変換先として設定しても上手く反映出来ません。と言うかまさしく引っかかるのは複数のdefineなんですけどね。
唯一defineを、クロージャ関係無しに囲めるのはbeginだけ、なんで、それこそお約束通りに「逐次実行」のbeginで、こう言う場合は包んでしまいましょう。