max-lisp-eval-depth查找sqrt-iter

问题描述 投票:0回答:1

我正在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后缀。因为这显然是逻辑上正确的。

请提供任何提示吗?

我正在SICP的练习1.6中工作,该练习重写了演示案例#+ begin_src emacs-lisp:session sicp:results输出(defun sqrt(x)(sqrt-iter 1.0 x))(defun sqrt-iter(guess x)(如果(...

elisp sicp
1个回答
0
投票

cond版本没有任何问题,从一个空的缓冲区开始并尝试它,它将起作用:

© www.soinside.com 2019 - 2024. All rights reserved.