在書中The Seasoned Schemer - 作者寫道下面的代碼:你如何在Clojure中做letcc?
(define intersectall
(lambda (lset)
(letcc hop
(letrec
((A (lambda (lset)
(cond
((null? (car lset)) (hop (quote())))
((null? (cdr lset)) (car lset))
(else
(intersect (car lset)
(A (cdr lset))))))))
(cond
((null? lset) (quote()))
(else (A lset)))))))
這裏是潛在怎麼會看在Clojure中:
(defmacro letcc
[name & body]
`(letfn [(~name [arg#]
(throw (ex-info (str '~name) {:name '~name :value arg#})))]
(try [email protected]
(catch clojure.lang.ExceptionInfo e#
(if (= '~name (:name (ex-data e#)))
(:value (ex-data e#))
(throw e#))))))
(defn intersectall
[lset]
(letcc hop
(letfn [(A [lset]
(cond (empty? (first lset))
(hop())
(empty? (rest lset))
(first lset)
:else
(intersect (first lset) (A (rest lset)))))]
(cond (empty? lset)
()
:else
(A lset)))))
我的問題是:你如何用Clojure做letcc
?
這個問題有點不清楚。你在尋找一個比你更好的'letcc'還是你在想它有什麼問題?我認爲在Clojure中做「真正的」letcc是沒有可能的,因爲它沒有一流的延續。 – molbdnilo