SICP を lisp で
(defun scheme-eval (exp env) (cond ((self-evaluating? exp) exp) ((variable? exp) (lookup-variable-value exp env)) ((quoted? exp) (text-of-quotation exp)) ((assignment? exp) (eval-assignment exp env)) ((definition? exp) (eval-definition exp env)) ((if? exp) (eval-if exp env)) ((lambda? exp) (make-procedure (lambda-parameters exp) (lambda-body exp) env)) ((begin? exp) (scheme-eval-sequence (begin-actions exp) env)) ((cond? exp) (scheme-eval (cond->if exp) env)) ((application? exp) (scheme-apply (scheme-eval (operator exp) env) (list-of-values (operands exp) env))) (t (format t "Unknown expression"))))
lisp でつくってみた。let とか実装してないな、、、こんなことやってもあまり意味がないの、、、ということはない。こんな感じで応用できるのだ
(defun vhdl-machine (vhdl-exp env) (cond ((numberp vhdl-exp) (format t "~a" vhdl-exp)) ((stringp vhdl-exp) (format t "~a" vhdl-exp)) ((vhdl-symbol? vhdl-exp) (show-symbol vhdl-exp env)) ((vhdl-case? vhdl-exp) (show-case vhdl-exp env)) ((vhdl-ex-when-list? vhdl-exp) (show-ex-when-list vhdl-exp env)) ((vhdl-when? vhdl-exp) (show-when vhdl-exp env)) ((vhdl-others? vhdl-exp) (show-others vhdl-exp env)) ..... .....
かなり怪しい。でもって、よーく見るとなんか同じ事やってませんか?これはうまくマクロを使うともっと効率的に出来るはずだ。しかも、構文解析とアクションを分離できるはずだ。アクションを分離できれば、構文を解析した結果を別の形に出来ると思う。
例えば、インタプリタとコンパイラを実装できるはずだ。その2つは同じ構文なら似通っているはずだ。