Heredoc ou syntaxe de chaîne multiligne équivalente dans Elisp?


10

Dans common-lisp, nous avons la bibliothèque cl-heredoc , y a -t -il un équivalent dans EmacsLisp?


Emacs Lisp n'a pas de macros de lecture, donc, je dirais que non, il n'y en a pas. Mais peut-être que si vous expliquiez également ce que vous alliez en faire, il pourrait y avoir une approche alternative.
wvxvw

1
@wvxvw Je peux probablement faire ce dont j'ai besoin avec une chaîne entre guillemets multilignes, juste échapper des guillemets intérieurs est la seule irritation.
ocodo

3
Eh bien, les chaînes sont multilignes dans ELisp. Une façon de gérer les guillemets à l'intérieur des guillemets serait d'utiliser quelque chose comme (format "next word is quoted %S" "word").
wvxvw

@wvxvw Je ne savais pas que% S avait fait ça, je vais essayer. Cela semble idéal merci! Faites-en une réponse, et je l'accepterai.
ocodo

"% S" est très similaire à la format ~sdirective CL (ie prin1). Ainsi, il imprimera son argument d'une manière adaptée au lecteur, pour les chaînes qui seraient avec des guillemets.
wvxvw

Réponses:


6

Les chaînes Lisp Emacs ordinaires sont capables de plusieurs lignes. Vous pouvez simplement y mettre des retours à la ligne.

En regardant cl-heredoc, il semble que ce que vous recherchez soit des cordes "brutes". Il a été proposé de les ajouter à elisp il y a un certain temps, mais malheureusement, elle a été rejetée. (J'espère plutôt que de m'attendre à ce qu'il puisse être ressuscité.) Elisp n'a pas non plus les fonctionnalités d'extensibilité du lecteur nécessaires pour l'implémenter.


La dernière fois que le sujet des macros de lecture définies par l'utilisateur a été abordé, tout le monde semblait en faveur. Je suis donc sûr que le seul obstacle est l'effort humain.
Malabarba

2

Si vous configurez emacs via un fichier init.el, vous pouvez envisager d'utiliser plutôt init.org .

Ensuite, vous pouvez utiliser des constructions comme les suivantes:

#+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 vous regardez dans le .elfichier généré , vous verrez quelque chose comme:

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

Vous pouvez mettre le texte et le code dans n'importe quel ordre. Vous pouvez ajouter des noms aux listes d’organisations, aux tableaux, etc.

Si cela concerne une bibliothèque où vous ne souhaitez peut-être pas forcer les collaborateurs à utiliser également la `` programmation alphabétisée '', vous pouvez mettre la majeure partie du code dans un .elfichier et générer un .elfichier auxiliaire à l'aide d'Org - vérifiez le code généré dans le contrôle de révision.


3
Peut-être que je manque quelque chose, mais je ne vois pas ce que init.org a à voir avec les chaînes multi-lignes.
Malabarba

1
@Malabarba: tl; dr: si vous écrivez votre elisp en mode org, vous pouvez faire quelque chose qui rappelle les heredocs; sinon, vous devez échapper à certaines choses à l'intérieur de vos littéraux de chaîne multi-lignes - principalement ` and "`, iirc.
SamB

C'est une manière intéressante de contourner le problème, mais un peu trop compliquée pour mes cas.
ocodo
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.