【问题标题】:a-plus-abs-b: Invalid function: (if (> b 0) + -)a-plus-abs-b: 无效函数: (if (> b 0) + -)
【发布时间】:2019-12-03 10:08:41
【问题描述】:

我正在做 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) + -)

有什么问题?

【问题讨论】:

    标签: scheme lisp elisp sicp


    【解决方案1】:

    在 Emacs Lisp 中你需要这样做:

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

    那是因为 Emacs Lisp 是 Lisp-2

    【讨论】:

    • Scheme 和 Emacs Lisp 之间的另一个小区别,以及在通过 SICP 时使用 Scheme 更简单的原因......但我们已经讨论过:)
    • TXR Lisp 是一个类似于 Common LIsp 和 Emacs Lisp 的 Lisp-2;但你可以这样做:(defun plus-abs (a b) [[if (plusp b) + -] a b]))[...] 表示法代表一个特殊的运算符 (dwim ...),它提供了对符号参数的 Lisp-1 样式处理和严格的函数应用(它只调用函数,而不是运算符或宏)。而且不仅存在if操作符,还存在上述defun所依赖的if函数。
    猜你喜欢
    • 2014-08-12
    • 2016-01-13
    • 1970-01-01
    • 2018-01-29
    • 2017-01-21
    • 1970-01-01
    • 2015-03-20
    • 1970-01-01
    • 2021-05-27
    相关资源
    最近更新 更多