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.
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.
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.
(format "next word is quoted %S" "word")
.format
~s
diretiva CL (ou sejaprin1
). Portanto, ele imprimirá seu argumento de maneira adequada ao leitor, para strings que estariam entre aspas.Respostas:
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.fonte
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:
Se você olhar no
.el
arquivo gerado , verá algo como: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
.el
arquivo e gerar um.el
arquivo auxiliar usando Org - verifique o código gerado no controle de revisão.fonte
` and
"`, iirc.