jscm をいじってみる
jscm っていうのは javascript で書かれた scheme インタプリタ。 バグがいくつかあるし、標準的な手続き(eq? とか)がちょっと足りないのでいじってみた。
重いけど遊んでやってください。
プリミティブ
begin, lambda, define, defmacro, list, quote, quasiquote, unquote, unquote-splicing
ビルトイン関数
cons, car, cdr, eq?, eqv?, memq, memv, assq, assv, length, reverse, append, pair?, list?, symbol?, string?, number?, +, -, *, /, remainder, floor, ceiling, exp, log, sin, cos, tan, asin, acos, atan, sqrt, and, or, =, <, <=, >, >=, random-real, number->string, string->number, null?, set-cookie!, get-cookie, make-string, string-append, string-length, string-ref, substring, symbol->string, obj->string, string-match, string-search, document->sxml, sxml->document!, display, error, print-string, gensym, eval
sxml 経由で DOM を呼べるようにしたので、実用になるかな。
(document->sxml)
とか、
(sxml->document! '(html (body (h1 (@ (style "color:red")) "hello") (p (@ (style "color:blue")) "world"))))
とかやってみるとよろし。
その他手続き(from tinyscheme)
not, last?, xcons, caar, cadr, cdar, cddr, caaar, caadr, cadar, caddr, cdaar, cdadr, cddar, cdddr, caaaar, caaadr, caadar, caaddr, cadaar, cadadr, caddar, cadddr, cdaaar, cdaadr, cdadar, cdaddr, cddaar, cddadr, cdddar, cddddr, map, for-each, list-tail, list-ref, last-pair, let, let*, foldl, foldr, unless, when, cond, equal?, even?, odd?, zero?, positive?, negative?, quotient, abs, <> max, min, succ, pred, gcd, lcm, member, assoc
既知の不具合
関数を受けとり、関数を返す関数が動かない。非常に痛い。
(define (one op) (lambda (y) (op y 1))) ((one +) 1) => error
cons の扱いが変, member の動きがあやしい
まだ無い機能
文字型(#\), vector, apply, set!, 名前付き let, letrec, delay/force, call/cc, define-syntax(defmacro, gensym はあるよ)
さて、これを使って遊ぶぞー。