Sintassi Heredoc o stringa multilinea equivalente in Elisp?


10

In common-lisp abbiamo la libreria cl-heredoc , esiste un equivalente in EmacsLisp?


Emacs Lisp non ha le macro dei lettori, quindi, dalla parte superiore della mia testa direi di no, non c'è. Ma forse se avessi anche elaborato cosa avresti fatto con questi, potrebbe esserci un approccio alternativo.
wvxvw,

1
@wvxvw Probabilmente posso fare quello che mi serve con una stringa tra virgolette multilinea, solo sfuggire alle virgolette interne è l'unica irritazione.
ottobre

3
Bene, le stringhe sono multilinea in ELisp. Un modo per gestire le virgolette all'interno delle virgolette sarebbe attraverso qualcosa di simile (format "next word is quoted %S" "word").
wvxvw,

@wvxvw Non sapevo che% S lo avesse fatto, lo proverò. Sembra ideale grazie! Dagli una risposta e la accetterò.
ocodo

"% S" è molto simile alla format ~sdirettiva CL (es prin1.). Quindi, stamperà il suo argomento in un modo adatto al lettore, per stringhe che sarebbero tra virgolette.
wvxvw,

Risposte:


6

Le stringhe ordinarie di Emacs Lisp sono multilinea. Puoi semplicemente inserire nuove righe in esse.

Dando un'occhiata cl-heredoc, sembra che quello che stai cercando siano stringhe "grezze". C'è stata una proposta per aggiungerli a Elisp qualche tempo fa, ma sfortunatamente è stato respinto. (Spero piuttosto che aspettarmi che possa essere resuscitato.) Né elisp ha le funzionalità di estensibilità del lettore necessarie per implementare questo.


L'ultima volta che è emerso l'argomento delle macro dei lettori definite dall'utente, tutti sembravano favorevoli. Quindi sono sicuro che l'unico ostacolo è lo sforzo umano.
Malabarba,

2

Se stai configurando emacs tramite un file init.el, potresti prendere in considerazione l'utilizzo di init.org .

Quindi puoi usare costrutti come i seguenti:

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

Se guardi nel .elfile generato vedrai qualcosa di simile:

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

Puoi inserire il testo e il codice in qualsiasi ordine. Puoi aggiungere nomi a elenchi di organizzazioni, tabelle, ecc.

Se questo è per una libreria in cui potresti non voler forzare i collaboratori a usare anche la 'programmazione alfabetica', allora potresti mettere la maggior parte del codice in un .elfile e generare un .elfile ausiliario usando Org - controlla il codice generato nel controllo di revisione.


3
Forse mi manca qualcosa, ma non vedo cosa c'entri init.org con le stringhe multi linea.
Malabarba,

1
@Malabarba: tl; dr: se scrivi il tuo elisp in modalità org, puoi fare qualcosa che ricorda gli heredocs; in caso contrario, devi fuggire alcune cose all'interno dei tuoi letterali a più righe - per lo più ` and "`, iirc.
SamB

Questo è un modo interessante per aggirare il problema, ma un po 'troppo contorto per i miei casi.
ocodo,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.