【问题标题】:How does one reference the result of a call block in an emacs org file?如何在 emacs org 文件中引用调用块的结果?
【发布时间】:2025-12-20 04:15:11
【问题描述】:

我正在使用 emacs org 模式进行可重复的研究。我无法将调用结果链接到代码块。作为我正在尝试做的一个最小示例:

* 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 mode 我想查看函数调用的结果,而无需在每次计算结果时手动重命名?

【问题讨论】:

  • 在 org-mode 8.2.6 上,您的示例在导出时正确给出了 10 和 12 作为结果。
  • 我也在 E​​macs 24.3.1 中运行 org-mode 8.2.6。如果我将上面列出的内容逐字复制到一个空的 emacs org 缓冲区中,则导出到 html 会失败并显示消息“错误类型参数:number-or-marker-p,“nil””。

标签: emacs org-mode literate-programming org-babel


【解决方案1】:

您可以通过在Data 标题下的计算中使用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

来自manual(强调我的):

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

<<code-block-name>>

当代码块被纠缠或评估时,“noweb”引用是否被扩展取决于:noweb 标头参数的值。如果:noweb 是,则在评估之前扩展 Noweb 引用。 [...]

可以包含代码块的结果而不是正文。这是通过将括号附加到代码块名称来完成的,代码块名称可以选择包含代码块的参数,如下所示。

<<code-block-name(optional arguments)>>

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

【讨论】: