Heredoc oder gleichwertige mehrzeilige String-Syntax in Elisp?

10

In Common-Lisp haben wir die Bibliothek cl- heredoc. Gibt es ein Äquivalent in EmacsLisp?

ocodo
quelle
Emacs Lisp hat keine Lesermakros, also würde ich auf den ersten Blick nein sagen, das gibt es nicht. Aber vielleicht könnte es einen alternativen Ansatz geben, wenn Sie auch näher erläutern, was Sie damit machen würden.
wvxvw
1
@wvxvw Ich kann wahrscheinlich mit einer mehrzeiligen Zeichenfolge in Anführungszeichen tun, was ich brauche. Nur innere Anführungszeichen zu umgehen, ist die einzige Irritation.
ocodo
3
Nun, Strings sind in ELisp mehrzeilig. Eine Möglichkeit, mit Anführungszeichen in Anführungszeichen umzugehen, wäre so etwas wie (format "next word is quoted %S" "word").
wvxvw
@wvxvw Ich wusste nicht, dass% S das getan hat, ich werde es versuchen. Klingt ideal, danke! Machen Sie eine Antwort, und ich werde es akzeptieren.
ocodo
"% S" ist der CL- format ~sDirektive (dh prin1) sehr ähnlich . Es wird also sein Argument so drucken, dass es für den Leser geeignet ist, für Zeichenfolgen, die in Anführungszeichen stehen.
wvxvw

Antworten:

6

Gewöhnliche Emacs Lisp-Saiten sind mehrzeilig. Sie können einfach Zeilenumbrüche einfügen.

Auf den ersten Blick cl-heredocklingt es so, als ob Sie nach "rohen" Saiten suchen. Es gab vor einiger Zeit einen Vorschlag, diese zu elisp hinzuzufügen, aber leider wurde er abgelehnt. (Ich hoffe, anstatt zu erwarten, dass es wiederbelebt werden kann.) Elisp verfügt auch nicht über die Erweiterungsfunktionen des Lesers, die erforderlich sind, um dies selbst zu implementieren.

Tom Tromey
quelle
Als das letzte Mal das Thema benutzerdefinierte Lesermakros angesprochen wurde, schienen alle dafür zu sein. Ich bin sicher, das einzige Hindernis ist die menschliche Anstrengung.
Malabarba
2

Wenn Sie Emacs über eine init.el-Datei konfigurieren, sollten Sie stattdessen init.org verwenden.

Dann können Sie Konstrukte wie die folgenden verwenden:

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

Wenn Sie in die generierte .elDatei schauen, sehen Sie Folgendes:

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

Sie können den Text und den Code in beliebiger Reihenfolge eingeben. Sie können Org-Listen, Tabellen usw. Namen hinzufügen.

Wenn dies für eine Bibliothek gilt, in der Sie Mitarbeiter möglicherweise nicht dazu zwingen möchten, auch "Literate Programming" zu verwenden, können Sie den Großteil des Codes in eine .elDatei einfügen und .elmithilfe von Org eine Zusatzdatei generieren. Überprüfen Sie den generierten Code in der Revisionskontrolle.

Organophosphat Phace
quelle
3
Vielleicht fehlt mir etwas, aber ich sehe nicht, was init.org mit mehrzeiligen Zeichenfolgen zu tun hat.
Malabarba
1
@Malabarba: tl; dr: Wenn Sie Ihr Elisp im Org-Modus schreiben, können Sie etwas tun, das an Heredocs erinnert. Andernfalls müssen Sie einigen Dingen in Ihren mehrzeiligen String-Literalen entkommen - meistens ` and "`, iirc.
SamB
Dies ist ein interessanter Weg, um das Problem zu umgehen, aber für meine Fälle etwas zu kompliziert.
ocodo