我目前正在为我的大学的一门课程学习 Scheme,同时查看一些我被困在这个特定的练习上的练习。教授还没有回复我以前的邮件,因此我有更多机会在这里更快地收到答复。
鉴于此代码
(define (list-iter-cc lst)
(call/cc
(lambda (return)
(for-each
(lambda (x)
(call/cc (lambda (next-step)
(return (cons x next-step)))))
lst)
'end)))
我必须用它来编写iter
语法为的宏
(iter <a variable symbol> in <a list> <code>)
例子:
(iter x in '(1 2 3)
(display x)
(newline))
由于我无法理解list-iter-cc
,我去看了解决方案,我也不明白。解决方案:
(define-syntax iter2
(syntax-rules (-> in)
((_ var in lst code ...)
(let loop ((head (list-iter-cc lst)))
(unless (eq? head 'end)
(let ((var (car head)))
code ...
(loop ((cdr head)))))))))
为了解开宏,我尝试编写以下内容
> (define head (list-iter-cc '(1 2 3 4)))
> head
'(1 . #<continuation>)
> (let ( (var (car head))) (display var))
1
> (define head2 (cdr head))
> (let ( (var2 (car head2)) ) (display var2))
Xxx X car: contract violation
expected: pair?
given: #<continuation>
>
这正是我认为会发生的事情。
list-iter-cc
的返回延续在第一个 lambda 内的 for-each 的第一次迭代中被调用,返回cons x next-step
.
x
是列表的第一个元素,next-step
是一个延续。
1)。内容是next-step
什么?的以下迭代for-each
?在最后一次迭代之后如何评估'end
?
2)。假设在宏head (list-iter-cc lst)
is'(1 . #<continuation>)
中,汽车是1
并且它被显示,但在循环其cdr之后,var (car head)
将是延续的汽车!它怎么可能评估为2
and 3
then 'end
,以及为什么在我尝试编写以理解它的代码中不会发生这种情况?
任何帮助将不胜感激,尤其是可以逐步指导我的帮助。