Scheme,调用堆栈中的区别是什么

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。假设您将这些列表中的一个作为用户的输入: 想象

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) (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)))))))