If statement 为什么在使用neil/sicp时找不到'when'表单?

If statement 为什么在使用neil/sicp时找不到'when'表单?,if-statement,scheme,racket,sicp,If Statement,Scheme,Racket,Sicp,我在做练习-3.23, 这是deque的一个实现 因为球拍不支持设置赛车和设置cdr,因此我使用来自的#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-dequ

我在做练习-3.23, 这是deque的一个实现

因为球拍不支持
设置赛车
设置cdr,因此我使用来自的
#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))
我得到一个错误:
当:模块中的未绑定标识符时,
,这很奇怪

我认为这和neil/sicp有关,因为球拍在
形式时有

有人能解释一下neil/sicp的确切含义和重要性吗


PS:忘了我是如何实现deque的。

neil/sicp包的实现者很有可能在时选择不支持
——毕竟,它不是语言的一部分,而且(据我记忆所及)在中从未提到过它。但是不要害怕,
如果
不是必需的,你可以写一些等效的东西,只需替换这一部分:

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

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

如果你觉得很大胆,你甚至可以编写自己的
when
宏,Scheme的一个优点就是你可以扩展它的语法。留给读者作为练习。

SICP是美丽的东西;设计精美,与方案配合使用,简单明了。而不是处理球拍的特质,比如没有
赛车
有不同的方案标准。最新的R7RS定义了
when
并提供了以下定义:

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

如果您使用基于R5R或R6R的方案,它们将在
时定义
,或者允许您如上所述定义它

这是一个很好的选择。但是我想知道neil/scip
做了什么,为什么它不定义
when
,因为它支持sicp。@WindorC
不是Scheme语言的一部分时,包的实现者干脆选择不支持它。它不是必需的,只是
(if(begin)(void))
的语法糖。事实上,据我记忆所及,当
不在SICP中时,那么将其添加到包中有什么意义呢?@WindorC只是为了澄清:Racket和Scheme是不同的语言;SICP,以及扩展的
neil/SICP
包,处理Scheme-所以你不能期望包支持RacketThanks的所有语法形式。为了解释,我知道两者是不同的,但我不知道Racket已经走了这么远。也许这不是学习sicp的好选择,或者我在使用球拍时错过了什么?顺便说一句,
void
模块中也有一个
未绑定标识符
。@WindorC Racket是通过SICP的不错选择,只要您使用其中一个支持包并坚持使用本书,避免使用本书中未使用的表单。如果
(void)
不起作用,用
#f
替换它,这只是说:“忽略返回值”。如果这个答案对你有帮助,请随意回答;)