a-plus-abs-b: 无效函数: (if (> b 0) + -)

a-plus-abs-b: Invalid function: (if (> b 0) + -)

我正在做 SICP 的练习 1.4

练习 1.4。请注意,我们的评估模型允许运算符为复合表达式的组合。使用此观察来描述以下过程的行为:

#+begin_src emacs-lisp :session sicp :lexical t
(defun a-plus-abs-b(a b)
  ((if (> b 0) + -) a b))
(a-plus-abs-b 9 4)

#+end_src

运行 得到错误

a-plus-abs-b: Invalid function: (if (> b 0) + -)

有什么问题?

在 Emacs Lisp 中你需要这样做:

(defun a-plus-abs-b (a b)
  (funcall (if (> b 0) '+ '-) a b))

那是因为 Emacs Lisp 是 Lisp-2.