【问题标题】:CLisp error: "(x) is not number"CLisp 错误:“(x) 不是数字”
【发布时间】:2015-08-10 18:50:30
【问题描述】:

这是我应该为 * 和 + 操作实现中缀评估的函数。

(defun calculate(l)
    (cond
        ((eql (cadr l) '+) (+ (car l) (cddr l)))
        ((eql (cadr l) '*) (- (car l) (cddr l)))
    )
)

当我使用列表 '(3 + 4) 运行它时,它给我一个错误,说“(4) 不是数字”。任何想法可能是什么问题?

【问题讨论】:

  • 有些函数名称更容易理解:CAR FIRST 更好。 CADR 是更好的第二。 CADDR 是更好的第三。

标签: lisp common-lisp infix-notation clisp infix-operator


【解决方案1】:

符号可以作为函数调用。因此,您的代码就是这样:

(defun calculate (l)
  (funcall (second l) (first l) (third l)))

(defun calculate (l)
  (destructuring-bind (arg1 op arg2)
      l
    (funcall op arg1 arg2)))

例子:

CL-USER 77 > (calculate '(20 + 30))
50

【讨论】:

  • 我也想过,但请注意,在原始代码中,仅允许 + 和 -... 应提供附加代码以检查是否仅将受支持的操作传递给 funcall。类似于(and (member op '(+ -)) (funcall op...)
  • @DiegoSevilla:当然,他可以添加它。应该不会太难。
【解决方案2】:

(cddr l) 的部分应该是(caddr l)。您必须访问列表的第一个元素,而不是列表。那么代码应该是:

(defun calculate(l)
    (cond
        ((eql (cadr l) '+) (+ (car l) (caddr l)))
        ((eql (cadr l) '*) (- (car l) (caddr l)))
    )
)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-04
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 2014-07-27
    • 2019-08-06
    • 2020-12-19
    相关资源
    最近更新 更多