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 だから。 そうなのか。。。