発端
開発中のElxlog処理系で動的にElixirコードのコンパイルをする必要に迫られました。そんなのできたんだっけ?
そういえばfukuoka.exの人たちにCodeというモジュールがあるよ、と教わったことを思い出しました。
動的コンパイル
それはすっごく簡単にできました。
Code.compile_string(str)
strは文字列です。この文字列に動的コンパイルしたい内容を入れておきます。
iex(1)> Code.compile_string("defmodule Foo do def bar(x) do x+1 end end")
[
{Foo,
<<70, 79, 82, 49, 0, 0, 4, 60, 66, 69, 65, 77, 65, 116, 85, 56, 0, 0, 0, 123,
0, 0, 0, 14, 10, 69, 108, 105, 120, 105, 114, 46, 70, 111, 111, 8, 95, 95,
105, 110, 102, 111, 95, 95, 7, 99, 111, ...>>}
]
iex(2)> Foo.bar(2)
3
なんとまあ、お手軽! Lispのevalみたいなことができてしまいます。
他にも
Code.eval_string/3 などいろいろとありました。これはコンパイルはせずに値が欲しい時だけみたいです。
https://hexdocs.pm/elixir/Code.html
Lisp並みに遊べますし、実際に使えます。Elixirにさらに惚れ込みました。