2

我一直在阅读 sicp 的第 5 章,并被困在一段代码上——即 5.2 中提供的汇编程序。这是它的样子:

(define (extract-labels text receive)
    (if (null? text) 
        (receive '() '())
        (extract-labels (cdr text)
        (lambda (insts labels)
            (let ((next-inst (car text)))
                (if (symbol? next-inst)
                    (receive insts
                             (cons (make-label-entry next-inst insts)
                                   labels))
                     (receive (cons (make-instruction next-inst) insts)
                              lables)))))))

不是只有当文本为空时才会调用 lambda 吗?那么我们如何才能要求'文本'的汽车呢?

编辑

感谢您的回答,但我仍然没有看到它。如果文本不为空,提取标签不会递归调用自身,直到文本为空?这种情况下怎么叫车呢?

4

2 回答 2

1

lambda 获得适当的范围:在定义 lambda 时text不为空,因此调用car text工作正常。

于 2012-09-17T03:30:08.463 回答
0

if最多需要三个参数:一个条件、一个if-true(then) 表达式和一个if-false(else) 表达式。缩进很奇怪,所以看起来不对。

它应该显示为

(define (extract-labels text receive)
    (if (null? text) 
        (receive '() '())
        (extract-labels (cdr text)
            (lambda (insts labels)
                (let ((next-inst (car text)))
                    (if (symbol? next-inst)
                        (receive insts
                                 (cons (make-label-entry next-inst insts)
                                       labels))
                        (receive (cons (make-instruction next-inst) insts)
                                  labels)))))))

观察表达式的结果是(receive '() '())iftext为 null,(extract-labels ...)否则为 null。

于 2012-09-17T03:30:40.403 回答