在书中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