【发布时间】:2015-12-13 07:47:09
【问题描述】:
我正在开发 4.1.4 Running the Evaluator as a Program 的元循环评估器,使用 Racket 构建它:
#lang racket
(require (combine-in rnrs/base-6
rnrs/mutable-pairs-6))
(define (evaluate exp)
(cond
; ...
((definition? exp) (display exp)
(display " is a definition\n"))
; ...
(else (display exp)
(display " is something else\n"))))
(define (definition? exp)
(tagged-list? exp 'define))
(define (tagged-list? exp tag)
(if (pair? exp)
(eq? (car exp) tag)
false))
(define (driver-loop)
(let ((input (read)))
(let ((output (evaluate input)))
output))
(driver-loop))
(driver-loop)
在成功读取 DrRacket 中的输入框后,我输入(define a 0),结果是:
(define a 0) is something else
如果我删除它可以识别
(require (combine-in rnrs/base-6
rnrs/mutable-pairs-6))
但如果没有它,我将无法致电 set-car! 或 set-cdr!。 set- 函数有替代方案吗?
或者我可以选择从rnrs/base-6 和rnrs/mutable-pairs-6 导入什么吗?
【问题讨论】:
-
定义以外的表达式是否有效?如果是这样,请添加
definition?的定义,因为它一定是问题所在。 -
你是怎么打电话给
eval的?我的意思是,你是如何传递参数的 -
@Rahn 问题不在于
definition?。我做了一个快速测试,评估了read的结果,它成功地将表达式识别为定义。因此,问题一定是您如何调用eval。exp参数必须与(read)的结果不同,否则它会起作用。 -
@ÓscarLópez
eval已添加。 -
@HyperZ
eval已添加。