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))
(和(
您的意思可能是typereal
而不是number
。类型数字
由实数
(整数和浮点数)和复数
(2个实数分量)值组成。复数的一个例子是#C(12)=1+2i
请尝试(and(realp x))
过滤实数
数字,相当于(and(typep x'real)
此外,(typecase x(real…)
或使用泛型函数和(defmethod foo((x real))
也可以工作,除非您似乎想限制自己使用基本的逻辑运算符。您可能指的是typereal
,而不是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检查一下。请使用缩进。虽然这可能回答了作者的问题,但它缺少一些解释性的词语和/或指向文档的链接。如果没有一些短语,原始代码片段就没有多大帮助。你也会发现这很有帮助。请编辑您的答案-请使用缩进。虽然这可能回答了作者的问题,但它缺少一些解释性的词语和/或指向文档的链接。如果没有一些短语,原始代码片段就没有多大帮助。你也会发现这很有帮助。请编辑你的答案-