组织模式下的Clojure代码评估不产生任何输出


11

我正在尝试从我的org文件中运行clojure代码,以便进行一些识字编程。

什么不起作用:

当我执行源代码块时,我得到了No output produced

样本src代码块

#+begin_src clojure
(+ 2 2)
#+end_src clojure

工作原理:

  1. cider-jack-in 正在工作,我能够在nREPL中执行代码
  2. 我可以从.clj文件执行代码

谢谢

细节

使用Spacemacs的Emacs 25.1

机构模式9.0.5

组织babel配置

(defun dotspacemacs/user-config ()
  (require 'ob)
  (require 'ob-clojure)
  (require 'paredit)
  (require 'org-babel-clojure)
  (setq org-babel-clojure-backend 'cider)
  (require 'cider)
  (org-babel-do-load-languages
   'org-babel-load-languages
   '((clojure . t)))
  )

如果您需要其他任何信息,请告诉我

Answers:


10

我看到他有同样的问题。经过一点挖掘,我认为我已经找到了问题所在。但是,不确定应该向谁报告。

问题出在org-babel-execute:clojure函数中。该函数具有以下代码

(setq result
       (nrepl-dict-get
    (nrepl-sync-request:eval
     expanded (cider-current-connection) (cider-current-session))
    (if (or (member "output" result-params)
        (member "pp" result-params))
        "out"
      "value")))

问题出在对nrepl-sync-request:eval的调用中。此功能的文档说明

(nrepl-sync-request:评估输入连接和可选NS)

将INPUT同步发送到nREPL服务器。该请求是通过CONNECTION分派的。如果NS为非nil,则将其包括在请求中。

注意最后一个可选参数NS。这应该是clojure名称空间。但是,org-babel-execute:clojure函数使用cider-current-session的输出调用此函数,该输出返回代表当前会话的唯一ID。结果,该调用将返回一个有错误且没有输出的数据结构(也许需要一些错误处理)。返回的结果是

(dict status (namespace-not-found done error done state state) id 17 session 43e9fd6c-82ed-49fe-9624-0cfc6f56f8b1 changed-namespaces (dict) repl-type cljclj)

注意命名空间未找到

该参数要么是对(cider-current-ns)的调用,要么应该被忽略掉,因为我不知道如何将名称空间作为块评估的一部分。

编辑:这是一个简单的补丁,似乎可以解决该问题。针对目前的org git repo主管生成

---
 lisp/ob-clojure.el | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/lisp/ob-clojure.el b/lisp/ob-clojure.el
index d407105..e542a29 100644
--- a/lisp/ob-clojure.el
+++ b/lisp/ob-clojure.el
@@ -44,6 +44,7 @@

 (declare-function cider-current-connection "ext:cider-client" (&optional type))
 (declare-function cider-current-session "ext:cider-client" ())
+(declare-function cider-current-ns "ext:cider-client" ())
 (declare-function nrepl--merge "ext:nrepl-client" (dict1 dict2))
 (declare-function nrepl-dict-get "ext:nrepl-client" (dict key))
 (declare-function nrepl-dict-put "ext:nrepl-client" (dict key value))
@@ -118,7 +119,7 @@ using the :show-process parameter."
                org-babel-clojure-sync-nrepl-timeout))
               (nrepl-sync-request:eval expanded
                        (cider-current-connection)
-                       (cider-current-session))))
+                       (cider-current-ns))))
           (setq result
             (concat
              (nrepl-dict-get response
@@ -153,7 +154,7 @@ using the :show-process parameter."
        ;; Update the status of the nREPL output session.
        (setq status (nrepl-dict-get response "status")))
          (cider-current-connection)
-         (cider-current-session))
+         (cider-current-ns))

         ;; Wait until the nREPL code finished to be processed.
         (while (not (member "done" status))
-- 
2.7.4

还将补丁发送到emacs-orgmode列表


那么,您是说我们应该编辑该函数并将其替换为(cider-current-ns)吗?如果是这样,我在哪里可以找到该功能?
Jeel Shah

1
我的意思是,要使ob-clojure正常工作,必须删除对(cider-current-session)的调用,或者将其替换为(cider-current-ns)。(cider-current-ns)是cider库的一部分(以及cider-current-connection和cider-current-session)。您需要编辑该功能,或者等到有人在上游对其进行更新,但是就目前而言,它不起作用。我已经在emacs-org列表中报告了此信息,但尚未得到任何回应。
Tim X

您的解决方案运行完美。我ob-clojure的年龄稍大一些,所以我选择了最新的,进行了相应的更改,然后开始工作了!非常感谢!希望您几天前已回答!我一定会给你赏金的。:) 谢谢!
Jeel Shah

1
截至2017年6月3日,Emacs 25.1.1,org 9.0.7,spacemacs 0.200.9,当我重新克隆了spacemacs development分支并擦除了elpa目录时,此修复仍未实现。我仍然需要清除org目录以使任何代码块评估工作find ~/.emacs.d/elpa/org* -name "*elc" -delete,然后手动应用上面的补丁。好消息是该补丁程序今天可以运行了。
Reb.Cabin,2017年

老实说,我不了解org git分支的结构以及它们与org-plus-contrib包的关系。我知道补丁已提交到主要的组织存储库中,因为我做了拉并说了提交。不知道这种补丁如何进入软件包文件。
Tim X

0

您需要在告诉org-babel的代码块中包含标头参数,您要在生成的结果中包括什么-评估结果或输出到stdout或两者。在您的情况下,没有评估(+ 1 1)产生的输出。尝试(println (+ 1 1))

#+name: Lazy Sequences in Clojure
#+begin_src clojure
 (def a-lazy-sequence (cons 1 (lazy-seq (cons (+1 2) ()))))
#+end_src

#+name: List comprehensions in Clojure
#+begin_src clojure :results output
 (println (str (for [x (range 3)
                     y #{:a :b :c}]
                 [x y])))

#+end_src

#+RESULTS: List comprehensions in Clojure
 : (c l o j u r e . l a n g . L a z y S e q @ e a a 0 1 c e 7)

不幸的是,(println (+ 1 1))它不起作用。我复制粘贴了上面的代码,但这也不起作用。
Jeel Shah's


0

尝试

#+begin_src clojure :results value
(+ 2 2)
#+end_src clojure

打印输出的值而不是输出。


1
仍然不起作用,消息区域显示“代码块未返回任何值”。
stardiviner

0

此问题不一定特定于Spacemacs。

尽管OP可能已经隐式地 Spacemacs中寻求解决方案,但这似乎是一个值得提及的替代方法(特别是对于非Spacemacs用户,他们在更新了他们的emacs / org-mode配置的一部分后遇到相同的问题,是我身上发生的事情)。

尝试后很多不同的Emacs重新安装和org的版本,我终于发现,Aquamacs(!),并组织9.0.5(如下载的指示,在一个tar.gz http://orgmode.org/)成功地让周围的code block produced no output这个海报的问题也遇到了。

尽管Aquamacs可能不是每个人的长期解决方案,但它肯定可以帮助高度依赖使用Clojure的org-babel的其他人解决此问题,直到上述解决方案得到完全认可和实施。

截至2017年3月9日,Aquamacs使用的emacs版本为:

Aquamacs 3.3 GNU Emacs 25.1.1 (x86_64-apple-darwin14.1.0, NS appkit-1344.72 Version 10.10.2 (Build 14C109)) of 2016-09-19 on 24a02dbf6b34ae061ef4df89f15bfbc5d3ed497e

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.