Created
September 15, 2012 06:01
-
-
Save Liutos/3726523 to your computer and use it in GitHub Desktop.
照着垠神的λ-calculus解释器用CommonLisp写的
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(defpackage :com.liutos.del0-interp | |
(:use :cl) | |
(:nicknames :del0-interp | |
:interp)) | |
(in-package :interp) | |
(defvar *env0* '()) | |
(defun ext-env (x v env) | |
(cons `(,x . ,v) env)) | |
(defun lookup (x env) | |
(let ((p (assoc x env))) | |
(cond ((not p) x) | |
(t (cdr p))))) | |
(defclass closure () | |
((f :initarg :f ;关键字符号:initarg是一个选项,它对应了后面的 | |
;符号:f,意思是当使用make-instance实例化一个 | |
;对象时,可以用:f来作为关键字参数给f这个成员变量 | |
;设定一个值,如后面的make-instance调用所示。 | |
:reader closure-f | |
;; :reader也是一个选项,它对应的符号是closure-f。这个选项的作用是让Lisp自动帮我们定义 | |
;; 一个函数,它的名字是closure-f。把这个函数作用在closure类的实例上就可以得到成员变量 | |
;; f的值了,所以后面写(closure-f v1)的意思是取出v1所指向的对象中的f这个成员变量的值。 | |
) | |
(env :initarg :env | |
:reader closure-env))) | |
(defun interp1 (exp env) | |
(cond ((symbolp exp) (lookup exp env)) | |
((numberp exp) exp) | |
((and (consp exp) | |
(eq 'lambda (car exp)) | |
(consp (cadr exp))) | |
(make-instance 'closure :f exp :env env)) | |
((and (consp exp) | |
(null (cddr exp))) | |
(destructuring-bind (e1 e2) exp | |
(let ((v1 (interp1 e1 env)) | |
(v2 (interp1 e2 env))) | |
(if (typep v1 'closure) | |
(let ((e (caddr (closure-f v1))) | |
(x (caadr (closure-f v1))) | |
(env1 (closure-env v1))) | |
(interp1 e (ext-env x v2 env1))))))) | |
((and (consp exp) | |
(cddr exp) | |
(null (cdddr exp))) | |
(destructuring-bind (op e1 e2) exp | |
(let ((v1 (interp1 e1 env)) | |
(v2 (interp1 e2 env))) | |
(case op | |
(+ (+ v1 v2)) | |
(- (- v1 v2)) | |
(* (* v1 v2)) | |
(/ (/ v1 v2)))))))) | |
(defun interp (exp) | |
(interp1 exp *env0*)) |
复制了垠神 Racket 代码, 装了 5.3 才发现他没说明版本.. 运行失败, module expected
, 说好的光辉形象呢
垠神的代码要在chez scheme上跑,可以下个petite试试
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
What's this?