【问题标题】:Comparing a variable to a character in Lisp将变量与 Lisp 中的字符进行比较
【发布时间】:2021-03-14 18:34:24
【问题描述】:

我是 lisp 编程的新手,我正在尝试比较一个变量,比如说 op 与字符 +、-、*、/。但在所有方面我写的正确结果都没有出现。我该如何重写以下代码:

(defun evaluate(op o1 o2)
  (cond
    ( (string= op `+) (+ o1 o2))
    ( (string= op `-) (- o1 o2))
    ( (string= op `*) (* o1 o2))
    ( (string= op `/) (/ o1 o2))
  )
)

输入是:

(print (calculate `(- * + 4 3 2 5)))

所以我在我的函数中加入了操作符字符。不要介意数字。 确定这里是计算函数。

(defun calculate (l)
  (if (and (numberp (car l)) (not (null l)) )
      (car l)
    ( evaluate (car l) (calculate (cdr l) ) 
    (calculate (cdr l) ) )
  )
)

【问题讨论】:

  • 您只用两个参数调用evaluate。它需要 3 个参数。
  • evaluate 写对了,问题出在calculate
  • 然而,你不应该使用string=,使用eql。您的输入都不是字符串,它们是符号和数字。

标签: comparison character lisp common-lisp clisp


【解决方案1】:

calculate的写法,这个求值(- (* (+ 4 4) (+ 4 4)) (* (+ 4 4) (+ 4 4))),也就是0。不知道你期待什么,但我们看一下tracing(SO>是repl提示符):

SO> (trace evaluate calculate)
(EVALUATE CALCULATE)
SO> (calculate '(- * + 4 3 2 5))
  0: (SO::CALCULATE (- * + 4 3 2 5))
    1: (SO::CALCULATE (* + 4 3 2 5))
      2: (SO::CALCULATE (+ 4 3 2 5))
        3: (SO::CALCULATE (4 3 2 5))
        3: CALCULATE returned 4
        3: (SO::CALCULATE (4 3 2 5))
        3: CALCULATE returned 4
        3: (SO::EVALUATE + 4 4)
        3: EVALUATE returned 8
      2: CALCULATE returned 8
      2: (SO::CALCULATE (+ 4 3 2 5))
        3: (SO::CALCULATE (4 3 2 5))
        3: CALCULATE returned 4
        3: (SO::CALCULATE (4 3 2 5))
        3: CALCULATE returned 4
        3: (SO::EVALUATE + 4 4)
        3: EVALUATE returned 8
      2: CALCULATE returned 8
      2: (SO::EVALUATE * 8 8)
      2: EVALUATE returned 64
    1: CALCULATE returned 64
    1: (SO::CALCULATE (* + 4 3 2 5))
      2: (SO::CALCULATE (+ 4 3 2 5))
        3: (SO::CALCULATE (4 3 2 5))
        3: CALCULATE returned 4
        3: (SO::CALCULATE (4 3 2 5))
        3: CALCULATE returned 4
        3: (SO::EVALUATE + 4 4)
        3: EVALUATE returned 8
      2: CALCULATE returned 8
      2: (SO::CALCULATE (+ 4 3 2 5))
        3: (SO::CALCULATE (4 3 2 5))
        3: CALCULATE returned 4
        3: (SO::CALCULATE (4 3 2 5))
        3: CALCULATE returned 4
        3: (SO::EVALUATE + 4 4)
        3: EVALUATE returned 8
      2: CALCULATE returned 8
      2: (SO::EVALUATE * 8 8)
      2: EVALUATE returned 64
    1: CALCULATE returned 64
    1: (SO::EVALUATE - 64 64)
    1: EVALUATE returned 0
  0: CALCULATE returned 0
0

最后的 0 是结果。在这些数字中,只有第一个被触及,我猜你也打算使用其他的。

指出在calculate 内部对(calculate (cdr l)) 的两次调用总是会产生相同的结果。

旁注:

【讨论】:

  • 好的,感谢您的跟踪。我希望它能够计算列表 l 中给出的前缀符号算术表达式。我希望该列表通过引用传递,并且首先完成的所有 cdr 都将在第二次调用中看到。
猜你喜欢
  • 2018-03-17
  • 1970-01-01
  • 2015-08-14
  • 2015-10-03
  • 2015-11-21
  • 2018-05-01
  • 1970-01-01
  • 2018-01-23
  • 2022-01-15
相关资源
最近更新 更多