EoPL reading (131) 3.1 A Simple Interpreter
嫌も応も無く英語が読めんと微妙な世界に突入している模様。
Exercise 3.1
ええと、以下な実装にて
simple-interpreter.scm
(add-load-path ".")
(load "define-datatype")
(define list-of
(lambda (pred)
(lambda (val)
(or (null? val)
(and (pair? val)
(pred (car val))
((list-of pred) (cdr val)))))))
(define-datatype program program?
(a-program
(exp expression?)))
(define-datatype expression expression?
(lit-exp
(datum number?))
(var-exp
(id symbol?))
(primapp-exp
(prim primitive?)
(rands (list-of expression?))))
(define-datatype primitive primitive?
(add-prim)
(subtract-prim)
(mult-prim)
(incr-prim)
(decr-prim))program-to-list.scm
(add-load-path ".")
(load "simple-interpreter")
(define program-to-list
(lambda (l)
(define exp-to-list
(lambda (l)
(cases expression l
(lit-exp (datum) datum)
(var-exp (id) id)
(primapp-exp (prim rands)
(list prim (let f ((rslt '()) (rands rands))
(if (null? rands)
rslt
(f (append rslt (list (exp-to-list (car rands))))
(cdr rands))))))
(else
(eopl:error 'exp-to-list
"Invalid expression " l)))))
(cases program l
(a-program (exp)
(exp-to-list exp))
(else
(eopl:error 'program-to-list
"Invalid application " l)))))試験が以下。
(use gauche.test)
(add-load-path ".")
(load "program-to-list")
(test-start "program-to-list")
(test-section "program-to-list")
(test* "conversion example"
'((incr-prim) (((add-prim) (3 x))))
(program-to-list '(a-program
(primapp-exp
(incr-prim)
((primapp-exp
(add-prim)
((lit-exp 3)
(var-exp x))))))))
(test-end)うーん。なんと言えば良いのか分かりませんが微妙。とりあえず OK ってコトにしておきたいと思います。