Sintered string multiline atau setara dengan Elisp?


10

Dalam common-lisp kita memiliki library cl-heredoc , adakah yang setara di EmacsLisp?


Emacs Lisp tidak memiliki makro pembaca, jadi, dari atas kepala saya, saya akan mengatakan tidak, tidak ada. Tetapi mungkin jika Anda juga menguraikan apa yang akan Anda lakukan dengan ini mungkin ada pendekatan alternatif.
wvxvw

1
@ wvxvw Saya mungkin bisa melakukan apa yang saya butuhkan dengan string yang dikutip multiline, hanya melarikan diri kutipan interior adalah satu-satunya gangguan.
ocodo

3
Nah, string adalah multiline di ELisp. Salah satu cara untuk menangani tanda kutip di dalam tanda kutip akan melalui sesuatu seperti (format "next word is quoted %S" "word").
wvxvw

@ wvxvw Saya tidak tahu% S melakukan itu, saya akan mencobanya. Kedengarannya ideal, terima kasih! Buat jawaban, dan saya akan menerimanya.
ocodo

"% S" sangat mirip dengan format ~sdirektif CL (yaitu prin1). Jadi, itu akan mencetak argumennya dengan cara yang cocok untuk pembaca, untuk string yang akan dengan kutipan.
wvxvw

Jawaban:


6

String Lisac Emacs Biasa adalah multi-line-mampu. Anda cukup memasukkan baris baru di dalamnya.

Melirik cl-heredoc, kedengarannya seperti apa yang Anda cari adalah string "mentah". Ada proposal untuk menambahkan ini ke elisp beberapa waktu lalu, tapi sayangnya itu ditolak. (Saya harap daripada berharap itu bisa dibangkitkan.) Elisp juga tidak memiliki fitur yang dapat diperpanjang pembaca yang diperlukan untuk mengimplementasikan diri ini.


Terakhir kali topik makro pembaca yang ditentukan pengguna muncul, semua orang tampak mendukung. Jadi saya yakin satu-satunya kendala adalah upaya manusia.
Malabarba

2

Jika Anda mengkonfigurasi emacs melalui file init.el, Anda mungkin ingin mempertimbangkan untuk menggunakan init.org .

Kemudian Anda dapat menggunakan konstruksi seperti berikut:

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

Jika Anda melihat .elfile yang dihasilkan Anda akan melihat sesuatu seperti:

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

Anda dapat meletakkan teks dan kode dalam urutan apa pun. Anda dapat menambahkan nama ke daftar Organisasi, tabel, dll.

Jika ini untuk pustaka di mana Anda mungkin tidak ingin memaksa kolaborator untuk juga menggunakan 'pemrograman terpelajar' maka Anda bisa memasukkan sebagian besar kode ke dalam .elfile dan menghasilkan .elfile tambahan menggunakan Org - periksa kode yang dihasilkan ke dalam kontrol revisi.


3
Mungkin saya melewatkan sesuatu, tetapi saya tidak melihat apa yang harus dilakukan init.org dengan string multi baris.
Malabarba

1
@Malabarba: tl; dr: jika Anda menulis elisp dalam mode-org, Anda dapat melakukan sesuatu yang mirip dengan heredocs; jika tidak, Anda harus melarikan diri dari beberapa hal di dalam string multi-line string Anda - kebanyakan ` and "`, iirc.
SamB

Ini adalah cara yang menarik untuk menyelesaikan masalah, tetapi sedikit terlalu rumit untuk kasus saya.
ocodo
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.