如何在Emacs org文件中引用调用块的结果?

4

我正在使用emacs org mode进行可重复研究。 我在尝试将代码块的调用结果链接起来时遇到问题。 下面是我尝试做的最小实例:

* Functions
#+name: f1
#+begin_src elisp :var x=7
  (+ x x)
#+end_src

#+name: f2
#+begin_src elisp :var x=7
  (+ x 2)
#+end_src

* Data
#+name: intermediate
#+call: f1(x=5)

#+RESULTS: intermediate
: 10

#+call: f2(x=intermediate)

当我调用f2时,它失败了,因为xnil。如果我在对f1的调用中删除名称,则f2可以工作,但是如果我更改f1的参数,则结果不会保持同步。
如何告诉org模式,我想看到函数调用的结果,而无需每次手动重命名计算出的结果?

在org-mode 8.2.6上,您的示例在导出时正确地给出了10和12作为结果。 - Juancho
我也在Emacs 24.3.1中运行org-mode 8.2.6。如果我将上面列出的内容逐字复制到空的emacs org缓冲区中,导出为html会失败,并显示“Wrong type argument: number-or-marker-p, "nil"” 的消息。 - rprospero
1个回答

4

在“数据”标题下,您可以使用Noweb参考语法来实现您想要的功能。

* Functions
...

* Data
#+name: intermediate
#+BEGIN_SRC elisp :noweb yes
<<f1(x=5)>>
#+END_SRC

#+BEGIN_SRC elisp :noweb yes
<<f2(x=intermediate)>>
#+END_SRC

以下内容来自手册(重点是我加的):

"noweb" ...文学编程系统允许使用熟悉的Noweb语法引用代码的命名块:

<<code-block-name>>

当代码块被交织或评估时,是否扩展 "noweb" 引用取决于 :noweb 标头参数的值。如果 :noweb 是 yes,则在评估之前会展开 Noweb 引用。[...]可以通过将括号附加到代码块名称(可选包含代码块参数)来包含代码块的结果而不是主体。如下所示。
<<code-block-name(optional arguments)>>

使用这种设置,您可以更改传递给f1x值并成功重新导出/重新评估,而无需修改其他任何内容。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接