请问一下,org-babel 的 :post header 可以直接运行 elisp 吗

下面这个例子里,main 中设置 v=value() 时可以运行,但是 v=value1() 时就会报错,是哪里语法有问题吗

#+name: value
#+begin_src elisp :post post-v(*this*)
(list 1 2)
#+end_src

#+name: value1
#+begin_src elisp :post (car *this*)
(list 1 2)
#+end_src

#+name: post-v
#+begin_src elisp :var val=""
(car val)
#+end_src

#+name: main
#+begin_src elisp :var v=value()
(message (number-to-string v))
#+end_src

文档里这么说,最后一句应该是可以直接运行 elisp 的意思,希望我没理解错: Post-processing

The ‘post’ header argument is for post-processing results from block evaluation. When ‘post’ has any value, Org binds the results to ‘this’ variable for easy passing to ‘var’ header argument specifications (see *note Environment of a Code Block::). That makes results available to other code blocks, or even for direct Emacs Lisp code execution.

应该是不支持直接在S表达式中使用 *this* 的语法,需要使用你第一个例子的用法。

*this* 是一个动态绑定的局部变量,只有在 src block 的语法可以被内部函数用,并不是一个elisp的全局变量。所以 (car this) 会报不存在 *this* 这个变量。

1 个赞

好的感谢,我大概懂这个直接运行 elisp 的意思了,用来构建引用其他 src block 字符串的,这样就可以。

#+name: value1
#+begin_src elisp :post (format "%s(*this*)" "post-v")
(list 1 2)
#+end_src
1 个赞