Heredoc ou sintaxe de sequência multilinha equivalente no Elisp?

10

No common-lisp, temos a biblioteca cl-heredoc , existe um equivalente no EmacsLisp?

ocodo
fonte
O Emacs Lisp não tem macros de leitor, então, em cima da minha cabeça, eu diria que não, não há. Mas talvez se você também elaborasse o que faria com eles, poderia haver uma abordagem alternativa.
Wvxvw
11
@wvxvw Eu provavelmente posso fazer o que eu preciso com uma string com várias linhas, apenas escapar de aspas internas é a única irritação.
Ocodo 31/01
3
Bem, strings são multilinhas no ELisp. Uma maneira de lidar com aspas dentro de aspas seria através de algo como (format "next word is quoted %S" "word").
Wvxvw
@wvxvw Eu não sabia que% S fez isso, vou tentar. Parece ideal, obrigado! Faça uma resposta e eu aceito.
Ocodo
"% S" é muito semelhante à format ~sdiretiva CL (ou seja prin1). Portanto, ele imprimirá seu argumento de maneira adequada ao leitor, para strings que estariam entre aspas.
Wvxvw

Respostas:

6

As seqüências comuns do Emacs Lisp são compatíveis com várias linhas. Você pode simplesmente colocar novas linhas nelas.

Olhando para cl-heredoc, parece que o que você está procurando são cordas "cruas". Houve uma proposta para adicioná-los ao Elisp há um tempo, mas infelizmente ele foi rejeitado. (Espero que, em vez de esperar, possa ressuscitar.) A elisp também não tem os recursos de extensibilidade do leitor necessários para implementar isso sozinho.

Tom Tromey
fonte
Na última vez em que o tópico de macros de leitor definido pelo usuário surgiu, todos pareciam a favor. Então, eu tenho certeza que o único obstáculo é o esforço humano.
Malabarba
2

Se você estiver configurando o emacs através de um arquivo init.el, poderá considerar o uso de um init.org .

Então você pode usar construções como as seguintes:

#+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 você olhar no .elarquivo gerado , verá algo como:

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

Você pode colocar o texto e o código em qualquer ordem. Você pode adicionar nomes às listas, tabelas etc. da organização

Se for para uma biblioteca em que talvez você não queira forçar os colaboradores a usar 'programação alfabética', você poderá colocar a maior parte do código em um .elarquivo e gerar um .elarquivo auxiliar usando Org - verifique o código gerado no controle de revisão.

Fago de organofosfato
fonte
3
Talvez esteja faltando alguma coisa, mas não vejo o que o init.org tem a ver com cadeias de linhas múltiplas.
Malabarba 31/01
11
@ Malabarba: tl; dr: se você escrever seu elisp no modo organizacional, poderá fazer algo que lembra o heredocs; caso contrário, você precisará escapar de algumas coisas dentro de seus literais de strings de várias linhas - principalmente ` and "`, iirc.
SamB
Essa é uma maneira interessante de contornar o problema, mas um pouco complicada para os meus casos.
ocodo