首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >利用球拍实现SICP评价器

利用球拍实现SICP评价器
EN

Stack Overflow用户
提问于 2015-09-16 15:56:38
回答 2查看 282关注 0票数 1

我正在开发4.1.4 Running the Evaluator as a Program的元级评估器,它使用的是球拍:

代码语言:javascript
复制
#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

如果我把它移除的话

代码语言:javascript
复制
(require (combine-in rnrs/base-6
                     rnrs/mutable-pairs-6))

但是,如果没有它,我就无法调用set-car!set-cdr!。是否有替代set-函数的方法?

或者我可以选择从rnrs/base-6rnrs/mutable-pairs-6导入什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-09-18 14:25:35

这是一个bug:

代码语言:javascript
复制
(require (combine-in rnrs/base-6
                     rnrs/mutable-pairs-6))

Package rnrs/base-6rnrs/mutable-pairs-6带来了一些意想不到的变化--cons(以及carcdr) --领先的(define a 0)没有被definition?捕获

解决方案:

代码语言:javascript
复制
(require (only-in (combine-in rnrs/base-6
                              rnrs/mutable-pairs-6)
                  set-car!
                  set-cdr!))

始终将only-in放在require中,以避免任何不必要的绑定。

票数 0
EN

Stack Overflow用户

发布于 2015-09-17 00:57:32

应该没问题的。我用你给的代码做了个快速测试。

代码语言:javascript
复制
(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)

用敲诈勒索的语言来运行它会给我:

代码语言:javascript
复制
--> 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),就像普通的定义一样。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32613416

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档