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を抑制したいですし、そうなるとマクロの引数を解析する処理が必要になります。
で、これを毎回書くのが、ライブラリ作る側としてはしんどい、、
というわけで作りました。

https://github.com/tokubass/ex_exporter

Elixirのお作法的にどうなのかは不明ですが、個人的にはとても楽になりました。

明日は

songmuさんの「えるしっているか」です。
タイトル通り、あれの話でしょうか。