Lazy K触り中

とりあえず

What's your name? >Hoge
Hello, Hoge.

的なプログラムを書いた。
面白いね

(load "../lazier.scm")
(load "../prelude.scm")
(load "../prelude-numbers.scm")

(define (string->expr str)
  (case (string-length str)
    ((0) 'i)
    ((1) (last-char->expr str))
    (else `(o ,(string->expr
                 (substring str 0 (- (string-length str) 1)))
              ,(last-char->expr str)))))

(define (last-char->expr str)
  `(cons ,(char->integer (string-ref str (- (string-length str) 1)))))

(lazy-def '(main input)
 `(,(string->expr "What's your name? >") 
   ((lambda (name)
     ((force-list name i)
      (,(string->expr "Hello, ")
       (name (,(string->expr ".") end-of-output)))))
    (gets input))))

; listをあらかじめ評価
(lazy-def '(force-list list retval)
 '(if (null? (list ())) retval retval))

(lazy-def '(gets list)
 '((lambda (x) (x x i list))
   (lambda (self cont src)
     (if (or (if>= (car src) 256 #t #f) (= (car src) 10))
       (cont i)
       (self self (lambda (x) (cont (o (cons (car src)) x))) (cdr src))))))

(print-as-cc (laze 'main))

force-listのあたりがちょっと汚い

Lazy Kではrest部分を渡したらリストが返ってくるような関数で部分リストを表すことが多いようだ。 (部分リストって言葉は今勝手につけた)
たとえば

  • 空の部分リスト: i
  • X一個の部分リスト: (cons X)
  • XとYの2個の部分リスト: (o (cons X) (cons Y))
  • Xをnum回繰り返した部分リスト: (num (cons X))

みたいに

lazier.scm, prelude.scm, lazy.cppは一通り読んだのでその雑感

  • if<=の定義を見て: なんだこりゃーーすげーーどうやったらこんなの思いつくんだーー
  • partial_eval, partial_eval_primitive_applicationあたりをみて: トリッキーな評価方法だなー。Schemeはまだ式を見てそれが評価される様子がなんとなく頭の中である程度想像がつくけどLazy Kは想像できそうにない

追記 (2010-11-12T18:55:51+09:00)

getsはCPSしか道はないと思ってたけどtail引数をとるという道があった。こっちのが断然シンプル
(cons X)をoで合成していくという一つの発想にとらわれていた

(lazy-def '(gets list)
 '((lambda (x) (x x list))
   (lambda (self src tail)
     (if (or (if>= (car src) 256 #t #f) (= (car src) 10))
       tail
       (cons (car src) (self self (cdr src) tail))