0

我正在尝试使用define-generic-mode. 我找到

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

不管用。但是,如果我将regexp-optcall 替换为其手动计算的结果,那么一切都按预期工作:

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

那么,为什么我不能只regexp-opt在模式定义中加入 call 呢?

编辑

从 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. define-generic-mode*Scratch*缓冲区中执行调用
  2. 使用一些正在测试的关键字切换到缓冲区
  3. M-x mytest-mode
4

2 回答 2

2

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

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

`(
   (,(regexp-opt '("int" "string" "integer" "bool" "boolean" "float")) . 'font-lock-type-face)
)
于 2016-08-22T10:59:46.857 回答
1
(define-generic-mode 'mytest-mode
  '("//") nil
  `(
    (,(regexp-opt '("int" "string" "bool")) . 'font-lock-type-face)
    )
  nil nil "mytest mode"
  )
于 2017-08-06T00:14:57.117 回答