Гередок чи еквівалентний синтаксис багаторядкових рядків у Еліспі?


10

У Common-lisp у нас є бібліотека cl-heredoc , чи є еквівалент у EmacsLisp?


У Emacs Lisp немає читацьких макросів, тож я б сказав, що ні, немає. Але, можливо, якщо ви також детально зупинилися на тому, що ви збираєтеся зробити з ними, може бути альтернативний підхід.
wvxvw

1
@wvxvw Я, ймовірно, можу робити те, що мені потрібно з рядком, що цитується багато рядків, єдине роздратування - це лише те, що не вдається отримати внутрішні цитати.
окудо

3
Ну а рядки багатолінійні в ELisp. Один із способів поводження з цитатами всередині цитат - через щось подібне (format "next word is quoted %S" "word").
wvxvw

@wvxvw Я не знав, що% S це зробив, я спробую. Звучить ідеально дякую! Зробіть це відповіддю, і я прийму.
окудо

"% S" дуже схожий на format ~sдирективу CL (тобто prin1). Отже, він надрукує свій аргумент таким чином, що підходить читачеві, для рядків, які були б із цитатами.
wvxvw

Відповіді:


6

Звичайні рядки Emacs Lisp можуть працювати на декількох лініях. Ви можете просто помістити в них нові рядки.

Поглянувши на cl-heredoc, це звучить як те, що ви шукаєте, це "сирі" рядки. Була пропозиція додати їх до elisp на деякий час назад, але, на жаль, це було відхилено. (Я сподіваюся, а не сподіваюся, що це може бути воскрешене.) Елісп також не має читацьких функцій розширення, необхідних для реалізації цього.


Востаннє, коли з'явилася тема визначених користувачем макросів читачів, всі здалися на користь. Тож я впевнений, що єдиною перешкодою є зусилля людини.
Малабарба

2

Якщо ви налаштовуєте emacs за допомогою файлу init.el, ви, можливо, захочете скористатися init.org .

Тоді ви можете використовувати такі конструкції:

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

Якщо ви подивитесь на згенерований .elфайл, ви побачите щось на кшталт:

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

Ви можете розмістити текст і код у будь-якому порядку. Ви можете додавати імена до списків організацій, таблиць тощо.

Якщо це для бібліотеки, де ви, можливо, не хочете змушувати співробітників також використовувати "грамотне програмування", ви можете помістити основну частину коду у .elфайл та створити допоміжний .elфайл за допомогою Org - перевірити створений код у контролі редагування.


3
Можливо, мені чогось не вистачає, але я не бачу, що стосунок init.org стосується багаторядкових рядків.
Малабарба

1
@Malabarba: tl; dr: якщо ви пишете свій елісп в org-режимі, ви можете зробити щось подібне до гередок; в іншому випадку вам доведеться уникати деяких речей у багаторядкових ` and
літеральних

Це цікавий спосіб вирішити цю проблему, але трохи заплутаний для моїх справ.
ocodo
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.