В 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 - проверить сгенерированный код в системе контроля версий.
Может быть, я что-то упускаю, но я не вижу, что init.org имеет отношение к многострочным строкам.
Малабарба
1
@Malabarba: tl; dr: если вы пишете свой elisp в режиме org, вы можете сделать что-то, напоминающее heredocs; в противном случае вы должны избегать некоторых вещей внутри своих многострочных строковых литералов - в основном ` and "`, iirc.
SamB
Это интересный способ обойти проблему, но слишком сложный для моих случаев.
(format "next word is quoted %S" "word")
.format
~s
директиву CL (то естьprin1
). Таким образом, он напечатает свой аргумент способом, подходящим для читателя, для строк, которые будут с кавычками.Ответы:
Обычные строки Emacs Lisp поддерживают несколько строк. Вы можете просто вставить новые строки в них.
Глядя на
cl-heredoc
это, звучит так, как будто вы ищете "сырые" строки. Было предложение добавить их в elisp некоторое время назад, но, к сожалению, оно было отклонено. (Я надеюсь, а не ожидать, что он может быть воскрешен.) Также у elisp нет функций расширения читателя, необходимых для его реализации.источник
Если вы конфигурируете emacs через файл init.el, вы можете использовать вместо него init.org .
Затем вы можете использовать конструкции, подобные следующим:
Если вы посмотрите в сгенерированный
.el
файл, вы увидите что-то вроде:Вы можете поместить текст и код в любом порядке. Вы можете добавлять имена в списки организаций, таблицы и т. Д.
Если это для библиотеки, где вы, возможно, не захотите заставлять соавторов также использовать «грамотное программирование», тогда вы можете поместить большую часть кода в
.el
файл и сгенерировать вспомогательный.el
файл, используя Org - проверить сгенерированный код в системе контроля версий.источник
` and
"`, iirc.