Ljsp

俺Prologを動かす

俺Lispでcall/ccが動くようになったので、昔call/ccを使ってGauche上で作った俺Prologをこっちで動かしてみた。 repl> (?- (append X Y (a b c)) (write (x = X y = Y)) (fail)) (x = () y = (a b c)) (x = (a) y = (b c)) (x = (a b) y = (c)) (x = (a b c)…

内部defineを作る

俺Lispを内部defineに対応させてみた。 repl> (letrec () (define x 1) (define y 2) (cons x y)) (1 . 2) http://kar.s206.xrea.com/lisp/?e=(letrec%20()%20(define%20x%201)%20(define%20y%202)%20(cons%20x%20y)) 以下のような展開処理をしてる。 (letre…

自家製quasiquote

俺Lispのunquoteしか対応していなかったquasiquoteをunquote-splicingにも対応させてみた。 and,or,cond等の基本マクロの定義にもquasiquoteを使えるように、quasiquote自体の定義にはそれらは使わずに以下で代用。 (and x y) → (if x y #f)で代用。 (or x y…

俺Lispでcall/ccと末尾再帰最適化

昔作った俺Lispにcall/ccと末尾再帰最適化を実装してみた。 (call/cc (lambda (c) (list 1 (c 2) 3))) 2 http://kar.s206.xrea.com/lisp/?e=(call%2Fcc%20(lambda%20(c)%20(list%201%20(c%202)%203))) call/ccのテスト結果 (1 2 3)のリストを作る途中で抜け…