(bind-variables ((a 1)
            (b)
            c
            e
            (d (+ a 3)))
           (list a b c d e))
;; -> (1 #f #f 4 #f)
で、自分なりに書いてはみたものの・・・。かなり苦戦しました。
しかも複雑になってしまって、何が何やら。動いてはいるっぽいものの、これじゃーちょっと・・・。それに何よりダサい。
お手本はこちら。うーん、だいぶスッキリしていますね。「...」だと、こうは書けないですよね。。場合によってはドット対表現で書いた方がスッキリするんですね。
R5RS においては、 syntax-rules のパターン部にドット対を用いた表現が許されますが、テンプレート部をドット対で組み立てるのは未定義だとされています。
返信削除なので、なるべく ... (ellipsis) を使った表現が好ましいと思います。
とは言うものの、 R6RS では問題なく使えますし、 R5RS を名乗る処理系の中でテンプレート部にドット対表現が使えないものを見付けられないので実質的には問題にならないでしょうけど。
いつも教えて頂いてありがとうございます!
返信削除勉強になります。
>R5RS においては、 syntax-rules のパターン部にドット対を用いた表現が許されますが、テンプレート部をドット対で組み立てるのは未定義だとされています。
えー!そうなんですか・・・。また微妙な・・・。
やっぱり、R5RSを読まないとダメですね。。「いつか実装する時でいいや。」と思っていましたが、そうもいかないですね^^;
「テンプレート部に」というよりは「Scheme の式に」と言った方が正確でした。
返信削除例えば (display . ('a)) とすれば普通に a を表示します。 しかし、 R5RS にある手続き呼出しの構文は ( ...) という形式だけです。 ( . ( ...)) と言う形式で手続きが呼出せる根拠がないのです。
R6RS でこれが問題なくなるのは、 Scheme のプログラムがS式である旨が明記されたからです。 S式としては書き方がどっちであっても同じと見做せるので問題ありません。
逆に言えば R5RS では Scheme のプログラムはS式でないことになります。 (少くとも明記されてはいません。) これは結構衝撃的な話です。
CommonLisp 派が「Scheme は Lisp ではない」と主張する根拠のひとつとして挙げていたのでそれなりに有名な話ではあるのですが、 R5RS だけをよほどきちんと読んでも気付ける人はかなり少ないんじゃないかと思います。
あれ、コメント中に山括弧使ったら消えちゃった。
返信削除ふたつ目の段落だけ再度書きます。
例えば (display . ('a)) とすれば普通に a を表示します。 しかし、 R5RS にある手続き呼出しの構文は ( 演算子 オペランド ...) という形式だけです。 ( 演算子 . (オペランド ...)) と言う形式で手続きが呼出せる根拠がないのです。
>逆に言えば R5RS では Scheme のプログラムはS式でないことになります。 (少くとも明記されてはいません。) これは結構衝撃的な話です。
返信削除めちゃくちゃ衝撃的な話ですねそれ!(笑)