Elisp中的Heredoc或等效的多行字符串语法?


10

在common-lisp中,我们有库cl-heredoc,EmacsLisp中是否有等效项?


Emacs Lisp没有阅读器宏,因此,我顶着头说不,没有。但是,也许如果您还详细说明了如何处理这些问题,那么可能会有另一种方法。
wvxvw 2015年

1
@wvxvw我可能可以用多行引号引起来的字符串做我需要的事情,只是转义内部引号是唯一的麻烦。
ocodo 2015年

3
好吧,字符串在ELisp中是多行的。处理引号内引号的一种方法是通过(format "next word is quoted %S" "word")
wvxvw 2015年

@wvxvw我不知道%S这样做,我会尝试一下。听起来很理想,谢谢!回答一下,我会接受的。
ocodo

“%S”与CL format ~s指令(即prin1)非常相似。因此,它将以适合读者的方式打印其自变量,以包含引号的字符串。
wvxvw'2

Answers:


6

普通的Emacs Lisp字符串具有多行功能。您可以简单地在其中添加换行符。

乍一看cl-heredoc,听起来您正在寻找的是“原始”字符串。有人提议将它们添加到以前,但很遗憾,它被拒绝了。(我希望而不是期望它能够复活。)elisp也没有拥有实现此功能所需的读者可扩展性功能。


上一次出现用户定义的读取器宏主题时,每个人似乎都赞成。因此,我确信唯一的障碍是人类的努力。
马拉巴巴

2

如果要通过init.el文件配置emacs,则可能需要考虑使用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-mode编写elisp,则可以做一些类似heredocs的操作;否则,您必须在多行字符串文字中转义一些内容-大多是` and “`,iirc。”
SamB 2015年

这是解决问题的一种有趣方式,但是对于我的情况来说有点太复杂了。
ocodo
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.