首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么此表达式的值为4 (call/cc)

为什么此表达式的值为4 (call/cc)
EN

Stack Overflow用户
提问于 2019-12-17 22:05:35
回答 3查看 48关注 0票数 1

很抱歉,这个简单的延续示例的计算结果为4,但我不知道为什么:

代码语言:javascript
复制
(call/cc
  (lambda (k)
    (* 5 (k 4)))) 

Chez方案9.5.3

EN

回答 3

Stack Overflow用户

发布于 2019-12-17 23:28:59

call/cc可以让你获得延续传递风格的优点,而不必用延续传递风格来编写它。例如:

代码语言:javascript
复制
(define (cars lsts)
  (define (cars lsts k)
    (cond ((null? lsts) (k '()))
          ((null? (car lsts)) '())
          (else (cars (cdr lsts)
                      (lambda (r) 
                        (k (cons (caar lsts) r)))))))
  (cars lsts values))

;; eg
(cars '())            ; ==> ()
(cars '((1) (2) (3))) ; ==> (1 2 3)
(cars '((1) (2) ()))  ; ==> ()

可以这样写:

代码语言:javascript
复制
(define (cars lsts)
  (call/cc 
   (lambda (bail)
     (define (cars lsts)
       (cond ((null? lsts) '())
             ((null? (car lsts)) (bail '()))
             (else (cons (caar lsts) (cars (cdr lsts))))))
     (cars lsts))))

在CPS中,call/cc&如下所示:

代码语言:javascript
复制
(define (call/cc& proc k)
  (define (exit& v ignored-k)
    (k v))
  (proc exit& k))

您的简单示例可以很容易地重写为延续传递样式:

代码语言:javascript
复制
(call/cc& (lambda (k& real-k)
            (k& 4 (lambda (res)
                    (*& 5 res real-k))))
          display)

可以看到,ignore-k被忽略了,4被传递给了call/cc&的continuation,我把它放入了display,然后在repl中显示了4

票数 1
EN

Stack Overflow用户

发布于 2019-12-18 19:03:03

我将通过使用CPS编写具有相同语义的代码来向您解释。

代码语言:javascript
复制
((lambda (k)
   (k 4
      (lambda (v)
        (* 5 v))))
 (lambda (result stack)
   ;; this continuation will drop the stack
   result))

在调用延续K之后,您也可以使用剩余的堆栈来调用它,但堆栈被删除。

如果您考虑了剩余的堆栈,您将拥有:

代码语言:javascript
复制
((lambda (k)
   (k 4
      (lambda (v)
        (* 5 v))))
 (lambda (result stack)
   ;; this continuation will consider the stacked computation
   (stack result)))

在这种情况下,结果应该是20。

但在代码的语义中,通过调用calling,您丢弃了堆栈,即未完成的计算。

票数 1
EN

Stack Overflow用户

发布于 2019-12-17 22:05:35

continuation将返回传递给它的值(k 4),因此4是返回值。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59375971

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档