R6RS Macro Exercise

自分がいままでに書いた記事を読み返してみると、フォローが足りないと思えるものが少なからずある。 本質的なことを示すためにあえて省略したものもあるが、単に手抜かりなこともある。

あらためて説明するよりも、折角だから読者への宿題にするのも面白いかと思い至った。

第一問

以下の記事についての設問。

http://saito.hatenablog.jp/entry/2012/09/14/010849

ここで定義されているふたつのマクロ bound? と if-bound は与えられた識別子が定義済みかどうかによって分岐するものであるが、あるひとつの識別子に対してだけは誤った判定をする。 その識別子とは何か。

余力があれば正しい判定をするように修正せよ。

第二問

以下の記事についての設問。

http://saito.hatenablog.jp/entry/20110629/1309355746

ここで定義されているマクロ define-optionals はオプショナル引数を持つ手続を定義するものであり、不足する引数をマクロ展開時に補うのが特徴である。 但し、 define-optionals で定義した手続はマクロでラッピングされているため高階手続きに渡すことが出来ない。 高階手続きに渡すことが出来るように識別子マクロを用いて修正せよ。

もちろん、高階手続きに渡す場合は不足する引数は実行時に補う形にすること。 また、以下の記事中にある let-optionals を用いてよい。

http://saito.hatenablog.jp/entry/20110310/1299765814

第三問

以下の記事についての設問。

http://saito.hatenablog.jp/entry/20100822/1282449327

ここで定義されているマクロ define-identifier-parameter を用いるとあたかも変数のように振舞うパラメタを定義することが出来る。 (それを識別子パラメタと呼ぶことにする。) 一方で、識別子パラメタはパラメタを扱うための語彙 (例えば parameterize) と組み合わせることが出来ない。 識別子パラメタをパラメタに変換するマクロ identifier-parameter->parameter を定義せよ。

必要であれば define-identifier-parameter の定義に手を加えてもよい。

動作例として以下を挙げる。

(define-identifier-parameter v 1)

(parameterize (((identifier-parameter->parameter ip) 2))
  (display ip)) ;; 2 が表示される

第四問

以下の記事についての設問。

http://saito.hatenablog.jp/entry/20100418/1271563508

ここでは srfi-17 相当を定義している。 set! が使われたときにゲッタに対応するセッタが呼出されるわけだが、登録したゲッタがある条件を満したときに規格上未定義の振舞いとなる。 その条件とは何か。

具体例をひとつ挙げる形でこたえてもよい。