0

我无法使用 sbe. 以下是一些对我不起作用的最小示例:

|   |    in: | in:    | out:     | out:     | out:      |
| ! | number | string | elispStr | elispNum | pythonStr |
|---+--------+--------+----------+----------+-----------|
| # |      5 | fd     | #ERROR   | #ERROR   | #ERROR    |
| # |      7 | fadsf  | #ERROR   | #ERROR   | #ERROR    |
#+TBLFM: $4='(sbe elispStrBlock (foo $string))::$5='(sbe elispNumBlock (a $number));N::$6='(sbe pythonStrBlock (foo $string))

#+name elispNumBlock
#+header: :var a=4
#+begin_src emacs-lisp :results value
(message (number-to-string a))
#+end_src

#+RESULTS:
: 4

#+name elispStrBlock
#+header: :var a="testing"
#+begin_src emacs-lisp :results value 
(message a)
#+end_src

#+RESULTS:
: testing

#+name pythonStrBlock
#+header: :var foo="testing"
#+begin_src python :results output
print foo
#+end_src

#+RESULTS:
: testing

当我使用C-c C-c块中的点评估代码块时,代码块起作用(因此#+RESULTS输出如上所示)。

我查看了邮件列表(例如)并看到有些人可以将 babel 错误输出到*Org Babel Error Output*缓冲区,我想这将有助于调试,但我看不到在哪里打开它(toggle-debug-on-error没用)

我正在使用 org-version: 8.2.3c。我还在新的 emacs 中尝试了上述方法,-q可以选择在启动时忽略我的配置。我已确保启用 python 进行评估:

(org-babel-do-load-languages 'org-babel-load-languages '((emacs-lisp . t) (python . t)))
4

1 回答 1

2

调试显示:中缺少一个冒号

#+name elispNumBlock

肯定是:

#+name: elispNumBlock

以下建议将错误消息传递sbe到消息缓冲区:

(defadvice sbe (around get-err-msg activate)
  "Issue messages at errors."
  (condition-case err
      (progn
    ad-do-it)
    ((error debug)
     (message "Error in sbe: %S" err)
     (signal (car err) (cdr err)))))

没有它,错误消息只会被翻译成表格单元格内容#ERROR。信息量不大。

正如我已经评论过的:N输出格式并没有按预期工作。结果字符串被替换到命令调用中。因此,您需要对字符串进行额外引用。

对我来说,以下是有效的:

|   |    in: | in:     | out:     |     out: | out:      |
| ! | number | string  | elispStr | elispNum | pythonStr |
|---+--------+---------+----------+----------+-----------|
| # |      5 | "fd"    | fd       |        5 | fd        |
| # |      7 | "fadsf" | fadsf    |        7 | fadsf     |
#+TBLFM: $4='(sbe elispStrBlock (foo $string))::$5='(sbe elispNumBlock (a $number))::$6='(sbe pythonStrBlock (foo $string))

#+name: elispNumBlock
#+header: :var a=4
#+begin_src emacs-lisp :results value
(message (number-to-string a))
#+end_src

#+RESULTS:
: 4

#+name: elispStrBlock
#+header: :var foo="testing"
#+begin_src emacs-lisp :results value 
(message foo)
#+end_src


#+name: pythonStrBlock
#+header: :var foo="testing"
#+begin_src python :results output
print foo
#+end_src

编辑:关于单元格引用“$ 2”。以下对我有用:

| ! | arg | res |
|---+-----+-----|
| # |   1 |   2 |
| # |   2 |   3 |
#+TBLFM: $3='(sbe myColFm (el $2))

#+name: myColFm
#+header: :var el=1
#+begin_src emacs-lisp
  (1+ el)
#+end_src

编辑:附加建议

(defadvice sbe (before escape-args activate)
  "Apply prin1 to argument values."
  (mapc '(lambda (var) (setcdr var (list (prin1-to-string (cadr var))))) variables))

该命令sbe按预期工作:

| ! | arg | res |   |
|---+-----+-----+---|
| # |   1 |   3 | 5 |
| # |   2 |   4 | 6 |
#+TBLFM: $3='(sbe myStr (el $2))::$4='(sbe myColFm (el $2));N

#+name: myStr
#+header: :var el="1"
#+begin_src emacs-lisp
  (+ 2 (string-to-number el))
#+end_src

#+name: myColFm
#+header: :var el=1
#+begin_src emacs-lisp
  (+ 4 el)
#+end_src
于 2013-11-24T16:28:21.160 回答