首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通用Lisp:从泛型函数中提取方法

通用Lisp:从泛型函数中提取方法
EN

Stack Overflow用户
提问于 2017-03-06 09:35:06
回答 1查看 486关注 0票数 3

是否有方法从通用Lisp中的泛型函数中提取方法列表?

例如:

代码语言:javascript
复制
(defmethod say ((self string)) ; method-0
  (format t "Got string: ~a~%" self))

(defmethod say ((self integer)) ; method-1
  (format t "Got integer: ~a~%" self))

(defmethod say ((self symbol)) ; method-2
  (format t "Got symbol: ~a~%" self))

(extract-methods-from-generic 'say) ; -> (method-0-obj method-1-obj method-2-obj)

更具体地说,我的目标是ECL,所以如果这可以通过can实现--没关系。

我需要这个来做下一招:

代码语言:javascript
复制
(defgeneric merged-generic ())

(loop for method
      in (extract-methods-from-generic 'some-generic-0)
      do (add-method merged-generic method))
(loop for method
      in (extract-methods-from-generic 'some-generic-1)
      do (add-method merged-generic method))
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-06 10:09:57

在CLOS中可以使用泛型函数generic-function-methods来获取泛型函数的所有方法(请参见CLOS协议),但请注意,对于问题的第二部分,只有当方法与任何其他泛型函数分离(参见协议)时,才能将方法附加到泛型函数(带有add-method):

如果方法已经与其他泛型函数相关联,则还会发出错误信号。

您可以通过包近亲拖把使用这两个函数,而不依赖于任何实现:

代码语言:javascript
复制
CL-USER> (ql:quickload "closer-mop") 
("closer-mop")
CL-USER> (in-package :closer-mop)
#<Package "CLOSER-MOP">
C2MOP> (defgeneric say (x))
#<COMMON-LISP:STANDARD-GENERIC-FUNCTION SAY #x30200176712F>
C2MOP> (defmethod say ((self string)) ; method-0
  (format t "Got string: ~a~%" self))

(defmethod say ((self integer)) ; method-1
  (format t "Got integer: ~a~%" self))

(defmethod say ((self symbol)) ; method-2
  (format t "Got symbol: ~a~%" self))
#<COMMON-LISP:STANDARD-METHOD SAY (SYMBOL)>
C2MOP> (generic-function-methods #'say)
(#<COMMON-LISP:STANDARD-METHOD SAY (SYMBOL)> #<COMMON-LISP:STANDARD-METHOD SAY (INTEGER)> #<COMMON-LISP:STANDARD-METHOD SAY (STRING)>)
C2MOP> (defgeneric merged-generic (x))
#<COMMON-LISP:STANDARD-GENERIC-FUNCTION MERGED-GENERIC #x30200181B74F>
C2MOP> (add-method #'merged-generic (first **))

#<COMMON-LISP:STANDARD-METHOD SAY (SYMBOL)> is already a method of #<COMMON-LISP:STANDARD-GENERIC-FUNCTION SAY #x30200165863F>.
   [Condition of type SIMPLE-ERROR]
; Evaluation aborted on #<SIMPLE-ERROR #x3020016719FD>.
CL-USER> (let ((first-method (first (generic-function-methods #'say))))
           (remove-method #'say first-method)
           (add-method #'merged-generic first-method))
#<COMMON-LISP:STANDARD-GENERIC-FUNCTION MERGED-GENERIC #x302000DC54DF>
CL-USER> (merged-generic "a string")
Got string: a string
NIL
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42622038

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档