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"