【发布时间】:2012-06-21 15:54:13
【问题描述】:
这里有几个问题,关于 The Seasoned Schemer 中使用的letcc。
(define (intersect-all sets)
(letcc hop
(letrec
((A (lambda (sets)
(cond
((null? (car sets)) (hop '())
((null? (cdr sets)) (car sets))
(else
(intersect (car sets)
(A (cdr sets)))))))
; definition of intersect removed for brevity
(cond
((null? sets) '())
(else (A sets))))))
我想我理解
letcc的作用,这基本上类似于 ruby 中的catch和throw(看起来是 CL),这基本上意味着可以缩短整个代码块调用名为letcc的任何名称。这感觉就像我在这一系列短书中遇到的最不“实用”的东西,它让我觉得使用它有点犹豫,因为我想学习一种好的实用风格。我只是误解了letcc,还是它不是一个真正的函数式编程概念,只是为了提高性能而存在?我可以在一些例程中间然后突然进入代码中的另一个点的整个想法感觉有点不对……就像在 Java 中滥用 try/catch 来进行程序流一样。letcc似乎不存在于我在 OS X 中安装的 guile (1.8.7) 版本中。我应该在 guile 中寻找它的另一个名称吗?
1234563非红宝石主义者),它在功能层面上究竟是如何工作的?它能否以更长、更复杂的方式表达,让我相信它毕竟是功能性的?
【问题讨论】:
-
如果您的实现同时支持“正常”延续和转义延续,则使用后者通常更便宜。您示例中的模式非常适合转义延续。标准缩写为
let/ec。 -
仅供参考,this page 展示了如何使用简单的宏根据
call/cc定义letcc。 -
@JonO,我之前读过并尝试过,但诡计只是说
ERROR: invalid syntax ()ABORT: (misc-error)。检查我已经按照页面上说的方式完成了它,但它仍然不起作用。当我开始学习宏时,我可能会弄清楚为什么。 -
谁知道这是在哪里记录的,但是在定义宏之前需要
(use-syntax (ice-9 syncase))(至少是定义宏的方式):)
标签: functional-programming scheme seasoned-schemer