Daysこの広告は、90日以上更新していないブログに表示しています。3)と同じ結果を返す。Varに関数が束縛されている場合には、Varに束縛されている関数がそのまま適用されるようだ。Varにマクロが束縛されている場合にはどうなるだろう?マクロを展開した結果が返ってくるだろうか。whenマクロで試してみると以下のようになった。c))))user=>結果を見ると、一見うまくいっているように見えるが、どうも最初の2つの引数が無視されているようだ。&envここで、マクロがどのように定義されるのかを見てみる。定義した関数のVarに対してsetMacroを実行する*1ということをやっている。上のwhenの例で無視されていた引数は、1.で追加される&formと&envではないかと推測できる。試しに以下のようなことをしてみた。3)]user=>すべての引数からなるベクタにquoteを付けて返す関数hogeを、setMacroでマクロにする。結果として返ってくる。&env、3つめ以降の要素がマクロに渡された引数ということのようだ。&envの正体は?&formには、名前が表すように、マクロ呼び出しのフォーム全体が渡ってくるようだが、&envの方はいまいちよく分からない。(NO_SOURCE_FILE:29)user=>上のようなエラーになる。hogeの展開結果に、コードに埋め込めないオブジェクトが含まれている、ということらしい。そこで、引数&envに渡ってくる値を単に表示するだけのマクロを定義してみる。#}niluser=>出力結果から、&envにはマクロの呼び出しのフォームを囲む静的環境がMapとして渡ってくるようだ。Mapのキーが、ローカルな束縛の名前を示すシンボルであることは分かるが、値であるLocalBindingについてはよく分からない。思って調べていたら、まさに同じ質問がちょうと昨日されていたのを発見した。LocalBinding自体は今はまだ正式なAPIではないようだが、LocalBindingからは束縛が関数の引数か否かといった情報や、束縛の初期化式等が得られるようになっている。これがマクロを通してユーザから利用できるようになるとすれば、かなり強力な仕組みになるだろう。まとめというわけで、今回はこんなことが分かった。4はてなブログをはじめよう!athosさんは、はてなブログを使っています。ブログを報告する引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。