Common lisp 检查参数的类型,但不使用COND、IF、WHEN、除非或CASE

Common lisp 检查参数的类型,但不使用COND、IF、WHEN、除非或CASE,common-lisp,Common Lisp,当输入为数字时,我有一个功能可以正常工作:如果两个输入具有相同的符号,则返回T,否则返回NIL。但是,当我给出例如两个'a时,我得到以下错误: a不是一个真实的数字 我发现在不使用COND、IF、WHEN、除非或CASE的情况下对非数字进行归档很困难。这是我到目前为止的函数定义 (defun same-sign (x y) (or (and (>= x 0) (>= y 0)) (and (< x 0) (< y 0)))) (取消相同符号(x y) (

当输入为数字时,我有一个功能可以正常工作:如果两个输入具有相同的符号,则返回
T
,否则返回
NIL
。但是,当我给出例如两个
'a
时,我得到以下错误:

a不是一个真实的数字

我发现在不使用
COND
IF
WHEN
除非
CASE
的情况下对非数字进行归档很困难。这是我到目前为止的函数定义

(defun same-sign (x y)
  (or (and (>= x 0) (>= y 0))
      (and (< x 0) (< y 0))))
(取消相同符号(x y)
(或(和(>=x0)(>=y0))
(和(
您的意思可能是type
real
而不是
number
。类型
数字
实数
(整数和浮点数)和
复数
(2个实数分量)值组成。复数的一个例子是
#C(12)=1+2i

请尝试
(and(realp x))
过滤
实数
数字,相当于
(and(typep x'real)


此外,
(typecase x(real…)
或使用泛型函数和
(defmethod foo((x real))
也可以工作,除非您似乎想限制自己使用基本的逻辑运算符。

您可能指的是type
real
,而不是
number
。类型
数字
实数
(整数和浮点数)和
复数
(2个实数分量)值组成。复数的一个例子是
#C(12)=1+2i

(defun same-sign (x y)
    (and (typep x 'real) (typep y 'real)
    (or (and (>= x 0) (>= y 0))
        (and (< x 0) (< y 0)))))
请尝试
(and(realp x))
过滤
实数
数字,相当于
(and(typep x'real)

此外,
(typecase x(real…)
或使用泛型函数和
(defmethod foo((x real))
也可以工作,除非您似乎想限制自己使用基本逻辑运算符。

(defun same sign(x y))
(defun same-sign (x y)
    (and (typep x 'real) (typep y 'real)
    (or (and (>= x 0) (>= y 0))
        (and (< x 0) (< y 0)))))
(和(typep x’real)(typep y’real) (或(和(>=x0)(>=y0)) (和(
(取消相同符号(x y)
(和(typep x’real)(typep y’real)
(或(和(>=x0)(>=y0))
(和(
您可以使用
检查类型

(defun same-sign (x y)
  (check-type real x)
  (check-type real y)
  (= (signum x) (signum y)))
由于也可以处理复数,因此如果对应用程序有意义,可以在此处使用
number
而不是
real

Signum
单独处理
0
,因此您可以使用
minssp
(包装以可能取消布尔值的泛化):


如您所见,通过将检查放入更详细的函数中,可以避免编写两个检查。但是,您可以想象,
minssp
已经有了这样一个检查,因此您可以合理地确定,如果您不使用reals调用它,无论如何都会发出相应类型错误的信号。

您可以使用
检查类型

(defun same-sign (x y)
  (check-type real x)
  (check-type real y)
  (= (signum x) (signum y)))
由于也可以处理复数,因此如果对应用程序有意义,可以在此处使用
number
而不是
real

Signum
单独处理
0
,因此您可以使用
minssp
(包装以可能取消布尔值的泛化):


如您所见,通过将检查放入更详细的函数中,可以避免编写两个检查。但是,您可以想象,
minssp
已经有了这样一个检查,因此您可以合理地确定,如果您不使用reals调用它,无论如何都会发出相应类型错误的信号。

当给定非数字时,除了错误之外,还会发生什么?如果输入了“a”,则返回nil。如果输入x,则输入一个变量,则会出错。不知道怎么处理。然而,这不是一个测试用例。不知道我会怎么处理。我贴了一个答案,看看吧@为什么不
(定义相同的符号(xy)(=(符号x)(符号y)))
?当给定非数字时,除了一个错误之外,会发生什么?如果输入“a”,则返回nil。如果输入x,则会出现一个错误。不知道怎么处理。然而,这不是一个测试用例。不知道我会怎么处理。我贴了一个答案,看看吧@为什么不
(定义相同的符号(xy)(=(符号x)(符号y)))
?在这种情况下,
nil
可能意味着“输入是符号不等的实数”或“输入不是所有实数”。如果你只关心T结果,那就好了。但在一般情况下,调用代码总是需要解码
nil
的含义,例如通过检查两个输入是否为真(再次)。在我看来,这不是一个伟大的设计。如果函数不能为某些输入返回合理的输出,最好让函数失败并出现错误(或二次值)。回答它@zut检查一下。在这种情况下,
nil
可能意味着“输入是不等号的实数”或“输入不都是实数”。如果你只关心T结果,那就好了。但在一般情况下,调用代码总是需要解码
nil
的含义,例如通过检查两个输入是否为真(再次)。在我看来,这不是一个伟大的设计。如果函数不能为某些输入返回合理的输出,最好让函数失败并出现错误(或二次值)。回答它@zut检查一下。请使用缩进。虽然这可能回答了作者的问题,但它缺少一些解释性的词语和/或指向文档的链接。如果没有一些短语,原始代码片段就没有多大帮助。你也会发现这很有帮助。请编辑您的答案-请使用缩进。虽然这可能回答了作者的问题,但它缺少一些解释性的词语和/或指向文档的链接。如果没有一些短语,原始代码片段就没有多大帮助。你也会发现这很有帮助。请编辑你的答案-