org-babel sbe синтаксис

Может ли кто-нибудь привести примеры использования sbe функция в ob-table.el? Должно быть, я что-то упустил, потому что я не смог заставить его работать с обычным elisp.

#+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

ошибка: неверный аргумент типа: sequencep, 2

Изменение 2 в список только усугубляет его:

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

ошибка: неверный аргумент типа: буфер-или-строка-р, 2

1 ответ

Решение

Если я правильно понимаю ваш вопрос, вы пытаетесь использовать названный исходный блок вне таблиц для запроса результатов.

Прежде всего, ваш :results silent принадлежит на #+begin_src линия, а не #+name (актуально, только если вы когда-либо оцениваете этот блок напрямую). Я переключаюсь на emacs-lisp из python просто потому, что у меня нет python на этой машине, поэтому я не могу оценить блок в противном случае, функция остается эквивалентной.

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

В Org Tables правильная команда - та, которую вы использовали: #+tblfm: @1$4='(sbe add1 (x $3))

При использовании блоков кода вне таблиц вы должны использовать #+CALL: вместо этого (см. Оценка блоков кода).

Например:

#+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 ' позволит вам видеть их более четко, а также выделять ссылки на ячейки, чтобы убедиться, что вы выбираете правильные регионы.

Другие вопросы по тегам