变量" x"在块" square"必须分配默认值

时间:2012-03-03 00:54:27

标签: emacs org-mode babel org-babel

我正在使用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))

2 个答案:

答案 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)行。