Fre*_*Hsu 2 eager clojure sicp lazy-evaluation
我正在尝试使用Clojure完成SICP中的一些练习,但是我现在执行Simpson规则的方法出错(例如1-29).这与懒惰/急切的评估有关吗?有想法该怎么解决这个吗?错误和代码如下:
java.lang.ClassCastException:用户$ simpson $ h__1445无法在clojure.lang.Numbers.divide(Numbers.java:139)中强制转换为java.lang.Number
这是代码:
(defn simpson [f a b n]
(defn h [] (/ (- b a) n))
(defn simpson-term [k]
(defn y [] (f (+ a (* k h))))
(cond
(= k 0) y
(= k n) y
(even? k) (* 2 y)
:else (* 4 y)))
(* (/ h 3)
(sum simpson-term 0 inc n)))
Run Code Online (Sandbox Code Playgroud)
您定义h为无参数的函数,然后尝试使用它,就好像它是一个数字.我也不确定你得到了什么(sum simpson-term 0 inc n); 我只是假设sum你从SICP得到的是一些魔法,并且你传递给它的论据是正确的(我模糊地回忆起它们定义某种通用的总和).
另一件事是,在a中嵌入def或defn嵌套几乎总是一个糟糕的主意defn.您可能想要let(对于临时或本地的)或其他顶级defn.
轴承在我没有写一记simpson多年来的功能,并没有检查这一个算法的正确性可言,这里有一个小品是接近"正确的形状"比你:
(defn simpson [f a b n]
(let [h (/ (- b a) n)
simpson-term (fn [k]
(let [y (f (+ a (* k h)))]
(cond
(= k 0) y
(= k n) y
(even? k) (* 2 y)
:else (* 4 y))))]
(* (/ h 3)
(sum simpson-term 0 inc n))))
Run Code Online (Sandbox Code Playgroud)