lisp処理系ぽいの書いてみてる

なんかまあ割と書けるもんだなあと思った。

% ./istsp
> (+ 32 -40 10)
2
> (cons "hoge" "moge")
("hoge" . "moge")
> (not #f)
#t
> (null? ())
#t
>

ただ、まあ

> (+ 32 22 (- 11 10))
-1211785530
> (cons "hoge" (cons "fuga" "moge"))
("hoge" #proc "fuga" "moge")

全然出鱈目なんですけどね。S式とかそのままリストじゃんーとか思って適当に書いてて、そういやリストと式を見わける方法考えてなかったわぎゃー、とか思った。実装はMiniSchemeを参考にしてるんだかしてないんだか、classとか使ってるけどOOPとかへの無理解具合は何それおいしいの? レベルだしほげほげ。
switch使えて楽かなー思って

enum Type
{
  T_NONE,
  T_STRING,
  T_INTEGER,
  T_CONS,
  T_PROC,
  T_SYMBOL,
}

みたいなことやったけど、例えばT_SYNTAX | T_SYMBOLみたいな複数属性持ちを表わすの楽だから

const T_STRING =         1; /* 0000000000000001 */
const T_NUMBER =         2; /* 0000000000000010 */
const T_SYMBOL =         4; /* 0000000000000100 */
const T_SYNTAX =         8; /* 0000000000001000 */
const T_PROC =          16; /* 0000000000010000 */
const T_PAIR =          32; /* 0000000000100000 */
const T_CLOSURE =       64; /* 0000000001000000 */
const T_CONTINUATION = 128; /* 0000000010000000 */
const T_MACRO =        256; /* 0000000100000000 */
const T_PROMISE =      512; /* 0000001000000000 */

こーいうの用意した方がいいのかなあと思ったけどそれってたぶんOOPじゃねえな。つーか真面目にMiniScheme読んでみるか。長くないんだし。

test