Function 展开defmethod语句的eql子句以接受任何函数?

Function 展开defmethod语句的eql子句以接受任何函数?,function,lisp,common-lisp,clos,Function,Lisp,Common Lisp,Clos,几天前,我了解了defmethod参数规范语法的eql子句。明确指出,eql标记的存在是语法的基本部分。例如,在CLISP中尝试以下操作时出现错误: (defgeneric q (a)) (defmethod q ((a (eql 0))) ;standard eql clause syntax, all is well (print "Method called with eql a 0")) (defmethod q ((a (< 0))

几天前,我了解了
defmethod
参数规范语法的eql子句。明确指出,
eql
标记的存在是语法的基本部分。例如,在CLISP中尝试以下操作时出现错误:

(defgeneric q (a))

(defmethod q ((a (eql 0)))                  ;standard eql clause syntax, all is well
     (print "Method called with eql a 0"))

(defmethod q ((a (< 0)))                    ;trying to use < instead of eql
     (print "Method called with < 0 a"))


;=> *** - DEFMETHOD Q: Invalid specializer (< 0) in lambda list ((A (< 0)))

EQL机制允许分派在单个对象上工作

允许任意谓词不是标准公共Lisp的一部分。使其适合CLOS调度也不是一件小事

Haskell部分是不可比较的,因为Common Lisp中的泛型函数是一种面向对象的机制(具有多分派、继承和方法组合),并且工作方式不同

您正在寻找的是谓词分派

存在扩展。请参阅:

还有一篇文章“面向对象Lisp中的自定义专门化程序”
q a
    | a == 0 = putStrLn "Method called with eql 0 a"
    | 0 < a = putStrLn "Method called with < 0 a"