Part24:QuoteとUnquote

希「ほな今回はマクロ・・・そのものの前に、ここまでで見てきたようなElixirの構文が、内部的にはどんな形式になっているか見てみようか」
海未「内部的には・・・というと」
希「Elixirの文法は人間が理解しやすいように作られてるけど、そのままコンピュータが理解して実行してるわけじゃないんよ」

希「簡単な例を挙げていくから、それで感覚をつかめばええと思う」

希「これの実行結果は」

希「quoteを使うとElixirの式の内部表現が得られるんや。これをquoted expressionっていう」
海未「coupling("こと", "うみ")が、内部では{:coupling, [], ["こと", "うみ"]}になっていると・・・」
希「そんなところやね」
凛「よくわからないにゃ~」
希「大丈夫や。今回はウチもかなり怪しい」
海未「え・・・」
希「Elixirの最小構成要素は3要素のタプルや。順に関数名、メタデータ、引数が入ってる」
海未「関数名と引数は分かります。メタデータというのはなんでしょうか」
希「さっきの例だと空やけど、例えば」

希「ってやると」

希「このcontext: Elixirがよくわからんのやけど、ErlangのVM上で動く言語の1つやから、言語の指定じゃないか、って情報は見かけたな」
凛「やっぱり難しいにゃ~」
希「import: Kernelは、<>がKernelモジュールの関数だからや」
海未「コードを書くときはモジュール名は省略していますが、ここでは明示されるのですね」

希「どんな式でもquoteで内部表現を確認できる。マップを見ると・・・」

希「これは関数呼び出しと同じ形やね」

希「ちなみに、や。quoteを使っても、元のまま出力される型が5つある」

  • アトム
  • 数値
  • リスト
  • 文字列
  • 2要素のタプル

凛「これ以上分解できなそうなのっぽいけど、2要素のタプルって何?」
希「それ、謎なんよなあ」

希「確かにこうなるんやけど・・・理由までは調べがつかんかったわ」
海未「とりあえずは、そういうものだと思っておきましょうか」
希「誰か知ってたら教えてや♡」
凛「希ちゃん、誰に言ってるにゃ?」

希「1文の中で関数が複数使われたりしとっても、形は変わらん」

希「引数の中が入れ子になってるだけで、全体の形は同じや」

希「逆変換もいける。Macro.to_stringや」

希「今度はこれに変数を使う」

希「・・・なんやけど。このnameの値を展開してほしいこともあるわけや」
海未「これだと、nameは変数の内部表現の形になっているのですね」
希「そこでunquoteや」

希「これで狙い通りやね」

希「ところが、や」

希「リストの途中にリストを流し込もうとすると、なんか惜しい感じになる」
凛「こうなる理屈はわかるけど、これじゃないにゃ~」
希「こういう場合に備えてunquote_splicingってのがあるんや」

希「これでリストは大丈夫やね」

希「上の方でマップの例を出したやん?あれに変数使うと、また話がややこしくなるんよ」

海未「unquoteするとquoted expressionではなく値そのものが出てきてしまうのですね」
希「このパターンにはMacro.escapeや」

希「マップ以外にもこうなるのがあるっぽい。まったく、ややこしいなあ」

希「これで何が嬉しいかというと、コードをデータとしてプログラムで扱えるようになるってことや」
凛「プログラムでプログラムを書くってこと?」
希「そんなとこやね。実際のマクロの定義は次回以降で見ていこうか」
海未「私の番ですが・・・大丈夫でしょうか」
凛「海未ちゃんがだめだったらみんなだめにゃ~」
希「あ・の・ね・が・ん・ば・れ!」
海未「・・・はい。頑張ります」


LINEで送る
Pocket


返信を残す

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