我正在使用Emacs 24 / Org 7.8并且与org-babel有一些问题。我想用#+ call:
调用一段代码#+name: square(x)
#+begin_src python
return x*x
#+end_src
#+call: square(x=6)
使用C-c C-c评估#+呼叫时会显示以下消息:
变量" x"在块" square"必须分配默认值
有关如何调试的建议吗?我的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=1
添加到begin_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))
答案 0 :(得分: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
答案 1 :(得分:1)
编辑以下代码适用于7.8之前的org-mode
版本。要在7.8及更高版本中使用此功能,您应使用#+name
代替#+srcname
。
您列出的两件事情不一定相关。
对于python位,您应该使用srcname
而不是name
。您还需要通过指定:var
标头参数让块知道有输入变量。你还应该在这里定义一个默认变量,否则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)
行。