calendar四日目の記事らしいです。他のカレンダー参加者のレベルが高すぎて困りました。処理系は多分cltl1以降に準拠なら大丈夫だと思います。普段lispを書いているとlispは使う記号の種類が他の言語よりも少なくルールも少なく、演算子の結合則とか、使わなければいけない括弧のバリエーションも少なくて、なんてとっつきの良い言語なのだろうかと思っています。意味不明な'$'とかどう結合するのか良くわからない'.'とかセパレータとしてはスペースがあれば事足りるはずなのに一々書かなくてはならない','とかと縁なくて良かったなーなどと思って日々の生活はしているのですが、マクロを書く時の簡易の為の'`'と','が、マクロを書く時に考える事の特殊性とあいまって、他所からみて慣れないと混乱する記号の利用なのかな...と思ったので難読っぽいマクロにを題材に少しだけ。単純なバッククォートの利用バッククォート('`')は式中で評価される場所と評価されない場所を決めるのに使います。7)カンマのバリエーションに',@'というものもあります。これは、','と動作は似ていますが、',@'直後のリストを外側のリストの要素として展開する部分が異なります。4)','に比べて括弧がひとつ取れます。バッククォートのネストバッククォート一つの際はともかくネストしたものは少し複雑です。,@S)私は順に以下のように覚えています。カンマ無しは展開しない、カンマ一個は後で展開(展開形の中で展開されるように)する、カンマ二個は展開して後でも展開する。後で展開するspliceもするカンマ二個ただし'qの評価カンマ二個なので評価する、左の,と'は打ち消しあうカンマ二個に'がついている。使いでがあるのがマクロの記述の時です。Lispのマクロは単純に評価されるべき式を返す関数として定義します。「引数をどこに埋めれば良いんだっけ?」というくらいの事です。一歩先へネストしたバッククォートを含む歯応えのあるマクロもみてみましょう。Lisp'でも出てくる(同種の物はAlexandriaにも収録Quickutilから利用可能)、once-onlyです。,@body)))))ぱっと見の破壊力は増しました。これが簡単にわかる人はここでおしまい。脅しに使われるこのマクロも別に難しいってほどでも無いはず...なので読んで(考えて)みます。once-onlyのつかいみち望まれない変数補足を避ける際に使用します。i)を2*-once-onlyは一回2*では二回評価されることでマクロの評価結果が変わってしまいます。once-onlyは何に展開されるのか。once-onlyの目的はマクロに渡されるシンボルの評価を一回だけし、結果の値にgensymされたシンボルを束縛する'式'を生成することです。これが具体的に何なのかは展開形をmacroexpand-1で生成してみれば判ります。;;以下body;;シンボルが二つの場合の結果もみてみる。X)))展開形をみると、マクロを普段から書いている人が変数補足を避けるためのイディオムが展開されていることがわかります。展開した結果を生成できる式を書くだけです。逆に変数補足を防ぐイディオムが何故必要なのか?という人にこのマクロを書けというのは無理な話です。ドメインの知識が無いのですから。「何故」を理解してさえいれば、ちょっと複雑なバッククォートをなんとかするだけです。書きたしていく作業になります。これくらいのものになると、一発で書けたりはあまりしないのではないかと思います。マクロとバッククォートが複雑な印象になりがちなのは展開形が脳内で定まっていないバッククォートについて何が生成されるのか良くわからないという両方の症状を抱えたまま考えることが原因ではないかと思っています。複雑だという意見や批判もありますが、replがあるんだからやってみりゃよい、展開形をみてみればそのうちなんとかなるという場合も多いと思います。「マクロ別に難しくないよ!」ということを言おうとして「面倒くさそう」という印象付けに成功したような気がしてなりません。upLoginユーザーは見つかりませんでした。