Heredoc или эквивалентный многострочный синтаксис строки в Elisp?

10

В общем-lisp у нас есть библиотека cl-heredoc , есть ли эквивалент в EmacsLisp?

ocodo
источник
В Emacs Lisp нет макросов для чтения, так что, в общем, я бы сказал, что нет. Но, возможно, если бы вы также подробно остановились на том, что вы собираетесь делать с ними, может быть альтернативный подход.
wvxvw
1
@wvxvw Я, вероятно, могу делать то, что мне нужно, с многострочной строкой в ​​кавычках, только выход из внутренних кавычек - единственное раздражение.
ocodo
3
Ну, строки многострочные в ELisp. Один из способов обработки кавычек внутри кавычек - использовать что-то вроде (format "next word is quoted %S" "word").
wvxvw
@wvxvw Я не знал, что% S сделал это, я попробую. Звучит идеально, спасибо! Сделай ответ, и я приму это.
ocodo
«% S» очень похож на format ~sдирективу CL (то есть prin1). Таким образом, он напечатает свой аргумент способом, подходящим для читателя, для строк, которые будут с кавычками.
wvxvw

Ответы:

6

Обычные строки Emacs Lisp поддерживают несколько строк. Вы можете просто вставить новые строки в них.

Глядя на cl-heredocэто, звучит так, как будто вы ищете "сырые" строки. Было предложение добавить их в elisp некоторое время назад, но, к сожалению, оно было отклонено. (Я надеюсь, а не ожидать, что он может быть воскрешен.) Также у elisp нет функций расширения читателя, необходимых для его реализации.

Том Тромей
источник
В прошлый раз, когда поднималась тема пользовательских макросов читателя, все высказались за. Поэтому я уверен, что единственным препятствием является человеческое усилие.
Малабарба
2

Если вы конфигурируете emacs через файл init.el, вы можете использовать вместо него init.org .

Затем вы можете использовать конструкции, подобные следующим:

#+NAME: arbitrary-text
#+begin_src xml
<some>
  <random src="xml">or whatever... includes syntax highlighting!</random>
</some>
#+end_src


#+begin_src emacs-lisp :var arb-text=arbitrary-text
(eval `(defun a-test ()
         (format "whoop there it is: %S" ,arb-text)))
#+end_src

Если вы посмотрите в сгенерированный .elфайл, вы увидите что-то вроде:

(let ((arb-text "escaped text here..."))
  (eval `(defun a-test ()
           (format "whoop there it is: %S" ,arb-text))))

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

Если это для библиотеки, где вы, возможно, не захотите заставлять соавторов также использовать «грамотное программирование», тогда вы можете поместить большую часть кода в .elфайл и сгенерировать вспомогательный .elфайл, используя Org - проверить сгенерированный код в системе контроля версий.

Фосфорорганическая фаза
источник
3
Может быть, я что-то упускаю, но я не вижу, что init.org имеет отношение к многострочным строкам.
Малабарба
1
@Malabarba: tl; dr: если вы пишете свой elisp в режиме org, вы можете сделать что-то, напоминающее heredocs; в противном случае вы должны избегать некоторых вещей внутри своих многострочных строковых литералов - в основном ` and "`, iirc.
SamB
Это интересный способ обойти проблему, но слишком сложный для моих случаев.
ocodo