2012-03-07 63 views
2

任何人都可以舉例使用sbe函數ob-table.el?我一定會錯過一些東西,因爲我一直無法使用直接的elisp。org-babel sbe語法

#+name: add1(x=1) :results silent 
#+begin_src python 
return x + 1 
#+end_src 

這工作:

| 1 | 2 | 3 | 4 | 
#+TBLFM: @1$4='(sbe add1 (x $3)) 

但這並不:

#+begin_src emacs-lisp 
(sbe add1 (x 2)) 
#+end_src 

error: Wrong type argument: sequencep, 2

更改2到列表只是加劇了它進一步:

#+begin_src emacs-lisp 
(sbe add1 (x (list 2)) 
#+end_src 

error: Wrong type argument: buffer-or-string-p, 2

回答

1

如果我正確理解你的問題,你正嘗試在表外使用你的指定源代碼塊來調用結果。

首先,您的:results silent屬於#+begin_src行,而不屬於#+name(僅在您直接評估該塊時才適用)。我從python切換到emacs-lisp只是因爲我沒有在這臺機器上的python,所以不能評估塊,否則,功能仍然是等價的。

#+name: add1(x=1) 
#+begin_src emacs-lisp :results silent 
    (+ x 1) 
#+end_src 

在組織表正確的命令是您使用的一個:#+tblfm: @1$4='(sbe add1 (x $3))

當使用表之外的代碼塊必須使用代替#+CALL:(見Evaluating Code Blocks)。

例如:

#+CALL: add1(x=2) 

#+RESULTS: add1(x=2) 
: 3 

#+CALL: add1(4) 

#+RESULTS: add1(4) 
: 5 

#+call: add1(add1(2)) 

#+RESULTS: add1(add1(2) 
: 4 

編輯(從評論答案添加):

如果你只是想清理你的公式,並能更好地通過他們讀做出改變,公式編輯器C-c '可讓您更清楚地看到它們,並突出顯示單元格引用以確保您選擇了正確的區域。

+0

實際上,我希望直接從emacs lisp調用我的源代碼塊「函數」,因爲我的'#+ TBLFM'線條變得有點長。 – wdkrnls 2012-03-08 00:54:31

+0

@wdkrnls你希望給他們打電話?如果它是表格的一部分,則將它們添加到'#+ TBLFM:'如果它在文檔中的其他位置,則使用'#+ CALL:' – 2012-03-08 13:10:10

+0

我只是想通過將操作包裝到更多內容來壓縮我的'#+ TBLFM:'行有意義的命名功能。我知道我可以用emacs-lisp來做到這一點,但我希望能夠用其他語言來做到這一點。 – wdkrnls 2012-03-09 02:54:17