1

Emacs 24/Org 7.8 を使用していますが、org-babel に問題があります。#+call でコードのブロックを呼び出したい:

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

#+call を Cc Cc で評価すると、次のメッセージが表示されます。

ブロック「square」の変数「x」にはデフォルト値を割り当てる必要があります

これをデバッグする方法に関するアドバイスはありますか? 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))
4

2 に答える 2

2

質問を 2 つの部分として扱います (変数 X に関する問題と emacs-lisp に関する問題)。

Emacs-Lisp

(emacs-lisp . t)のリストに必ず含めることをお勧めしますorg-babel-load-languages。これで、emacs-lisp が見つからないという問題が解決するはずです。また、問題を解決することもできM-: (require 'ob-emacs-lisp)ます (これにより、emacs-lisp のバベル コードが強制的に読み込まれます)。

変数の問題

問題がどこにあるかを正確に把握するために、いくつかのテストを行う必要がありました。Org Babel ブロッ​​クを実行しようとするときに変数を宣言する方法が 2 つあります。現時点では Python インタープリターがインストールされていないため、テストには emacs-lisp を使用していますが、結果は同等であるはずです。エラー メッセージは、デフォルトで変数の値を宣言する必要があることを示しています(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
于 2012-03-03T14:28:06.603 に答える
1

EDIT以下のコードは、org-mode7.8 より前のバージョンで機能します。これを 7.8 以降で機能させるには、#+name代わりに を使用する必要があり#+srcnameます。

あなたがリストする2つのことは、必ずしも関連しているわけではありません。

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

2番目の問題は、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)行は必要ありません。

于 2012-03-03T01:24:23.030 に答える