2012-06-19 32 views
8

這裏有幾個問題,關於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)))))) 
  1. 我想我明白letcc實現,這基本上是類似catch和紅寶石(貌似CL),這基本上意味着代碼的整體結構throw可以通過調用剪短什麼名爲letcc是。這感覺就像我在這本簡短的系列書中遇到的最不「功能性」的東西,這讓我感到有點猶豫,因爲我想學習一個很好的功能風格。我只是誤解letcc,還是它不是一個真正的函數式編程概念,只是爲了提高性能而存在?整個想法,我可以在一些例程的中間,然後突然在代碼中的另一個點感覺有點不對......像濫用Java中的try/catch程序流。

  2. letcc似乎並不存在於guile(1.8.7)的版本中我已經安裝在OS X中。是否有另外一個名字,我應該在guile中尋找?

  3. 如果我通過它在Java中的try/catch,或捕捉比較誤會letcc /扔在紅寶石(這異常處理,僅僅是明確的,對於非Ruby開發者),究竟它在功能級別上工作嗎?它能以更長,更復雜的方式表達出來,說服我終究有用嗎?

+1

如果你有一個支持「正常」繼續和轉義繼續的實現,它通常使用後者更便宜。你的例子中的模式非常適合轉義延續。標準縮寫是'let/ec'。 – soegaard

+0

僅供參考,[本頁](http://community.schemewiki.org/?seasoned-schemer)顯示瞭如何使用簡單的宏以'call/cc'的形式定義'letcc'。 –

+0

@JonO,我之前讀過並嘗試過,但是guile只是說'ERROR:invalid syntax()''ABORT:(misc-error)'。檢查我已經按照頁面所說的方式完成了它,但它仍然不起作用。我可能會弄清楚爲什麼當我開始學習宏時。 – d11wtq

回答

11
  1. 「功能」有好幾個意思,但沒有流行的意義以任何方式矛盾延續。但他們可以被濫用到創建難以閱讀的代碼。他們不是可以被「濫用於程序流程」的工具 - 他們程序流程工具。

  2. 不能幫你那裏。我知道在Guile的延續中有半個近期,但我不知道事情的立場。它肯定應該有call-with-current-continuation,通常也用更友好的名字call/cc,而let/cc是一個簡單的宏,可以用call/cc構建。

    我可以告訴你,在球拍有一個與在same family一堆others builtins內置一起let/cc,另外還有各種控制操作的whole library(具有廣泛引用的列表)。

  3. let/cc的簡單用法確實類似於catch/throw類型的東西 - 更具體地說,這樣的continuation通常被稱爲「escape continuation」(或有時是「向上」)。這是您在代碼中使用的那種類型,通常用於執行abortreturn

    但是Scheme中的延續是可以在任何地方使用的東西。對於一個非常簡單的例子,說明這種差異,試試這個:

    (define (foo f) (f 100)) 
    (let/cc k (+ (foo k) "junk") (more junk)) 
    
  4. 最後,如果你想了解更多關於延續,你可以看到PLAI的相關部分,還有一個更brief by-example overview,馬修可能會寫,你可以看到我寫的基於PLAI的一些class notes,其中一些例子受到後一篇文章的啓發。

+2

哇,閱讀Matthew Right ,我的意見發生了變化。我認爲實際瞭解'call/cc'的工作原理似乎比我原先想象的要乾淨得多。非常感謝解釋。原來我的版本的guile有'call/cc'和'call-with-current-continuation',但沒有'letcc'。另外,'call/cc'比ruby中的catch/throw更有趣,因爲它可以讓你做更酷的事情。我想The Seasoned Schemer將在後面的章節中更詳細地探討這一點。 – d11wtq

+0

如果你已經完成了他的文本,那麼也請看我的課堂筆記:有幾個例子更加廣泛,有一個完整的發生器和amb的開發,並且從CPS的描述開始 - 你可以用其他語言來實現其中的一些。 –

+4

而BTW,他的名字是Matthew Might。 (他可能是對的,但他的名字是可能的。) –