Die Auswertung des Clojure-Codes im org-Modus erzeugt keine Ausgabe


10

Ich versuche, Clojure-Code aus meiner Organisationsdatei auszuführen, um etwas Lese- und Schreibprogrammierung durchzuführen.

Was funktioniert nicht:

Wenn ich den Quellcodeblock ausführe, bekomme ich No output produced.

Beispiel für einen src-Codeblock

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

Was funktioniert:

  1. cider-jack-in funktioniert und ich kann Code in der nREPL ausführen
  2. Ich kann Code aus einer .cljDatei ausführen

Vielen Dank

Einzelheiten

Emacs 25.1 mit Spacemacs

Org-Modus 9.0.5

Org Babel Konfiguration

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

Bitte lassen Sie mich wissen, wenn Sie weitere Informationen benötigen

Antworten:


10

Ich sehe das gleiche Problem. Ich glaube, ich habe das Problem beim Graben erkannt. Ich bin mir jedoch nicht sicher, wem dies gemeldet werden soll.

Das Problem liegt in der Funktion org-babel-execute: clojure. Diese Funktion hat das folgende Codebit

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

Das Problem liegt im Aufruf von nrepl-sync-request: eval. In der Dokumentation wird diese Funktion angegeben

(nrepl-sync-request: eval INPUT CONNECTION & optional NS)

Senden Sie den INPUT synchron an den nREPL-Server. Die Anfrage wird über CONNECTION versendet. Wenn NS nicht Null ist, nehmen Sie es in die Anforderung auf.

Beachten Sie das letzte optionale Argument NS. Dies soll ein Clojure-Namespace sein. Die Funktion org-babel-execute: clojure ruft diese Funktion jedoch mit der Ausgabe von cider-current-session auf, die eine eindeutige ID zurückgibt, die die aktuelle Sitzung darstellt. Infolgedessen gibt der Aufruf eine Datenstruktur mit einem Fehler und ohne Ausgabe zurück (möglicherweise ist eine Fehlerbehandlung erforderlich). Das zurückgegebene Ergebnis ist

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

Beachten Sie den nicht gefundenen Namespace

Entweder sollte das Argument ein Aufruf von (cider-current-ns) sein, oder es sollte einfach weggelassen werden, da ich nicht sehe, wie Sie den Namespace als Teil der Blockbewertung übergeben können.

BEARBEITEN: Hier ist ein einfacher Patch, der das Problem zu beheben scheint. Generiert gegen den aktuellen Leiter von 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

Schickte den Patch auch an die emacs-orgmode-Liste


Wollen Sie damit sagen, wir sollten die Funktion bearbeiten und durch ersetzen (cider-current-ns)? Und wenn ja, wo finde ich diese Funktion?
Jeel Shah

1
Ich sage, damit ob-clojure funktioniert, muss entweder der Aufruf von (cider-current-session) abgebrochen oder durch (cider-current-ns) ersetzt werden. Das (cider-current-ns) ist Teil der cider-Bibliothek (zusammen mit der cider-current-connection) und (cider-current-session). Entweder müssen Sie die Funktion bearbeiten oder warten, bis jemand sie vorgelagert aktualisiert, aber in der jetzigen Form funktioniert sie nicht. Ich habe dies auf der emacs-org-Liste gemeldet, aber noch keine Antwort.
Tim X

Ihre Lösung funktioniert einwandfrei. Mein ob-clojurewar etwas älter, also habe ich die neuesten gezogen, die relevanten Änderungen vorgenommen und es funktioniert! Ich danke dir sehr! Ich wünschte du hättest ein paar Tage zuvor geantwortet! Ich würde dir definitiv das Kopfgeld geben. :) Vielen Dank!
Jeel Shah

1
Ab dem 3. Juni 2017, Emacs 25.1.1, org 9.0.7, spacemacs 0.200.9, ist dieses Update immer noch nicht verfügbar, als ich einen neuen Klon von Spacemacs entwickelt habe, der einen Zweig entwickelt und mein elpa-Verzeichnis gelöscht hat. Ich musste immer noch die Organisationsverzeichnisse löschen, damit die Auswertung des Codeblocks funktioniert find ~/.emacs.d/elpa/org* -name "*elc" -delete, und dann den obigen Patch manuell anwenden. Die gute Nachricht ist, dass der Patch heute funktioniert.
Reb.Cabin

Um ehrlich zu sein, verstehe ich die Struktur der Org-Git-Zweige und ihre Beziehung zum Org-Plus-Contrib-Paket nicht. Ich weiß, dass der Patch in das Haupt-Organisations-Repository übernommen wurde, weil ich einen Pull ausgeführt und das Festschreiben gesagt habe. Keine Ahnung, wie solche Patches in die Paketdateien gelangen.
Tim X

0

Sie müssen Header-Argumente im Block haben, die org-babel mitteilen, was Sie in die erzeugten Ergebnisse aufnehmen möchten - Ergebnis der Auswertung oder Ausgabe an stdout oder beides. In Ihrem Fall gibt es keine Ausgabe, die die Auswertung (+ 1 1)erzeugt. Versuchen Sie es (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)

Funktioniert leider (println (+ 1 1))nicht. Ich habe den Code, den Sie oben haben, kopiert und das funktioniert auch nicht.
Jeel Shah


0

Versuchen

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

Hiermit wird der zurückgegebene Wert anstelle der Ausgabe gedruckt.


1
Funktioniert immer noch nicht. Der Nachrichtenbereich zeigt "Codeblock hat keinen Wert zurückgegeben".
Stardiviner

0

Dieses Problem ist nicht unbedingt spezifisch für Spacemacs.

Während das OP möglicherweise implizit nach einer Lösung innerhalb von Spacemacs gesucht hat, scheint dies ein guter Ort zu sein, um eine andere Alternative zu erwähnen (insbesondere für Nicht-Spacemacs-Benutzer, bei denen das gleiche Problem auftritt, nachdem ein Teil ihrer Emacs / Org-Modus-Konfiguration aktualisiert wurde ist was mir passiert ist).

Nachdem ich viele Neuinstallationen verschiedener Emacs- und Organisationsversionen versucht hatte , stellte ich schließlich fest, dass es Aquamacs (!) Und Org 9.0.5 (als tar.gz heruntergeladen, wie auf http://orgmode.org/ angegeben ) gelungen ist, das Problem zu umgehen code block produced no outputProblem dieses Plakats auch erlebt.

Obwohl Aquamacs möglicherweise nicht für alle eine langfristige Lösung ist, kann es sicherlich anderen helfen, die stark von der Verwendung von org-babel mit clojure abhängig sind, dieses Problem zu umgehen, bis die oben genannte Lösung vollständig erkannt und implementiert ist.

Die von Aquamacs ab dem 9. März 2017 verwendete Version von Emacs lautet:

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.