【发布时间】:2014-02-18 06:21:07
【问题描述】:
在过去的几天里,我一直在玩计划中的延续(特别是诡计),对某些函数的结果感到有些困惑,想知道是否有人可以准确地解释这里发生了什么。
有一个名为(get-token) 的函数将检索给定文件中的下一个找到的令牌。例如,如果接下来的 3 个标记是“a”、“b”和“c”,调用 (get-token) 将在第一次调用时返回“a”,在第二次调用时返回“b”,和“c”第三次被调用。
我想做的是有一个函数(peek-token),它将调用(get-token),返回令牌,然后返回到调用(get-token)函数之前的状态。我尝试了多种不同的方法来达到这个结果,我目前拥有的方法是:
;; make things a little easier to write
(define-syntax bind/cc
(syntax-rules ()
((bind/cc var . body)
(call/cc (lambda (var) . body)))))
;; function should return next token and then
;; revert to previous state
(define (peek-token)
(bind/cc return
(let ((token (get-token)))
(return token))))
我现在的理解是,bind/cc 将在第一个return 处保存一个延续,然后执行以下代码块。然后当return 再次被命中时,程序会跳回到继续绑定的地方,并给出token 值作为结果。
但是,当我运行上述函数时,结果与原始 (get-token) 函数完全相同。
如果有人能解释我哪里出错了,或者表达一种更好的方法来获得相同的结果,我将不胜感激(我知道有些人讨厌走电话/抄送的方式)。
【问题讨论】: