переменной "x" в блоке "квадрат" должно быть присвоено значение по умолчанию - PullRequest
1 голос
/ 03 марта 2012

Я использую Emacs 24 / Org 7.8 и у меня возникли некоторые проблемы с org-babel.Я хочу вызвать блок кода с помощью # + call:

#+name: square(x)
#+begin_src python
return x*x
#+end_src
#+call: square(x=6)

Оценка # + вызова с помощью Cc Cc выдает сообщение:

переменная "x" в блоке "квадрат""должно быть назначено значение по умолчанию

Любой совет, как отладить это?У меня есть следующий связанный с кодом org-babel в моем init.el:

(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 ]

2 голосов
/ 03 марта 2012

Рассмотрение ваших вопросов как двух частей (проблема с переменной X и проблема с emacs-lisp).

Emacs-Lisp

Я бы посоветовал вам включить (emacs-lisp . t) в свой список org-babel-load-languages. Это должно решить проблему с этим, не находя emacs-lisp. Вы также можете попробовать M-: (require 'ob-emacs-lisp), и ваша проблема должна быть решена (это заставляет его загружать код Babel emacs-lisp).

Переменная проблема

Мне пришлось сделать несколько тестов, чтобы точно выяснить, где именно возникла проблема. Оказывается, есть два способа объявить переменные при попытке запуска блоков 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 голос
/ 03 марта 2012

РЕДАКТИРОВАТЬ Код ниже работает для версий org-mode до 7.8.Чтобы заставить это работать с 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) не обязательна.

...