我正在解决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 回答
neil/sicp
软件包的实现者很可能选择不支持when
- 毕竟,它不是standard语言的一部分,并且(据我所知)它在SICP中从未被提及过 . 但是不要害怕,when
不是必不可少的,你可以写一些等价物,只需替换这部分:有了这个:
如果你感觉大胆,你甚至可以编写自己的
when
宏,那么Scheme的一个好处就是你可以扩展它的语法 . 留给读者练习 .SICP很漂亮;精美的设计与Scheme一起使用,简单明了 . 而不是处理Racket的特性,比如显然没有
set-car!
,为什么不选择一个合适的方案呢?有不同的Scheme标准 . 最新的R7RS定义了
when
,并提供了如下定义:如果您使用基于R5RS或R6RS的Scheme,他们将已定义
when
或允许您按上述方式定义它 .