Common Lisp - 类型检查两个变量

Mr.*_*ney 4 lisp common-lisp

嗨,我是 Common Lisp 的初学者。我想检查两个变量是否是整数。如果 n 和 m 都是整数,我希望它返回,-如果它是负数,0如果它是零,+如果它是正数,NIL如果它不是 n 和 m 的整数。我想出了如何用一个变量来做到这一点,但我似乎无法弄清楚如何用两个变量来做到这一点。谢谢。

这是接受数字参数并返回的代码,-如果它是负数,0如果它是零,+如果它是正数,NIL如果它不是整数:

(defun sign (n)
 (if(typep n 'integer)
    (cond ((< n 0) '-)
          ((= n 0) 0)
          ((> n 0) '+))))
Run Code Online (Sandbox Code Playgroud)

每个案例的输出是:

CL-USER> (sign 3) 

+

CL-USER> (sign -3) 

-

CL-USER> (sign 0) 

0

CL-USER> (sign 3.3)

NIL
Run Code Online (Sandbox Code Playgroud)

这是我用于检查两个变量的代码,我希望它检查 n 和 m 是否为整数,以及 n 和 m 是否为正、负或零:

(defun sign (n m)
 (if (and (typep n 'integer) (typep m 'integer))
  (cond (and ((< n 0) '-) ((< m 0) '-))
        (and ((= n 0) 0) ((= m 0) 0))
        (and ((> n 0) '+) ((> m 0) '+)) ))))
Run Code Online (Sandbox Code Playgroud)

Rai*_*wig 5

记住基本的 Lisp 语法。函数调用和一些基本表达式写成

(operator argument-0 argument-1 ... argument-n)
Run Code Online (Sandbox Code Playgroud)

对?

开括号,运算符,参数0 参数1 ...参数n,右括号。

现在,如果我们有(< n 0)(< m 0)如何将一个AND表情是什么样子?

(and (< n 0) (< m 0))
Run Code Online (Sandbox Code Playgroud)

但是你写:

and ((< n 0) '-) ((< m 0) '-)
Run Code Online (Sandbox Code Playgroud)

你有这些错误:

  • AND 表达式周围没有括号。
  • 参数表达式周围的额外括号。
  • '- 混合到参数表达式中。

现在COND预计:

(COND (testa1 forma0 forma1 ... forman)
      (testb1 formb1 formb1 ... formbn)
      ...
      (testm1 formm0 formm1 ... formmn))
Run Code Online (Sandbox Code Playgroud)

所以代替

(defun sign (n m)
  (if (and (typep n 'integer) (typep m 'integer))
      (cond (and ((< n 0) '-) ((< m 0) '-))
            (and ((= n 0)  0) ((= m 0)  0))
            (and ((> n 0) '+) ((> m 0) '+)))))
Run Code Online (Sandbox Code Playgroud)

顺便说一句,最后还有一个额外的括号。

我们写:

(defun sign (n m)
  (if (and (typep n 'integer) (typep m 'integer))
      (cond ((and (< n 0) (< m 0)) '-)
            .... )))
Run Code Online (Sandbox Code Playgroud)

它也可以使用谓词喜欢integerpminuspzeropplusp


Sil*_*olo 2

看来您的方法是正确的,只是迷失在括号中。你的每个cond案例看起来都像

(and ((< n 0) '-) ((< m 0) '-))
Run Code Online (Sandbox Code Playgroud)

我想你的意思是

((and (< n 0) (< m 0)) '-)
Run Code Online (Sandbox Code Playgroud)

其他两个案例也是如此。