2018年7月17日火曜日

slime-eval

 CommonLispを使うようになってelispをプログラミングする気力がなくなってしまった。
 別にLisp四天王でelispが一番、最弱だから、というわけではなく、CommonLisp——SBCL——のレスポンスが速くてelispを使う気がしなくなってしまったのがひとつ。もうひとつは別プロセスで動くので、Emacsがかたまるということがない。こっちの方が理由としては大きいかもしれない。
 ただ、やはりエンドユーザとのインターフェイスをもっているというのは大きくてなんだかんだと選択肢はelispということになってしまう。
 じゃあバックグランドでCommonLispを動かしてしまえば、いいじゃん。
 S式でやりとりできるだろうし。
 roswellスクリプトをshell-commandで起動して……とか、考えて面倒くさっ、と思ってしまった。もっと簡単にできないものか。

 そもそもEmacsとCommonLispでやりとりしているわけだし。
 ——slimeに何か、あるんじゃね?
 そう思ってつらつらslimeのソースをながめていたら。
 「slime-eval」というものを見つけた。
 slimeを動かして*scratch*で——。

(slime-eval `(cl-user::+ 1 2 3))
6

 おおっ。
 eval自体はSWANK-IO-PACKAGEの中で動いているらしく、packageをフル指定しなければ、ならなかったけれど。
 listだって返ってくる。

(setq wrk (slime-eval `(cl-user::list 1 2 3)))
(1 2 3)
(car wrk)
1

 elispとシームレスにやりとりできるじゃないか!
 しかも非同期バージョンと思しき、「slime-eval-async」もある。
 「asdf::load-system」だってelispから動かせる。

 しかし、elispの変数の中身をわたすには——。

(setq wrk 4)
4
(setq wrk (slime-eval `(cl-user::list 1 2 3 ,wrk)))
(1 2 3 4)

 こうか。
 それにしてもこのやり方ってlispにしか、できない芸当だよなぁ1

Footnotes:

1

shellもできるか……。