Carpをチョット触る
Lisp方言の一つであるCarpをちょっと触ってみた。 github.com
関係ないけど、ClispとかClaspとか最近Cで始まってpで終わる処理系を見ることが多くて、一瞬区別がつかない。
インストール
Ubuntu 18.04にインストールした。
Carpの処理系自体はHaskellで書かれているようなので、stackをインストールする。
apt install haskell-stack stack upgrade
v0.3.0をローカルにインストールする。
mkdir $HOME/.local/share cd $HOME/.local/share git clone https://github.com/carp-lang/Carp cd Carp git checkout v0.3.0 stack build stack install
環境変数を設定する。
export CARP_DIR=$HOME/.local/share/Carp
CARP_DIRが設定されないままcarpを実行するとエラーになる。
carp: EvalException I can't find a file named: './/core/Core.carp'
実行
実行する。
carp
Welcome to Carp 0.3.0 This is free software with ABSOLUTELY NO WARRANTY. Evaluate (help) for more information. >
REPLが起動した。
(quit)
REPLが終了した。
(help)
でヘルプが表示される。
hello world
伝統と格式のhello world
(use IO) (defn main [] (println "Hello, World!"))
コマンドライン引数に -x
をつけると、main関数が呼ばれる。
carp -x hello-world.carp
Hello, World!
生成されるコード本体を一部抜粋
int main(int argc, char** argv) { carp_init_globals(argc, argv); static String _4 = "Hello, World!"; String *_4_ref = &_4; IO_println(_4_ref); }
数値を表示してみる。
(use IO) (use Int) (defn main [] (IO.println &(Int.str 1)))
carp -x print-1.carp
1
(Int.str 1)
ではなく &(Int.str 1)
なのがポイントで、何故ならprintlnの引数が &String
だけどstrの返り値は String
だから。
そうなのか。。。