Elisp定义Ackermann函数

时间:2019-10-27 04:34:06

标签: elisp

我正在阅读SICP,并参考其
Exercise 1.10. The following procedure computes a mathematical function called Ackermann's function.

(define (A x y)
  (cond ((= y 0) 0)
        ((= x 0) (* 2 y))
        ((= y 1) 2)
        (else (A (- x 1)
                 (A x (- y 1))))))

用elisp重写

(defun A (x y)
  (cond ((= y 0) 0)
        ((= x 0) (* 2 y))
        ((= y 1) 2)
        (else (A (- x 1)
                 (A x (- y 1))))))

(A 1 10)

报告错误:
A: Symbol’s value as variable is void: else

因此请参阅elisp的控制结构,在各种替代方案中都将丢失。

能否请您提供一些提示,以condelse来定义该功能

1 个答案:

答案 0 :(得分:2)

在Emacs Lisp中,您使用t而不是else。在这种情况下,语言参考是开始研究的好地方... https://www.gnu.org/software/emacs/manual/html_node/elisp/Conditionals.html

  

通常,我们希望每当前一个都不执行时执行last子句   条款成功。为此,我们使用t作为条件   最后一个子句,例如:(t body-forms)。形式t的计算结果为t,   它永远不会nil,因此只要cond得到   对它。例如:

(setq a 5)
(cond ((eq a 'hack) 'foo)
      (t "default"))
⇒ "default"