我正在开发4.1.4 Running the Evaluator as a Program的元级评估器,它使用的是球拍:
#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导入什么?
发布于 2015-09-18 14:25:35
这是一个bug:
(require (combine-in rnrs/base-6
rnrs/mutable-pairs-6))Package rnrs/base-6和rnrs/mutable-pairs-6带来了一些意想不到的变化--cons(以及car、cdr) --领先的(define a 0)没有被definition?捕获
解决方案:
(require (only-in (combine-in rnrs/base-6
rnrs/mutable-pairs-6)
set-car!
set-cdr!))始终将only-in放在require中,以避免任何不必要的绑定。
发布于 2015-09-17 00:57:32
应该没问题的。我用你给的代码做了个快速测试。
(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)用敲诈勒索的语言来运行它会给我:
--> is user input
-->(define a 0)
(define a 0) is a definition
-->(list 1 2 3)
(list 1 2 3) is something else如您所见,输入了条件的右分支。
您确定错误来自else分支吗?因为您的错误消息包含一个:,否则分支中的display不会。
编辑:您在输入提示符中输入了什么?混淆之处可能是调用Racket的eval函数需要一个列表作为参数,(eval '(define a 0))。但是,如果您在输入提示符中输入此内容,它将无法工作。您必须编写(define a 0),就像普通的定义一样。
https://stackoverflow.com/questions/32613416
复制相似问题