にく置き場

はてなダイアリーから本格的に移行して、メインのブログとして技術ネタやりたい。

Lisp処理系っぽいのを書き始めてみた:2

今回は、

(+ 1 (* 2 3) 4)

のようなコードを実行できるような実装をしました。

 Whileで数値を取って来て、)になったら取ってくるのを辞めるというシンプルな方法です。 これの問題点は、入れ子構造を解釈してくれないため、途中に)があるとそこで中断してしまいます。 そこで、()構造の入れ子の深さを表す変数を用意して、(を通ると+1,)を通ると-1して、その数で判定するようにしました。これで入れ子も使えるようになっています。

まだ構文木の出番ではない。

次は、defineを作って、関数を定義出来るようにしてみようかと思います。構文木と名前テーブルが必要になる?

その前に変数?面倒なので変数も関数もdefineで使えるようにしたいですね。

制作物は、https://github.com/nikuuchi/MyLisp で公開しています。

Lisp処理系っぽいのを書き始めてみた

まだ整数の二項ごとの四則演算しかできないけど、Lispっぽいのを作ってみた。
以下のようなS式を正しく計算してくれるはず。

(/ (* (+ 12 2) (- 0 1)) (+ 5 2))

ちなみにC++で書いております。ソースはgithubで管理。
https://github.com/nikuuchi/MyLisp
とりあえずファイルを読み込んで、再帰的下向きにパースして直に実行しています。
構文木とかも実装してません。
ここまでで作るので約1時間半。次回はリファクタリングと多項演算ですかね。あと複数行にまたがった数式の処理。

Emacsのデーモンを立ち上げるスクリプト

Emacsは起動が遅いですが、デーモンとして起動すれば使いたい時にさくっと立ち上げることができます。
ただ、デーモンが立ち上がっているときにデーモンを立ち上げると、エラーを吐くにも関わらずEmacs Lispを読み込むという面倒くささがあります。それを解消するために、Emacsデーモンを検出したらEmacsの立ち上げを行わないというだけのスクリプトを書きました。