Clojure Advent Calendar 2021 12/11 (土) です☆ 12/10 (金) は id:kbaba1001 さんのClojureで仕事をはじめて1年経った - さめたコーヒーでした♪
Clojerl は Erlang VM で動く Clojure です。Erlang/OTP や Erlang library の函數を Clojure の函數であるかの樣に呼べるのが特徴です。Clojure の library は、ClojureScript に於けると同じく reader conditionals を書けば使へます。
Clojerl の、實行中の動きを覗きませう。REPL を起動します。
rebar3 clojerl repl
Clojerl を使ふ時は OTP application として追加します。*.app.src
に書く { application, […, { applications, […, clojerl]}, …]}.
の奴です。なので clojerl
と云ふ名の OTP application が動いてゐる筈です。
Erlang/OTP に備はる observer (Erlang -- Observer) で樣子を見ませう。
(observer/start)
Clojerl の supervisor tree が見られます。便利ですね。
clojerl_sup
と云ふ supervisor が有ります。この下に六つの gen_server が立ってゐます。これを參考に source code を見ます。
src/clojerl.app.src
に依れば、Clojerl application を 起動すると clojerl_app:start().
が呼ばれます。src/erl/clojerl_app.erl
です。ここで clojerl_sup:start_link()
を呼び起動を待ち、VM の動作 option を設定し、clje.user
と clojure.core
の namespace を作ります。
clojure_sup
は src/erl/clojerl_sup.erl
の supervisor です。supervisor が管理するのは以下の六つの gen_server を起動します。引數は有りません。
- clojerl.Namespace
- clj_module
- clj_cache
- clojerl.Agent.Server
- clojerl.Atom
- clojerl.Delay
clojerl.Namespace
gen_server は Clojerl の namespace を管理する ETS (Erlang term storage) table を管理します。以下の三種類の ETS が作られます。
- clojerl.Namespace
- mappings
- aliases
clojerl.Namespace
table はただ一つ。REPL を起動した時點では以下の五行が登錄されてゐます。
mappings
table と aliases
table は namespace 毎に作られます ('clojerl.Namespace':load_ns(Name, Module)
)。Clojerl から namespace を作ったり參照する時はこの gen_server と通信する事に成ります。
clj_module
gen_server は compiler 用の gen_server で、compile が濟んでしまへば (本番環境では起動前に濟んでしまってゐます) 關係無い、と私は思ひ込んでゐます、多分さうだと思ひますがだうだらう???
clj_cache
gen_server は Clojerl が内部で使ふ cache を ETS として管理します。
clojerl.Agent.Server
gen_server は Clojure の agent (Clojure - Agents and Asynchronous Actions) の狀態を ETS で管理します。
clojerl.Atom
gen_server は Clojure の atom (Clojure - Atoms) を ETS で管理します。
clojerl.Delay
gen_server は Clojure の delay (delay - clojure.core | ClojureDocs - Community-Powered Clojure Documentation and Examples) を ETS で管理します。delay 以外の future (cljerl.Future
) 等は clojerl
application の supervisor tree には連ならず、user の application の supervisor tree で動きます。
以上が Clojerl の實行時の靜的な樣子でした。動的な樣子は宿題とします。
12/12 (日) は hden さんです♪