Emacs 变量";x";“在块中”;“正方形”;必须指定一个默认值

Emacs 变量";x";“在块中”;“正方形”;必须指定一个默认值,emacs,org-mode,org-babel,Emacs,Org Mode,Org Babel,我使用的是Emacs24/Org7.8,我对OrgBabel有一些问题。我想用#+call调用代码块: 用C-C C-C评估#+调用会给出以下信息: 块“square”中的变量“x”必须指定一个默认值 关于如何调试这个有什么建议吗?我在init.el中有以下与代码相关的组织babel: (org babel不加载语言 'org babel加载语言 "(R.t) (python.t) (js.t) (方案t) (C.t) (lilypond.t) (最大值t) (倍频程t) 将:var x=1添

我使用的是Emacs24/Org7.8,我对OrgBabel有一些问题。我想用#+call调用代码块:

用C-C C-C评估#+调用会给出以下信息:

块“square”中的变量“x”必须指定一个默认值

关于如何调试这个有什么建议吗?我在init.el中有以下与代码相关的组织babel:

(org babel不加载语言
'org babel加载语言
"(R.t)
(python.t)
(js.t)
(方案t)
(C.t)
(lilypond.t)
(最大值t)
(倍频程t)
:var x=1
添加到
begin\u src
行,如下所示:

#+name: square(x)
#+begin_src python :var x=1
return x*x
#+end_src
#+call: square(x=6)
不要阻止我接收错误

通过使用emacs调试器进行调查,我发现
ref
没有保留
“x=6”
,而是保留
“x”

(组织巴别塔合并参数
(地图车
(λ(参考)(缺点:var参考))
(地图车
(lambda(var);;检查每个变量是否已初始化
(如果(字符串匹配“++.++”变量)
变量
(错误
“必须为变量\%s\%s分配一个默认值”
变量(如果名称(格式为“块\%s\”“名称)”))
(组织巴别塔参考拆分参数(匹配字符串5)))
(第二期资讯)

编辑以下代码适用于7.8之前的
组织模式
版本。要在7.8及更高版本中使用此功能,您应该使用
#+name
而不是
#+srcname

你列出的两件事不一定相关

对于python位,应该使用
srcname
而不是
name
。您还需要通过指定
:var
头参数让块知道存在输入变量。您还应该在这里定义一个默认变量,否则python会抱怨。在当前的在线文档中,这实际上具有误导性。你想要的是:

#+srcname: square
#+begin_src python :var x=1
  return x*x
#+end_src
在评估
#+时,调用:square(x=6)
C-C-C
给出:

#+results: square(x=6)
: 36
第二个问题似乎与
org babel load languages
变量有关。默认情况下,应加载
emacs lisp
语言。您是否正在.emacs文件中更改此选项?您上面的lisp代码对我来说很好,我的.emacs中有以下内容:

;巴别塔酒店
(org)babel不加载语言
'org babel加载语言
“((org.t)
(emacs lisp.t)
(gnuplot.t)
(python.t)
(倍频程t)
(t)
(perl.t)
(sh.t)
(ditaa.t)))
(setq组织确认巴贝尔评估无)
(需要“组织扩展块”)

但是
(emacs lisp.t)
行应该是不必要的。

将您的问题分为两部分(变量X的问题和emacs lisp的问题)

Emacs Lisp 我建议您确保将
(emacs lisp.t)
包含在您的
org babel load languages
列表中。这将解决it找不到emacs lisp的问题。您还可以尝试
M-:(要求'ob-emacs-lisp)
,您的问题应该得到解决(它强制加载emacs-lisp-babel代码)

可变问题 我必须做一些测试来找出问题的确切位置,结果表明,在尝试运行OrgBabel块时,有两种方法可以声明变量。我使用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

实际上,从
7.8
开始,正确的用法是
#+name:
而不是像Jon说的那样,我使用的是组织模式7.8。此信息已添加到问题中。实际上,您针对7.8进行的语法调整也同样有效。非常感谢@JonathanLeech Pepin啊,说得好。我看到邮件列表中的src块名称发生了变化,但没有看到最终的一致意见。我知道这应该是如何工作的,但是我的
org babel get src block info
函数在
ob.el
中返回了错误,因为
var
(一个全局变量,应该包含“++”列表)字符串只保存
“x”
,尽管使用了与您相同的组织语法。不,它失败是因为您有
square(x)
。我的示例的前半部分显示了该语法。您需要它是
square(x=1)
让var有一个默认值。非常感谢!我太确定我已经排除了你写的内容。下次我会更加小心。
* 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