조직 모드의 Clojure 코드 평가에서 출력이 생성되지 않음


11

글을 읽고 프로그래밍하기 위해 조직 파일에서 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

조직 바벨 구성

(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 입력 연결 및 선택적인 NS)

입력을 nREPL 서버에 동기식으로 전송하십시오. 요청은 CONNECTION을 통해 발송됩니다. NS가 0이 아닌 경우 요청에 포함하십시오.

마지막 선택적 인수 NS에 주목하십시오. 이것은 클로저 네임 스페이스 여야합니다. 그러나 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-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의 새로운 클론이 브랜치를 개발하고 elpa 디렉토리의 와이프를 개발했을 때 여전히 적용되지 않습니다. 나는 여전히 org 디렉토리를 제거하여 코드 블록 평가가 작동하도록 find ~/.emacs.d/elpa/org* -name "*elc" -delete하고 위의 패치를 수동으로 적용해야했습니다. 좋은 소식은 오늘 패치가 작동한다는 것입니다.
Reb. Cabin

솔직히 말해서, 나는 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

2
내 것과 같은 문제가있는 것 같습니다. lists.gnu.org/archive/html/emacs-orgmode/2017-02/msg00429.html
stardiviner

0

시험

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

출력 대신 반환 값을 인쇄합니다.


1
여전히 작동하지 않습니다. 메시지 영역에 "코드 블록이 값을 반환하지 않았습니다"가 표시됩니다.
stardiviner

0

이 문제는 반드시 Spacemac에만 해당되는 것은 아닙니다.

OP가 Spacemacs 에서 솔루션을 암시 적으로 찾았 지만 다른 대안을 언급하기에 좋은 곳인 것 같습니다. 나에게 일어난 일입니다).

시도 후 여러 버전의 다양한 이맥스의 재 설치 수 및 조직, 드디어 발견 Aquamacs이 (!)와 조직 9.0.5 (에 지시로 tar.gz의로 다운로드 http://orgmode.org/ ) 주위에 점점 성공 code block produced no output이 포스터도 경험했습니다.

Aquamacs는 모든 사람에게 장기적인 해결책이 아닐 수도 있지만 클로저와 함께 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.