首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何添加一个新的特殊化器到cl-defmethod应用到多个主要模式?

如何添加一个新的特殊化器到cl-defmethod应用到多个主要模式?
EN

Stack Overflow用户
提问于 2020-02-16 07:32:28
回答 1查看 108关注 0票数 0

如何扩展cl-defmethod以匹配多个major-mode?在cl-generic中有一些文档,但我不明白泛型器宏是怎么回事。

举个例子,

代码语言:javascript
复制
(cl-defgeneric my-gen-fun (arg)
  (message "%S" arg))

;; define this so it wouldn't affect other cc-derived modes, eg. java, awk, etc.
(cl-defmethod my-gen-fun (&context (major-mode c-mode c++-mode) arg)
  (message "c-%S" arg))

我希望(my-gen-fun arg)c-modec++-mode中都只打印"c-“,而不是其他cc派生的模式,如java-modeawk-mode。如何添加新的specializer来处理这种情况?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-02-17 00:05:15

&context%optional的相似之处在于,它也适用于所有后续的参数,因此它必须位于参数之后。

但是,(major-mode <foo>-mode)并没有像您所建议的那样扩展到(major-mode <foo>-mode <bar>-mode) (尽管不可否认,它是一个自然的扩展)。因此,您必须调用cl-defmethod两次。如果主体很大,您可能应该将其放入一个单独的函数中:

代码语言:javascript
复制
(defun my-gen-fun-c-body (arg)
  (message "c-%S" arg))

;; define this so it wouldn't affect other cc-derived modes, eg. java, awk, etc.
(cl-defmethod my-gen-fun (arg &context (major-mode c-mode))
   (my-gen-fun-c-body arg))
(cl-defmethod my-gen-fun (arg &context (major-mode c++-mode))
   (my-gen-fun-c-body arg))

我确实有一个cl-generic.el的本地补丁,它添加了你建议的“多个主要模式”功能,但在查看之后,我发现它是一种黑客行为,并引入了各种角落问题。

一些角落案例问题与CLOS不提供像orand这样的特殊化器的事实有关:

代码语言:javascript
复制
(defmethod foo ((x (or (eql 4) cons))) ...)

这是因为它可能使它“不可能”找到适用方法的合理排序(例如,上面的特殊化器比(x list)(x (or (eql 5) cons))更具体还是更具体?)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60244133

复制
相关文章

相似问题

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