emacs define-generic-mode, почему нельзя использовать 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. казнить define-generic-mode позвонить в *Scratch* буфер
  2. Переключиться в буфер с некоторыми тестируемыми ключевыми словами
  3. M-x mytest-mode

2 ответа

Решение
(define-generic-mode 'mytest-mode
  '("//") nil
  `(
    (,(regexp-opt '("int" "string" "bool")) . 'font-lock-type-face)
    )
  nil nil "mytest mode"
  )

Это потому, что призыв к regexp-opt находится внутри списка в кавычках, поэтому он не рассматривается как вызов функции.

Вы можете создать список, используя такие функции, как list или используйте обратные кавычки, где , означает, что следующая форма должна быть оценена.

`(
   (,(regexp-opt '("int" "string" "integer" "bool" "boolean" "float")) . 'font-lock-type-face)
)
Другие вопросы по тегам