Function 是否可以在SBCL/Common Lisp中在运行时检查/获取函数类型或其签名? (定义二进制数func() `(功能(编号)编号) (declaim(f类型二进制数func my add)) (取消我的添加(a b) (+(数字a)(数字b))) ;; 失败: (断言(typep#'my-add'二进制数func)) ;; 函数类型不是TYPEP的合法参数: ;; (功能(编号)(数值编号和剩余T)) ;; [简单错误类型的条件] ;; 失败: (键入“我的添加”(函数(编号)编号)) ;; 函数类型不是TYPEP的合法参数: ;; (功能(编号)(数值编号和剩余T)) ;; [简单错误类型的条件]

Function 是否可以在SBCL/Common Lisp中在运行时检查/获取函数类型或其签名? (定义二进制数func() `(功能(编号)编号) (declaim(f类型二进制数func my add)) (取消我的添加(a b) (+(数字a)(数字b))) ;; 失败: (断言(typep#'my-add'二进制数func)) ;; 函数类型不是TYPEP的合法参数: ;; (功能(编号)(数值编号和剩余T)) ;; [简单错误类型的条件] ;; 失败: (键入“我的添加”(函数(编号)编号)) ;; 函数类型不是TYPEP的合法参数: ;; (功能(编号)(数值编号和剩余T)) ;; [简单错误类型的条件],function,types,runtime,lisp,common-lisp,Function,Types,Runtime,Lisp,Common Lisp,有没有办法检查函数值的复合类型? (在Common Lisp中,我使用的是SBCL-1.5.0-x86-64-linux) 提前感谢。因为Common Lisp允许您编写函数,即使编译器无法确定函数的最小函数类型,编译器也无法始终检查函数是否具有特定类型。因此,唯一明智的行为是不检查类型 其次,这种最小类型可能不存在。考虑这个函数: (defun foo (key) (getf '(:red 1 :blue 2 :green 3 :yellow 4) key)) 它是否具有类型(函数(T)

有没有办法检查函数值的复合类型? (在Common Lisp中,我使用的是SBCL-1.5.0-x86-64-linux)


提前感谢。

因为Common Lisp允许您编写函数,即使编译器无法确定函数的最小函数类型,编译器也无法始终检查函数是否具有特定类型。因此,唯一明智的行为是不检查类型

其次,这种最小类型可能不存在。考虑这个函数:

(defun foo (key)
  (getf '(:red 1 :blue 2 :green 3 :yellow 4) key))
它是否具有类型
(函数(T)T)
(函数(T)(或null(整数14))
(函数((成员:红色:蓝色:绿色:黄色))(整数14))
。注:第二种和第三种类型都是正确的,但其中一种不是另一种的子类型

还要注意,要检查上面的第三种类型,需要准确了解
getf
的行为,这在本例中不太可能是真的,在一般情况下根本不可能是真的


编译器可以检查函数类型,因为编译器可以抱怨或放弃。对于不同的实现来说,使用运行时类型检查函数是完全不可移植的,因为运行时类型检查函数具有完全不同的行为。

我认为这可以用更好的措辞:仅仅因为不可能总是知道某件事的类型,并不意味着检查类型永远是不明智的:例如,编译器应该我可以照你说的做。最后一句话是关键:定义
typep
应该做什么基本上是不可能的,如果不定义编译器可以做什么类型推断,这将是一件非常糟糕的事情。谢谢,是的,明白了。但即使如此,我并不真的认为编译器做得很难,因为我们可以表达一个联合类型,比如
(或空整数)
(类似:)也许我真的不明白你的意思。或者,这可能只是编译器的设计决策,因为精确的类型推断会减慢其“编译类型”。。谢谢是的,对。也许我不应该问太多关于函数值类型的问题。:-)有趣的问题。也许值得解释一下你更高层次的目标。使用泛型函数会更好吗?如果性能需要,请使用
内联泛型函数
静态分派
<代码>(defmethod number adder((a number)(b number))(+ab))谢谢,我只是想确保函数值在运行时具有适用于参数的签名。(例如,在这些函数上的
funcall
之前选中
typep
),因为我想处理多个不同的函数值,它们应该具有相同的参数类型和返回类型。