這裏有幾個問題,關於letcc
在The Seasoned Schemer中使用。經驗豐富的Schemer,letcc和guile
(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
實現,這基本上是類似catch
和紅寶石(貌似CL),這基本上意味着代碼的整體結構throw
可以通過調用剪短什麼名爲letcc
是。這感覺就像我在這本簡短的系列書中遇到的最不「功能性」的東西,這讓我感到有點猶豫,因爲我想學習一個很好的功能風格。我只是誤解letcc
,還是它不是一個真正的函數式編程概念,只是爲了提高性能而存在?整個想法,我可以在一些例程的中間,然後突然在代碼中的另一個點感覺有點不對......像濫用Java中的try/catch程序流。letcc
似乎並不存在於guile(1.8.7)的版本中我已經安裝在OS X中。是否有另外一個名字,我應該在guile中尋找?如果我通過它在Java中的try/catch,或捕捉比較誤會
letcc
/扔在紅寶石(這不異常處理,僅僅是明確的,對於非Ruby開發者),究竟它在功能級別上工作嗎?它能以更長,更復雜的方式表達出來,說服我終究有用嗎?
如果你有一個支持「正常」繼續和轉義繼續的實現,它通常使用後者更便宜。你的例子中的模式非常適合轉義延續。標準縮寫是'let/ec'。 – soegaard
僅供參考,[本頁](http://community.schemewiki.org/?seasoned-schemer)顯示瞭如何使用簡單的宏以'call/cc'的形式定義'letcc'。 –
@JonO,我之前讀過並嘗試過,但是guile只是說'ERROR:invalid syntax()''ABORT:(misc-error)'。檢查我已經按照頁面所說的方式完成了它,但它仍然不起作用。我可能會弄清楚爲什麼當我開始學習宏時。 – d11wtq