Heredoc o sintaxis de cadena multilínea equivalente en Elisp?


10

En common-lisp tenemos la biblioteca cl-heredoc , ¿hay un equivalente en EmacsLisp?


Emacs Lisp no tiene macros de lector, así que, fuera de mi alcance, diría que no, que no las hay. Pero tal vez si también elaboró ​​sobre qué haría con estos, podría haber un enfoque alternativo.
wvxvw

1
@wvxvw Probablemente pueda hacer lo que necesito con una cadena entre comillas multilínea, solo escapar de las comillas interiores es la única irritación.
ocodo

3
Bueno, las cadenas son multilínea en ELisp. Una forma de manejar comillas dentro de comillas sería a través de algo como (format "next word is quoted %S" "word").
wvxvw

@wvxvw No sabía que% S hizo eso, lo intentaré. Suena ideal gracias! Dale una respuesta y lo aceptaré.
ocodo 01 de

"% S" es muy similar a la format ~sdirectiva CL (es decir prin1). Por lo tanto, imprimirá su argumento de una manera adecuada para el lector, para cadenas que estarían entre comillas.
wvxvw 01 de

Respuestas:


6

Las cadenas ordinarias de Emacs Lisp tienen capacidad para varias líneas. Simplemente puede poner nuevas líneas en ellos.

Echando un vistazo cl-heredoc, parece que lo que estás buscando son cadenas "en bruto". Hubo una propuesta para agregarlos a Elisp hace un tiempo, pero desafortunadamente fue rechazada. (Espero en lugar de esperar que pueda resucitar). Elisp tampoco tiene las características de extensibilidad del lector necesarias para implementar esto.


La última vez que surgió el tema de las macros de lector definidas por el usuario, todos parecían estar a favor. Así que estoy seguro de que el único obstáculo es el esfuerzo humano.
Malabarba

2

Si está configurando emacs a través de un archivo init.el, puede considerar usar un init.org en su lugar.

Luego puede usar construcciones como las siguientes:

#+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

Si observa el .elarchivo generado , verá algo como:

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

Puede poner el texto y el código en cualquier orden. Puede agregar nombres a listas de organizaciones, tablas, etc.

Si se trata de una biblioteca en la que es posible que no desee obligar a los colaboradores a que también usen 'programación alfabetizada', entonces podría colocar la mayor parte del código en un .elarchivo y generar un .elarchivo auxiliar usando Org: verifique el código generado en el control de revisión.


3
Tal vez me falta algo, pero no veo qué tiene que ver init.org con cadenas de varias líneas.
Malabarba

1
@Malabarba: tl; dr: si escribe su elisp en modo org, puede hacer algo que recuerde a heredocs; de lo contrario, debe escapar de algunas cosas dentro de sus literales de cadena de varias líneas, principalmente ` and "`, iirc.
SamB

Esta es una forma interesante de solucionar el problema, pero demasiado complicada para mis casos.
ocodo 01 de
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.