【发布时间】:2019-10-18 01:46:36
【问题描述】:
我正在尝试使用 Clojure 中的流创建一个 sqrt 函数。为此,我需要在函数内部定义流并返回它。问题在于流是根据自身定义的。因此,使用 let 是不可能的,使用 def 是虚假的,因为它会影响全局范围。有没有办法在不影响全局范围的函数中模拟使用 def ?
(defmacro cons-stream [a b]
(list 'lazy-seq (list 'cons a (list 'lazy-seq b))))
(defn stream-car [stream] (first stream))
(defn stream-cdr [stream] (rest stream))
(defn stream-map [proc & streams]
(if (empty? (first streams))
'()
(cons-stream (apply proc (map stream-car streams))
(apply stream-map proc (map stream-cdr streams)))))
(defn average [a b] (/ (+ a b) 2.0))
(defn sqrt-improve [guess x]
(average guess (/ x guess)))
(defn sqrt-stream [x]
(def guesses (cons-stream 1.0
(stream-map #(sqrt-improve % x) guesses)))
guesses)
我不希望 sqrt-stream 创建全局猜测流。
编辑
在 clojure 中,let 定义仅在被评估后才可用。所以这个定义会抛出一个错误。
(defn sqrt-stream [x]
(let [guesses (cons-stream 1.0
(stream-map #(sqrt-improve % x) guesses))]
guesses))
【问题讨论】:
-
我看不出“因此,不可能使用 let”(当递归定义值时)声明是正确的(只要您确保存在结束条件)。您能否详细说明您尝试了什么以及它是如何失败的?
-
(响应编辑)...对,但您可以使用 let 将 promise/fn/other 句柄绑定到延迟执行。据我所知,这就是您尝试使用
def隐式执行的操作;最好使用明确的语法。
标签: clojure