Heredoc lub równoważna składnia ciągu wielowierszowego w Elisp?

10

We common-lisp mamy bibliotekę cl-heredoc , czy istnieje odpowiednik w EmacsLisp?

ocodo
źródło
Emacs Lisp nie ma makr czytelników, więc z góry mojej głowy powiedziałbym, że nie, nie ma. Ale może jeśli zastanowisz się, co zamierzasz z nimi zrobić, może istnieć alternatywne podejście.
wvxvw
1
@wvxvw Prawdopodobnie mogę zrobić to, czego potrzebuję z wieloliniowym ciągiem cytowanym, tylko ucieczka od wewnętrznych cytatów jest jedyną irytacją.
ocodo
3
Cóż, łańcuchy są wielowierszowe w ELisp. Jednym ze sposobów radzenia sobie z cytatami w cudzysłowach byłoby coś w rodzaju (format "next word is quoted %S" "word").
wvxvw
@wvxvw Nie wiedziałem, że% S to zrobił, spróbuję. Brzmi idealnie, dziękuję! Podaj odpowiedź, a ja ją zaakceptuję.
ocodo
„% S” jest bardzo podobny do format ~sdyrektywy CL (tj prin1.). Tak więc wypisze swój argument w sposób odpowiedni dla czytelnika, dla łańcuchów, które byłyby z cudzysłowami.
wvxvw

Odpowiedzi:

6

Zwykłe ciągi znaków Emacsa Lisp obsługują wiele linii. Możesz po prostu wstawić w nich nowe linie.

Patrząc na cl-heredocto, wygląda na to, że szukasz „surowych” ciągów. Była propozycja, aby dodać je, aby jeszcze raz temu, ale niestety została odrzucona. (Mam nadzieję, że raczej nie spodziewam się, że to wskrzesi.) Nie ma też funkcji rozszerzających czytelnika potrzebnych do samodzielnego wdrożenia tego.

Tom Tromey
źródło
Ostatnim razem, gdy pojawił się temat makr czytników zdefiniowanych przez użytkownika, wszyscy wydawali się za. Jestem więc pewien, że jedyną przeszkodą jest ludzki wysiłek.
Malabarba,
2

Jeśli konfigurujesz emacsa za pomocą pliku init.el, możesz zamiast tego rozważyć użycie init.org .

Następnie możesz użyć takich konstrukcji:

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

Jeśli spojrzysz na wygenerowany .elplik, zobaczysz coś takiego:

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

Możesz umieścić tekst i kod w dowolnej kolejności. Możesz dodawać nazwy do list organizacji, tabel itp.

Jeśli dotyczy to biblioteki, w której możesz nie chcieć zmuszać współpracowników do korzystania z „programowania piśmiennego”, możesz umieścić większość kodu w .elpliku i wygenerować .elplik pomocniczy za pomocą organizacji - sprawdź wygenerowany kod w celu kontroli wersji.

Organofosforan Phace
źródło
3
Może czegoś mi brakuje, ale nie rozumiem, co init.org ma wspólnego z ciągami wieloliniowymi.
Malabarba
1
@Malabarba: tl; dr: jeśli napiszesz swój elisp w trybie org, możesz zrobić coś przypominającego heredocs; w przeciwnym razie musisz uciec przed czymś wewnątrz wieloliniowych literałów łańcuchowych - głównie ` and „”, iirc.
SamB
Jest to ciekawy sposób na rozwiązanie problemu, ale w moich przypadkach jest trochę zbyt skomplikowany.
ocodo