Posted at
PerlDay 5

ElixirとPerl(のuse)

More than 1 year has passed since last update.

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さんの「えるしっているか」です。

タイトル通り、あれの話でしょうか。