【发布时间】:2019-11-17 03:20:26
【问题描述】:
我正在研究 SICP 的练习 1.6,它重写了演示案例
#+begin_src emacs-lisp :session sicp :results output
(defun sqrt(x)
(sqrt-iter 1.0 x))
(defun sqrt-iter(guess x)
(if (good-enough-p guess x)
guess
(sqrt-iter (improve guess x)
x)))
(defun good-enough-p(guess x)
(< (abs (- (square guess) x)) 0.001))
(defun improve(guess x)
(average guess (/ x guess)))
(defun average(x y)
(/ (+ x y) 2))
#+end_src
它可以工作并获得输出
#+begin_src emacs-lisp :session sicp :lexical t :results output
(print (sqrt 11))
(print (sqrt (+ 100 37)))
(print (sqrt (+ (sqrt 2) (sqrt 3))))
#+end_src
#+RESULTS:
:
: 3.3166248052315686
:
: 11.704699917758145
:
: 1.7739279023207892
因此来到练习 1.6,用cond 重写它
#+begin_src emacs-lisp :session sicp :lexical t
(defun sqrt-iter-cond(guess x)
(cond ((good-enough-p guess x) guess)
(t (sqrt-iter-cond (improve guess x) x))
)
)
(sqrt-iter-cond 1 10)
#+end_src
它报告错误:
ob-async-org-babel-execute-src-block: Lisp nesting exceeds ‘max-lisp-eval-depth’
在阅读了各种解释后,我陷入了更多的困惑,甚至产生了一种隐含的恐惧来使用cond 后记。因为这看起来逻辑上显然是正确的。
能否给点提示?
【问题讨论】:
-
只是出于好奇:您为什么要使用 Elisp 解决 SICP 的练习?这会让你的生活更艰难,这本书是为了使用 Scheme。
-
在认真阅读《魔法书》之前,我意识到自己对编程知之甚少,关于思考“在事物上发挥精神力量”。然而,scheme 可能是一个在原型中组织我的想法的工具,它停在那里,这将禁止我长期使用它作为思考的习惯,因为scheme 不能真正使用。尝试 elisp 可以保留我从 scp 学到的思考习惯。 @ÓscarLópez
-
@Algebra “方案不能真正使用” - 不。这当然是我的意见,但不。有人告诉你一个谎言,大谎言。一年多以来,我在所有项目中都使用 Scheme,但仍然需要找到使用 Scheme 无法解决的问题。