組織モードでのClojureコード評価で出力が生成されない


10

読み書きのプログラミングを行うために、組織ファイルからclojureコードを実行しようとしています。

機能していないもの:

ソースコードブロックを実行すると、が表示されNo output producedます。

サンプルsrcコードブロック

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

機能しているもの:

  1. cider-jack-in は機能しており、nREPLでコードを実行できます
  2. .cljファイルからコードを実行できます

ありがとう

細部

Spacemacsを使用したEmacs 25.1

Org-Mode 9.0.5

組織バベル構成

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

その他の情報が必要な場合はお知らせください

回答:


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:eval INPUT CONNECTION&optional NS)

INPUTをnREPLサーバーに同期的に送信します。リクエストはCONNECTION経由でディスパッチされます。NSが非nilの場合、それをリクエストに含めます。

最後のオプション引数NSに注意してください。これは、clojure名前空間であると想定されています。ただし、org-babel-execute:clojure関数は、現在のセッションを表す一意のIDを返すcider-current-sessionからの出力でこの関数を呼び出しています。その結果、呼び出しはエラーのあるデータ構造を返し、出力はありません(おそらくいくつかのエラー処理が必要です)。返される結果は

(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)への呼び出しであるか、ブロック評価の一部として名前空間を渡す方法がわからないため、おそらく省略しておく必要があります。

編集:ここに問題を修正するために表示される簡単なパッチがあります。組織のGitリポジトリの現在の責任者に対して生成されました

---
 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 2017

1
ob-clojureを機能させるには、(cider-current-session)の呼び出しを削除するか、(cider-current-ns)で置き換える必要があると言っています。(cider-current-ns)は(cider-current-connectionとともに)ciderライブラリの一部であり、(cider-current-session)です。関数を編集するか、誰かが上流で更新するまで待つ必要がありますが、現在のところ機能しません。これをemacs-orgリストで報告しましたが、まだ応答はありません。
Tim X

ソリューションは完全に機能しています。私ob-clojureは少し年上だったので、最新のものを引っ張って、関連する変更を加えてうまくいきました!どうもありがとうございます!あなたが数日前に答えていたら良かったのに!必ずあなたに賞金を差し上げます。:)ありがとう!
Jeel Shah 2017

1
2017年6月3日、Emacs 25.1.1、org 9.0.7、spacemacs 0.200.9の時点で、spacemacs開発ブランチの新しいクローンを作成し、elpaディレクトリをワイプしたとき、この修正はまだありません。それでも、コードディレクトリ評価を機能させるために組織ディレクトリをパージしfind ~/.emacs.d/elpa/org* -name "*elc" -delete、上記のパッチを手動で適用する必要がありました。良いニュースは、パッチが今日機能することです。
Reb.Cabin

正直なところ、私はorg gitブランチの構造と、それらがorg-plus-contribパッケージとどのように関連しているかを理解していません。私はプルしてコミットを言ったので、パッチがメインの組織リポジトリにコミットされたことを知っています。このようなパッチがパッケージファイルにどのように取り込まれるかはわかりません。
Tim X

0

ブロックのヘッダー引数には、生成された結果(評価の結果またはstdoutへの出力、あるいはその両方)に何を含めたいかをorg-babelに伝える必要があります。あなたのケースでは、の評価が(+ 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 2017


0

やってみる

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

出力の代わりに戻り値を出力します。


1
それでも機能しません。メッセージ領域に「コードブロックは値を返しませんでした」と表示されます。
stardiviner 2017

0

この問題は必ずしもSpacemacsに固有のものではありません。

OPは暗黙的 Spacemacs 内で解決策を模索していたかもしれませんが、これは別の代替案(特に、emacs / org-mode構成の一部を更新した後に同じ問題が発生している非Spacemacsユーザーにとっては、私に何が起こったかです)。

さまざまなemacsとorgバージョンの多くの再インストールを試みた後、Aquamacs(!)とOrg 9.0.5(http://orgmode.org/で指示されたようにtar.gzとしてダウンロードされた)が、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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.