首页 文章

当我使用neil / sicp时为什么找不到`when`表格?

提问于
浏览
1

我正在解决section 3.3.2 of SICP的练习-3.23,这是deque的一个实现 .

由于Racket不支持 set-car!set-cdr! ,所以我使用了来自SICP Support for DrRacket#lang planet neil/sicp ,并编写了代码:

#lang planet neil/sicp

(define (make-deque) (cons '() '()))
(define (empty-deque? dq) (null? (front-ptr dq)))
;;; just here, I use when form
(define (front-delete-deque! dq)
  (cond ((empty-deque? dq)
         (error "FRONT-DELETE-DEQUE! called with empty deque" dq))
        (else
         (set-car! dq (caddr (front-ptr dq)))
         (when (null? (front-ptr dq))
           (set-cdr! dq '())))))
(define (front-ptr dq) (car dq))
(define (rear-ptr dq) (cdr dq))

我收到一个错误: when: unbound identifier in module ,这很奇怪 .

我认为它与 neil/sicp 有关,因为Racket有 when 形式 .

并且有人可以解释 #lang planet neil/sicp 究竟是什么意思和重要的?

PS:忘记我是如何实现双端队列的 .

2 回答

  • 0

    neil/sicp 软件包的实现者很可能选择不支持 when - 毕竟,它不是standard语言的一部分,并且(据我所知)它在SICP中从未被提及过 . 但是不要害怕, when 不是必不可少的,你可以写一些等价物,只需替换这部分:

    (when (null? (front-ptr dq))
      (set-cdr! dq '()))
    

    有了这个:

    (if (null? (front-ptr dq))
      (set-cdr! dq '())
      #f)
    

    如果你感觉大胆,你甚至可以编写自己的 when 宏,那么Scheme的一个好处就是你可以扩展它的语法 . 留给读者练习 .

  • 0

    SICP很漂亮;精美的设计与Scheme一起使用,简单明了 . 而不是处理Racket的特性,比如显然没有 set-car! ,为什么不选择一个合适的方案呢?

    有不同的Scheme标准 . 最新的R7RS定义了 when ,并提供了如下定义:

    (define-syntax when
      (syntax-rules ()
        ((when test result1 result2 ...)
         (if test
             (begin result1 result2 ...)))))
    

    如果您使用基于R5RS或R6RS的Scheme,他们将已定义 when 或允许您按上述方式定义它 .

相关问题