いきなりメモ:(後日整理するかも?)
erl$ code:get_path().
は
ipython$ sys.path
と多分同じ。モジュールの検索パスが表示される。
[Car|Cdr]
なのだ!
7. car, cdr, cons:基本関数 @ lispを参照のこと。
pythonで、
hoge, piyo = some_sequence
と書くと、some_sequenceが分解される、(hoge, piyo)か、[hoge, piyo]の場合ね。
これをもっと推し進めたようなこと(パターンマッチという)ができて、
erl${X, Y, Z} = {222, def, "cat"}.
{222, def, "cat"}
とかすると、
erl$X.
222
となる。
この機能によって階層を作れる。(Cでの構造体みたいなもの、ただ、名前をつけなくていいし、フィールドに名前も不要。というか名前がついてしまうと、参照透過性の兼ね合いからよくないのだろう。)
コテコテの関数言語であるのは
-module(mylists).
-export([sum/1]).
sum([H|T]) -> H + sum(T);
sum([]) -> 0.
からもよくわかる。
この内容をfileとしてmylists.erlとしてcwdにセーブしたら
erl$ c(mylists).
{ok,mylists}
となり、コンパイルができるはず。んで、
erl$ L = [1, 3, 10].
[1,3,10]
erl$ mylists:sum(L).
14
erl$
とかできる。
myを打ったところで、tabを押すとlists:が補完され、さらにtabを打つとsum(が補完される。erlのシェルがmoduleについて知っているからに他ならない。この辺の使い勝手はipythonと大してかわらない。まあ?はないだろうけど、それに類似した機能拡張はできるか存在する貸しているはず。そのうち探そう。
-module(mylists).
-export([sum/1, map/2]).
sum([H|T]) -> H + sum(T);
sum([]) -> 0.
map(_, []) -> [];
map(F, [H|T]) -> [F(H) | map(F, T)].
二つの関数を1つのファイルに書くとこうなる。exportの構文ダサい気が・・・。
1 件のコメント:
あたりまえだが、すでに作った人がいる。このへん?
コメントを投稿