关于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))))))
Run Code Online (Sandbox Code Playgroud)
我想我明白什么letcc实现,那就是基本类似catch,并throw在红宝石(貌似CL),这基本上意味着代码的整体结构可以通过调用任何指定的剪短letcc的.这感觉就像是最"功能性"的事情我已经在这短短的系列丛书遇到,这让我觉得有点犹豫,使用它,因为我想学习的好功能的风格.我只是误解letcc,还是它不是一个真正的函数式编程概念,只是为了提高性能?整个想法,我可以在一些例程的中间,然后突然到达代码中的另一个点感觉有点错误...就像滥用Java中的try/catch程序流程一样.
letcc 似乎不存在于我在OS X中安装的guile版本(1.8.7).我应该在guile中寻找另一个名称吗?
如果我letcc通过将它与Java中的try/catch进行比较来误解,或者在ruby中捕获/抛出(这不是异常处理,只是为了清楚,对于非rubyists),它在功能级别上究竟是如何工作的?它可以用更长,更复杂的方式表达,这让我觉得它毕竟是功能性的吗?
现在,我正在通过查看The Seasoned Schemer这本书来吸取阴谋家.我通过球拍编写代码,但是当我使用时try,计划器没有这个方法或宏.它报告扩展:模块中的未绑定标识符:try.代码如下:(在第89页)
(define (remove-member-first* a lat)
(try oh (rm a lat oh) lat))
Run Code Online (Sandbox Code Playgroud)
我搜索了球拍文件,但没有找到熟悉的功能.
那么谁知道是否有类似'尝试'的功能呢?
我一直在阅读The Seasoned Schemer,我遇到了长度函数的这个定义
(define length
(let ((h (lambda (l) 0)))
(set! h (L (lambda (arg) (h arg))))
h))
Run Code Online (Sandbox Code Playgroud)
后来他们说:
(L(lambda(arg)(h arg)))的值是多少?这是功能
(lambda (l)
(cond ((null? l) 0)
(else (add1 ((lambda (arg) (h arg)) (cdr l))))))
Run Code Online (Sandbox Code Playgroud)
我不认为我完全理解这一点.我想我们应该将L自己定义为练习.我使用letrec 在长度定义中写了L的定义.这是我写的:
(define length
(let ((h (lambda (l) 0)))
(letrec ((L
(lambda (f)
(letrec ((LR
(lambda (l)
(cond ((null? l) 0)
(else
(+ 1 (LR (cdr l))))))))
LR))))
(set! h (L (lambda (arg) (h arg))))
h)))
Run Code Online (Sandbox Code Playgroud)
因此, …
(define get-first
(lambda (l)
(call-with-current-continuation
(lambda (here)
(set! leave here)
(waddle l)
(leave (quote ()))))))
(define get-first
(lambda (l)
(call-with-current-continuation
(lambda (here)
(set! leave here)
(leave (waddle l))))))
Run Code Online (Sandbox Code Playgroud)
对于任何不熟悉的书"经验丰富的策士", ,get-first,get-next和waddle(最后两个在这里没有定义)的程序,显然是模拟协同程序通过迭代树传递到waddle只得到叶子.只是之前waddle的在其第二个到最后再入屈服,它集再入点的地方将只返回纯值'()即而不是产生的'(),在实际值的waddle 是 '(),就好像它是一个纯粹的功能一直以来.
考虑到这一点,我们可以看到get-first设置的内容......当waddle返回"for real"时,它将在call/ccin中get-first,然后(leave (quote ()))是值的get-first(并且,反过来,这leave意味着返回到get-next最后一次迭代,因此,它是get-next"实际"的回报'().
那么,为什么是第二个版本不等同,这里waddle …