emacs define-generic-mode 为什么不能使用 regexp-opt?

emacs define-generic-mode why cannot use regexp-opt?

我正在尝试使用 define-generic-mode 为语法突出显示创建简单的主要模式。我发现

(define-generic-mode 'mytest-mode
  '("//") nil
  '(
    ((regexp-opt '("int" "string" "bool")) . 'font-lock-type-face)
    )
  nil nil "mytest mode"
  )

不工作。但是如果我用手动计算的结果替换 regexp-opt 调用,那么一切都会按预期工作:

(define-generic-mode 'mytest-mode
  '("//") nil
  '(
    ("\(?:bool\|int\|string\)" . 'font-lock-type-face)
    )
  nil nil "mytest mode"
  )

那么,为什么我不能只在模式定义中放入 regexp-opt 调用?

编辑

Lindidancer 的回答中关于强制评估引用列表中项目的提示:

(define-generic-mode 'mytest-mode
  '("//") nil
  '(
    (,(regexp-opt '("int" "string" "bool")) 'font-lock-type-face)
    )
  nil nil "mytest mode"
  )

没有帮助:模式激活没有错误,但也没有突出显示

关于使用 list 函数形成列表的第二个提示:

(define-generic-mode 'mytest-mode
  '("//") nil
  (list
    ((regexp-opt '("int" "string" "bool")) 'font-lock-type-face)
    )
  nil nil "mytest mode"
  )

激活模式出错:(invalid-function (regexp-opt (quote ("int" "string" "bool"))))

尝试评估时出现同样的错误:

  (list
    ((regexp-opt '("int" "string" "bool")) 'font-lock-type-face)
    )

在临时缓冲区中。

编辑 1

(list (list (regexp-opt '("int" "string" "bool")) 'font-lock-type-face))

也没有帮助 - 没有错误,没有突出显示。

编辑 2

我的具体步骤是:

  1. *Scratch*缓冲区中执行define-generic-mode调用
  2. 切换到缓冲测试中的一些关键字
  3. M-x mytest-mode

因为对regexp-opt的调用在引用列表中,所以它不被视为函数调用。

您可以使用 list 等函数创建列表,也可以使用反引号,其中 , 表示应评估下一个表单。

`(
   (,(regexp-opt '("int" "string" "integer" "bool" "boolean" "float")) . 'font-lock-type-face)
)
(define-generic-mode 'mytest-mode
  '("//") nil
  `(
    (,(regexp-opt '("int" "string" "bool")) . 'font-lock-type-face)
    )
  nil nil "mytest mode"
  )