使用纯方案过程定义原语应用
Define a primitive apply with purely scheme procedures
在 SICP 的章节 3.1.1 Mutation is just assignment、
cons
纯粹以程序表示:
(define (cons x y)
(define (dispatch m)
(cond ((eq? m 'car) x)
((eq? m 'cdr) y)
(else (error "Undefined
operation: CONS" m))))
dispatch)
并且在chapter 4中,原始eval
和cons
一样被纯粹地定义
(define (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)
(eval-sequence (begin-actions exp) env))
((cond? exp) (eval (cond->if exp) env))
((application? exp)
(apply (eval (operator exp) env)
(list-of-values (operands exp) env)))
(else
(error "Unknown expression type -- EVAL" exp))))
然而,这本书并没有尝试定义一个原始应用程序,而是将内置应用程序包装为
We have assumed instead that we have saved a reference to the underlying apply by doing
(define apply-in-underlying-scheme apply)
在4.1 Metalinguistic abstraction
中,插图将apply
视为理所当然,内置cons
、car
和cdr
。
如何定义原语 apply
?
您不需要定义 primitive-apply
。这来自您用来实现求值器的语言。
如果您使用元循环求值器,primitive-apply
会出现在您使用的方案系统中(例如,mit-scheme、guile 等为您提供 apply
)。如果您使用方案以外的其他语言实现语言,例如 C,primitive-apply
是用 C 编写的。
例如目标语言中的2个数字相加,要使用C中的+
运算符计算结果,primitive-apply
首先需要转换数字的表示在类似 C 的表示中使用目标语言,然后应用原语 +
(来自 C)并将结果转换回目标语言。 primitive-apply
.
将以目标语言返回此结果
这个想法是,用 C 编写的语言的实现将知道对象在目标语言中的表示,并将能够将该表示转换为将被 C 代码识别的类似表示(尝试查看在某些实现中实现了多大的数字以及当您将 2 个大数字与使用 gmp lib). See for example how gmp 的实现相加时内部发生了什么在 emacs lisp 中实现,当您在 emacs/gnu 中评估 (+ a b)
时会发生什么...
您只需在您实现的目标语言中定义 apply
函数。
另一方面,我不明白为什么您将问题与列表构造函数的不同实现的问题结合起来。
在 SICP 的章节 3.1.1 Mutation is just assignment、
cons
纯粹以程序表示:
(define (cons x y)
(define (dispatch m)
(cond ((eq? m 'car) x)
((eq? m 'cdr) y)
(else (error "Undefined
operation: CONS" m))))
dispatch)
并且在chapter 4中,原始eval
和cons
(define (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)
(eval-sequence (begin-actions exp) env))
((cond? exp) (eval (cond->if exp) env))
((application? exp)
(apply (eval (operator exp) env)
(list-of-values (operands exp) env)))
(else
(error "Unknown expression type -- EVAL" exp))))
然而,这本书并没有尝试定义一个原始应用程序,而是将内置应用程序包装为
We have assumed instead that we have saved a reference to the underlying apply by doing
(define apply-in-underlying-scheme apply)
在4.1 Metalinguistic abstraction
中,插图将apply
视为理所当然,内置cons
、car
和cdr
。
如何定义原语 apply
?
您不需要定义 primitive-apply
。这来自您用来实现求值器的语言。
如果您使用元循环求值器,primitive-apply
会出现在您使用的方案系统中(例如,mit-scheme、guile 等为您提供 apply
)。如果您使用方案以外的其他语言实现语言,例如 C,primitive-apply
是用 C 编写的。
例如目标语言中的2个数字相加,要使用C中的+
运算符计算结果,primitive-apply
首先需要转换数字的表示在类似 C 的表示中使用目标语言,然后应用原语 +
(来自 C)并将结果转换回目标语言。 primitive-apply
.
这个想法是,用 C 编写的语言的实现将知道对象在目标语言中的表示,并将能够将该表示转换为将被 C 代码识别的类似表示(尝试查看在某些实现中实现了多大的数字以及当您将 2 个大数字与使用 gmp lib). See for example how gmp 的实现相加时内部发生了什么在 emacs lisp 中实现,当您在 emacs/gnu 中评估 (+ a b)
时会发生什么...
您只需在您实现的目标语言中定义 apply
函数。
另一方面,我不明白为什么您将问题与列表构造函数的不同实现的问题结合起来。