这里有几个问题,关于letcc
那个在 The Seasoned Schemer 中使用。
(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
andthrow
(并且看似 CL),这基本上意味着可以通过调用任何命名的东西来缩短整个代码块letcc
。这感觉像是我在这一系列短书中遇到的最不“实用”的东西,它让我觉得使用它有点犹豫,因为我想学习一种好的实用风格。我只是误解letcc
,还是它不是真正的函数式编程概念,只是为了提高性能而存在?我可以在一些例程中间然后突然进入代码中的另一个点的整个想法感觉有点不对……就像在 Java 中滥用 try/catch 来进行程序流一样。letcc
我在 OS X 中安装的 guile (1.8.7) 版本中似乎不存在。我应该在 guile 中寻找它的另一个名称吗?如果我
letcc
通过将它与 Java 中的 try/catch 或 ruby 中的 catch/throw 进行比较而产生误解(这不是异常处理,只是为了清楚,对于非 ruby 主义者),它在功能级别上究竟是如何工作的? 它能否以更长、更复杂的方式表达,让我相信它毕竟是功能性的?