Perl AdventCalendar 2017 5日目の記事です
ElixirとPerlのrequire,useが見た目の動作がほぼ同じだなーという小ネタ
| Perl | Elixir | |
|---|---|---|
| require | 読込+評価 | コンパイル+読込+評価 |
| use |
require+import関数実行 |
require+__using__/1マクロ実行 |
useの使い方がすんなり頭に入ってきます。レガシー!と言われるPerlなのに新しい言語で同じような記法を見つけるとなんだか嬉しいやら感慨深いやら不思議な気持ちになりました。
話はこれだけなのですが、小ネタすぎるのでuseに絡めて、import/exportネタでも。
(以下完全にElixirネタ)
importディレクティブ
Elixirにはimportディレクティブというのがありまして、指定モジュールのpublic関数にアクセスできるようになります。
importは名前どおり、Perl定番のExporterとは真逆のものです。
Exporterはライブラリ側が何をexportするのかを指定していましたが、importはライブラリを読み込む側が使うものになります。
defmodule Main do
import MyModule
IO.puts module_name() # 表示はMyModule。Mainではない。関数に「アクセス」できるだけ
end
defmodule MyModule do
def moduel_name do
__MODULE__
end
end
Elixirでexport
Elixirのexportは__using__/1マクロ内でimportディレクティブを呼ぶことで実現できます。
defmacro __using__(_opt) do
import MyModule only: [...]
end
これで use MyModule とするだけでライブラリ作者側がonlyに指定した関数だけがimportされます。
ただPerlのuseのように use MyModule () のように利用側でimoprtを抑制したいですし、そうなるとマクロの引数を解析する処理が必要になります。
で、これを毎回書くのが、ライブラリ作る側としてはしんどい、、
というわけで作りました。
Elixirのお作法的にどうなのかは不明ですが、個人的にはとても楽になりました。
明日は
songmuさんの「えるしっているか」です。
タイトル通り、あれの話でしょうか。