在这里有几个关于 letcc
的问题,它是在《通晓Scheme的厨师》中使用的。
(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(似乎是Common Lisp也是)中的catch
和throw
类似,这意味着通过调用命名的letcc
可以缩短一整个代码块。在这个简短的书系列中,这感觉像是我遇到过的最不“函数式”的事情,这让我有点不敢使用它,因为我想学习一种良好的函数式风格。我是不是对letcc
有什么误解,或者它不是真正的函数式编程概念,只存在于提高性能方面?整个想法是我可以在某个例程中间,然后突然到达代码的另一个点,感觉有点不对劲...就像在Java中滥用try/catch以控制程序流。letcc
在我安装在OS X上的guile版本(1.8.7)中似乎不存在。我应该在guile中寻找另一个名称吗?如果我通过将其与Java中的try/catch或Ruby中的catch/throw进行比较来误解
letcc
(需要明确的是,对于非Ruby程序员来说,这并不是异常处理),那么在函数级别上它实际上是如何工作的?它能否以更复杂的方式表达,让我相信它实际上是函数式的?
let/ec
。 - soegaardcall/cc
的基础上定义letcc
。 - user725091ERROR: invalid syntax ()
ABORT: (misc-error)
。我已经按照页面上的方式操作了,但仍然无法正常工作。也许等我学习宏后就能找到问题所在了。 - d11wtq(use-syntax (ice-9 syncase))
(至少是按照这种方式定义的) :) - d11wtq