Scheme 如何将数据传递给call/cc?

Scheme 如何将数据传递给call/cc?,scheme,continuations,Scheme,Continuations,我尝试实现一个函数,该函数获取原子列表并只返回给定列表的子部分。子部分是特定标记之后的所有内容。为此,我尝试使用当前延续的调用 我的做法如下: (define rest (lambda (a lat) (call-with-current-continuation (lambda (res) (letrec ((r (lambda (l) (cond ((nu

我尝试实现一个函数,该函数获取原子列表并只返回给定列表的子部分。子部分是特定标记之后的所有内容。为此,我尝试使用当前延续的
调用

我的做法如下:

(define rest 
  (lambda (a lat)
    (call-with-current-continuation 
      (lambda (res)
        (letrec ((r (lambda (l)
                      (cond 
                        ((null? l) ())
                        ((eq? (car l) a) (res (cdr l)))
                        (else (r (cdr l)))))))
        (r lat))))))
正如你们所看到的,我试图将数据传递给continuation
((eq?(car l)a)(res(cdr l))
但我总是使用这种方法返回
()
。但是如果我像这样硬编码值,
((eq?(car l)a)(apple tea)
,效果很好

我真的被卡住了,我需要帮助

编辑:我找到了解决方案,而不是
(res(cdr l))
我必须通过
(res(r(cdr l))

另外,真正的错误不在于我如何调用
continuation
,而在于
(否则(r(cdr l)
,我应该这样写:

(else (cons (car l)
      (r (cdr l))))))))

您的代码在MIT Scheme 9.2中运行良好:

MIT/GNU Scheme running under OS X
Type `^C' (control-C) followed by `H' to obtain information about interrupts.

Copyright (C) 2014 Massachusetts Institute of Technology
This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE.

Image saved on Wednesday February 24, 2016 at 8:07:52 PM
  Release 9.2 || Microcode 15.3 || Runtime 15.7 || SF 4.41 || LIAR/C 4.118 || Edwin 3.116

1 ]=> (define rest
  (lambda (a lat)
    (call-with-current-continuation
      (lambda (res)
        (letrec ((r (lambda (l)
                      (cond
                        ((null? l) ())
                        ((eq? (car l) a) (res (cdr l)))
                        (else (r (cdr l)))))))
        (r lat))))))

;Value: rest

1 ]=> (rest 'c '(a b c d))

;Value 2: (d)

1 ]=> (rest 'c '(a b c d e))

;Value 3: (d e)

1 ]=> (rest 'c ())

;Value: ()
我的最佳猜测是,您正在处理的对象中,
eq?
是不适当的比较过程

FWIW,下面是一个较短的实现:

(define (rest a lat)
  (call-with-current-continuation
   (lambda (res)
     (let r ((l lat))
       (if (null? l)
           '()
           ((if (eq? (car l) a) res r) (cdr l)))))))

对我来说拍拍子很好:
(rest'c'(a b c d))
产生
(d)
。您使用的是什么实现?Guile也一样,工作正常。我可能会提到,在您的代码中,我将
()
替换为
'()
,但我认为这并不重要,因为如果您的实现出现编译错误,它会出现编译错误。您能否添加一个不起作用的示例?你可能不使用符号,所以
eq?
可能不合适。对我来说没有意义。请添加一个不起作用的示例。对不起,这也没有意义。不过
cond
版本更清晰。另外,因为
r
是尾部递归的,不是吗?你说的“res是一个no-op”是什么意思
res
是延续。在
中((if(eq?(car l)a)res r)(cdr lЮЮЮЮ)
中,
res
r
(cdr l)
作为参数调用,这取决于
(car l)
是否等于
a
。我的意思是,
r
是尾部递归的,所以它的终止子句无论如何都返回值;没有跳跃。在该点调用exit continuation没有任何作用-我们已经退出了。代码在没有它的情况下也能正常工作,正如我在评论中所演示的那样。:)(我指的是第二版本)。@是的,这是真的。