【发布时间】:2016-09-20 07:21:00
【问题描述】:
在书The Seasoned Schemer——作者写了如下代码:
(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 ~@body
(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,因为它没有一流的延续。
标签: clojure scheme continuations