【发布时间】:2018-04-08 01:58:57
【问题描述】:
我目前正在为我的大学的一门课程学习 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) 是 '(1 . #<continuation>) 中,car 是 1 并且它会被显示,但是在遍历它的 cdr 之后,var (car head) 将是继续的汽车!它怎么可能评估为2,然后是3,然后是'end,为什么在我尝试编写的代码中没有发生这种情况?
任何帮助都将不胜感激,尤其是可以逐步指导我的帮助。
【问题讨论】:
标签: foreach scheme continuations callcc