Part25:マクロ

凛「みんなSR凛3枚獲ってくれたかにゃ?」
海未「・・・すみません凛。まさか最後の3時間で12000人に抜かれるとは・・・」
凛「もー、かよちんなんて昼もおにぎり5つしか食べずに石割り続けてたんだよ?」
海未「何をどう突っ込めばいいのですかそれは」
希「ちなみに今日は2015年9月1日や」


海未「気を取り直してマクロについて見てみましょう」
希「ばっちり?」
海未「マクロの定義の仕方でしたら、一応は。ただ実際にどう活用していくかとなると、まだ少し・・・」

海未「マクロというのは、Elixirのコードから別のElixirのコードを生成する仕掛けのことです」
凛「希ちゃんが前回そんなこと言ってたよね」
海未「前回のquoted expressionの話と合わせて、Elixirによるメタプログラミングの基礎となりますから、頑張って習得しましょう」

海未「関数の回で見たnico関数をマクロで実装してみましょう。nicofuncが関数版、nicomacroがマクロ版です」

凛「defdefmacroになっただけだよ?」
海未「はい。マクロは、一見すると関数にとてもよく似ていますから」
凛「ということは、覚えることは何もないにゃ!」
海未「そうはいきません。これを見てください」

凛「にゃ?」
希「これ関数なら普通に動くやつやん?」
海未「はい。関数でしたら、"凛" <> "ちゃん"の評価結果である”凛ちゃん”が引数になりますから。しかし、マクロはここに書かれた式そのものが引数になるのです」

海未「マクロが受け取る引数はこのようになっています」

希「ここでquoted expressionが出てくるんやね」
海未「マクロの中ではnameの値はこのタプルですから、#{name}で文字列化しようとしてエラーになるわけです」
凛「関数よりややこしいにゃ」

海未「これを期待通りに動かすには、前回出てきたquoteunquoteを使います」

凛「おおっ、動いたにゃ!」
海未「このnicomacroは、このようなquoted expressionを返しています」

希「・・・まあ、頑張れば読めるけど・・・unquoteで元に戻したら?」
海未「そうですね、では・・・」

海未「これが、最終的にマクロが生成したコードです。コンパイル時に、元のコードと置き換わります」
凛「何がうれしいかはわからないけど、とりあえず分かった気になったにゃ」
希「コンパイル時に展開されるから性能が・・・みたいな話かな」
海未「状況にもよりますが、性能面では有利になる傾向はあります。あとは、言語自体の拡張ですね」
希「言語の、拡張?」
海未「例えばElixirのifunlessraiseなどは実はマクロです。ifはこんな実装になっています」

海未「こうやって、Elixirはマクロを使って便利なように拡張されているのです」
希「なるほど、便利な構文を自分で作ったりもできるわけやね」

海未「マクロは入力も出力もquoted expressionですから、コードを受け取ってコードを返すという動きをしているのが分かりますね」
凛「それをElixirで書けちゃうんだからすごいにゃ~」

凛「次回はメタプログラミングはそっと脇に置いてOTPとかの話するにゃ」


LINEで送る
Pocket


2件のコメント

  1. Part.26以降が空白のページになるのは、仕様なのでしょうか?

    1. いえ、WordPressのバージョンアップの過程か使用しているプラグインの関係か、Elixirの連載が全滅してました。空き時間を見て順次修正している途中なのでお待ちください。

返信を残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です