Элисп для определения функции Аккермана - PullRequest
0 голосов
/ 27 октября 2019

Я читаю 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, таким образом потерянную в различных альтернативах.

Не могли бы вы дать подсказки, чтобы определить эту функцию с cond и else

1 Ответ

3 голосов
/ 27 октября 2019

В Emacs Lisp вы используете t вместо else. В таких случаях Справочник по языку является хорошим местом для начала исследования ... https://www.gnu.org/software/emacs/manual/html_node/elisp/Conditionals.html:

Часто мы хотим выполнить последнее предложение, если ни одно из предыдущих предложений не былоуспешный. Для этого мы используем t в качестве условия последнего предложения, например: (t body-forms). Форма t оценивается как t, что никогда не является nil, так что это предложение никогда не завершается неудачей, если cond дойдет до него вообще. Например:

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