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さんの「えるしっているか」です。
タイトル通り、あれの話でしょうか。