Warm tip: This article is reproduced from serverfault.com, please click

comparison-在Lisp中将变量与字符进行比较

(comparison - Comparing a variable to a character in Lisp)

发布于 2020-12-02 18:43:53

我是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)))

因此,我在函数中加入了运算符。不要介意数字。可以肯定的是,这里的calculate函数。

(defun calculate (l)
  (if (and (numberp (car l)) (not (null l)) )
      (car l)
    ( evaluate (car l) (calculate (cdr l) ) 
    (calculate (cdr l) ) )
  )
)
Questioner
Stefan
Viewed
0
Svante 2020-12-03 09:47:35

calculate编写方式是,这个值的(- (* (+ 4 4) (+ 4 4)) (* (+ 4 4) (+ 4 4)))值为0。我不知道你期望什么,但是让我们看一下跟踪(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 (cdr l))inside的两个调用calculate始终会产生相同的结果,这将对你有所帮助

旁注: