1

我正在使用 Emacs 24/Org 7.8 并且在使用 org-babel 时遇到了一些问题。我想用#+call 调用一段代码:

#+name: square(x)
#+begin_src python
return x*x
#+end_src
#+call: square(x=6)

使用 Cc Cc 评估 #+call 会给出消息:

必须为块“square”中的变量“x”分配默认值

关于如何调试的任何建议?我的 init.el 中有以下与 org-babel 相关的代码:

(org-babel-do-load-languages
     'org-babel-load-languages
     '((R . t)
       (python . t)
       (js . t)
       (scheme . t)
       (C . t)
       (lilypond . t)
       (maxima . t)
       (octave . t)))

像这样添加:var x=1begin_src行中:

#+name: square(x)
#+begin_src python :var x=1
return x*x
#+end_src
#+call: square(x=6)

不要阻止我收到错误。

使用 emacs 调试器进行调查,我发现它ref不是持有"x=6",而是持有"x"

 (org-babel-merge-params
             (mapcar
              (lambda (ref) (cons :var ref))
              (mapcar
               (lambda (var) ;; check that each variable is initialized
         (if (string-match ".+=.+" var)
                 var
               (error
                "variable \"%s\"%s must be assigned a default value"
                var (if name (format " in block \"%s\"" name) ""))))
               (org-babel-ref-split-args (match-string 5))))
             (nth 2 info))
4

2 回答 2

2

将您的问题分为两部分(变量 X 的问题和 emacs-lisp 的问题)。

Emacs-Lisp

我建议确保您(emacs-lisp . t)org-babel-load-languages. 这应该可以解决找不到 emacs-lisp 的问题。您也可以尝试M-: (require 'ob-emacs-lisp)解决您的问题(它会强制它加载 emacs-lisp babel 代码)。

变量问题

我不得不做一些测试来找出问题的确切位置,结果证明在尝试运行 Org Babel 块时有两种方法来声明变量。我正在使用 emacs-lisp 进行测试,因为我目前没有安装 python 解释器,但结果应该是等效的。错误消息告诉您,您必须默认为您的变量声明一个值(x=1)。一旦你这样做了,你的代码块应该没问题。

* Declare variable in name
#+name: square(x=1)
#+begin_src emacs-lisp
  (* x x)
#+end_src

#+results: square
: 1

#+call: square(x=45)

#+results: square(x=45)
: 2025

#+call: square(5)

#+results: square(5)
: 25

* Declare variable in begin_src
#+name: square2
#+begin_src emacs-lisp :var x=1
  (* x x)
#+end_src

#+results: square2
: 1

#+call: square2(5)

#+results: square2(5)
: 25

#+call: square2(x=45)

#+results: square2(x=45)
: 2025
于 2012-03-03T14:28:06.603 回答
1

编辑下面的代码适用于org-mode7.8 之前的版本。要使其与 7.8 及更高版本一起使用,您应该使用#+name而不是#+srcname.

您列出的两件事不一定相关。

对于 python 位,您应该使用srcname而不是name. :var您还需要通过指定header 参数让块知道有一个输入变量。您还应该在这里定义一个默认变量,否则 python 会抱怨。这实际上在当前的在线文档中具有误导性。你想要这样的东西:

#+srcname: square
#+begin_src python :var x=1
  return x*x
#+end_src

在评估#+call: square(x=6)C-c C-c给出:

#+results: square(x=6)
: 36

第二个问题似乎与您的org-babel-load-languages变量有关。默认情况下,emacs-lisp应该加载语言。您是否可能在.emacs文件中更改此内容?您上面的 lisp 代码对我来说很好,我的.emacs中有以下内容:

; org-babel stuff
(org-babel-do-load-languages
 'org-babel-load-languages
 '((org . t)
   (emacs-lisp . t)
   (gnuplot . t)
   (python . t)
   (octave . t)
   (latex . t)
   (perl . t)
   (sh . t)
   (ditaa . t)))
(setq org-confirm-babel-evaluate nil)
(require 'org-exp-blocks)

但这(emacs-lisp . t)条线不应该是必需的。

于 2012-03-03T01:24:23.030 回答