Scheme,调用堆栈中的区别是什么
d和e之间的调用堆栈有什么区别?您忘记了一个:Scheme,调用堆栈中的区别是什么,scheme,callstack,Scheme,Callstack,d和e之间的调用堆栈有什么区别?您忘记了一个: (define d (append '(a) (call/cc (lambda (k) (k (append '(b) '(c))))))) (define e (append '(a) (append '(b) '(c)))) 您的示例和上面的示例显示了相同代码的变体。编译器会将这些表达式简化为完全相同的表达式 与eval一样,如果可以避免,就不应该使用call/cc。假设您将这些列表中的一个作为用户的输入: 想象
(define d
(append '(a) (call/cc
(lambda (k) (k (append '(b) '(c)))))))
(define e
(append '(a) (append '(b) '(c))))
您的示例和上面的示例显示了相同代码的变体。编译器会将这些表达式简化为完全相同的表达式
与eval一样,如果可以避免,就不应该使用call/cc。假设您将这些列表中的一个作为用户的输入:
想象一下这个例子:
(define d
(append '(a) (call/cc
(lambda (k) (append '(b) '(c))))))
在这里,如果您输入一个列表,d将变成“(a b…),但如果您没有为它提供一个列表(例如,您写5),它将使用continuation(abort)返回#f,而不是让append执行它的操作。这个例子可以在没有call/cc的情况下编写(通过先执行read和if部分,但在某些情况下,继续的替代方法是完成一个计算,您知道一半的计算将被删除)
call/cc与其他语言中的goto类似,可用于创建异常、协作多任务、迭代等++。请参见因为第一个可以缩减为第二个,所以它们是相同的。缩减为
(call/cc(lambda(k)(k v)))
=>v
。您想在什么时候检查调用堆栈?在执行这两个函数的过程中,调用堆栈在某些时候会有所不同。由于您使用的是call/cc
,您需要使用术语调用树而不是调用堆栈。:-)那么使用或然后的优点/缺点是什么?这棵树有什么不同?只是第一个分支比第二个分支多出一个分支?
(define d
(call/cc
(lambda (abort)
(append '(a)
'(b)
(let ((c (read)))
(if (list? c)
c
(abort #f)))))))