首页 文章

常见的lisp CLOS调度

提问于
浏览
0

是否有一种很好的方法可以让一个通用函数在列表的车上发送?

我一直致力于一个符号代数程序,目前我正在将大量数据存储为具有不同关键字的列表,如 car 来表示类型 . 例如,我将单纯形式存储为 '(:simplex #(0 1 2)) ,并且我有一些我正在调用的步骤,将其存储为 '(:step #(0 1 0 1)) . 我希望能够采用这两者的维度和边界,理想情况下使用一些内置的调度机制 .

1 回答

  • 2

    有点hacky,但你可以用 eql 专家来做这件事 .

    (defmethod foo ((first (eql :simplex)) (thing vector))
       <method body here>)
    

    然后你必须把它称之为

    (foo :step #(0 1 0 1))
    

    要么

    (apply #'foo '(:step #(0 1 0 1)))
    

    所以,对于你的情况,你会做类似的事情

    (defmethod dimension ((type (eql :simplex)) (thing vector))
      ;; calculate dimension of a SIMPLEX here
      )
    
    (defmethod dimension ((type (eql :step)) (thing vector))
      ;; calculate dimension of a STEP here
      )
    

    boundary 相同 .

    如果您正在处理的事情确实是不同的结构,您可以考虑定义 structclass 而不是使用原始列表 . 此时,您可以轻松地在适当的类型上定义方法,这可以让您回避这种方法的尴尬调用要求 .

相关问题