24974


elixirの勉強中に思った疑問なのですが、マクロについて分からないことがあります。

変数`atoms`と`values`があったとして、その2つを受け取って、その`atoms`のアトムの名前で`values`の値を束縛するマクロを書こうとしたのですが、うまく書くことができませんでした。

マクロで渡されたASTが変数の場合、その変数の値にアクセスして、その値に応じたASTを返すことはできるのでしょうか？

具体的には

[code]

    atoms = [:a, :b, :c]
    values = ["one", "two", "three"]
    assign(atoms, values)
    IO.puts a #=> one
    IO.puts b #=> two
    IO.puts c #=> three
    
[/code]

というコードがうまく動くような`assign`マクロは作れるのでしょうか？

`[:a, :b, :c]`と`[1, 2,
3]`を直接マクロに渡せばマクロにはリテラルがそのまま渡されるのでそれを使えるのですが、`atoms`という変数を渡した場合`atoms`という変数を表すASTが渡されてリストの中身にアクセスできない気がします。

ちなみにあくまでただの疑問なのでどうしてもこのマクロを実装したいわけではなく、可能かどうか、可能であればどのような方法になるのかが知りたいです。


CC BY-SA 3.0
2016-03-11T12:04:37.143
23028
2016-05-18T13:05:49.340
12731
question
elixir
elixirのマクロで渡された変数にアクセスしたい


> マクロで渡されたASTが変数の場合、その変数の値にアクセスして、その値に応じたASTを返すことはできるのでしょうか？

できないと思います。なぜなら、マクロはコンパイル時に評価（＝展開）されますが、変数に値が束縛されるのは、コンパイル後の、コードの実行時だからです。マクロが評価される時には、まだ変数が存在していません。


CC BY-SA 3.0
2016-05-18T13:05:49.340
24974
2016-05-18T13:05:49.340
14101
23028
answer