L'évaluation du code Clojure en mode org ne produit aucune sortie


11

J'essaie d'exécuter du code clojure à partir de mon fichier org afin de faire de la programmation lettrée.

Ce qui ne fonctionne pas:

Lorsque j'exécute le bloc de code source que j'obtiens No output produced.

Exemple de bloc de code src

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

Ce qui fonctionne:

  1. cider-jack-in fonctionne et je suis en mesure d'exécuter du code dans le nREPL
  2. Je peux exécuter du code à partir d'un .cljfichier

Merci

Détails

Emacs 25.1 à l'aide de Spacemacs

Org-Mode 9.0.5

Configuration de l'organisation 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)))
  )

Veuillez me faire savoir si vous avez besoin d'autres informations

Réponses:


10

Je vois le même problème. En creusant un peu, je pense avoir identifié le problème. Cependant, je ne sais pas à qui cela doit être signalé.

Le problème est dans la fonction org-babel-execute: clojure. Cette fonction a le bit de code suivant

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

Le problème réside dans l'appel à nrepl-sync-request: eval. La documentation indique pour cette fonction

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

Envoyez l'ENTRÉE au serveur nREPL de manière synchrone. La demande est envoyée via CONNECTION. Si NS n'est pas nul, incluez-le dans la demande.

Notez le dernier argument facultatif NS. Ceci est censé être un espace de noms clojure. Cependant, la fonction org-babel-execute: clojure appelle cette fonction avec la sortie de cider-current-session, qui renvoie un ID unique représentant la session en cours. Par conséquent, l'appel renvoie une structure de données avec une erreur et aucune sortie (peut-être qu'une gestion des erreurs est requise). Le résultat renvoyé est

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

Notez l' espace de noms introuvable

Soit l'argument devrait être un appel à (cider-current-ns), soit il devrait simplement être laissé de côté car je ne vois pas comment vous pouvez passer l'espace de noms dans le cadre de l'évaluation du bloc.

EDIT: voici un simple patch qui semble résoudre le problème. Généré par rapport au responsable actuel du référentiel org 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

A également envoyé le patch à la liste emacs-orgmode


Alors, dites-vous que nous devrions modifier la fonction et la remplacer par (cider-current-ns)? Et si oui, où puis-je trouver cette fonction?
Jeel Shah

1
Je dis que pour que ob-clojure fonctionne, soit l'appel à (cider-current-session) doit être abandonné, soit il doit être remplacé par (cider-current-ns). (Cider-current-ns) fait partie de la bibliothèque de cidre (avec cider-current-connection) et (cider-current-session)). Vous devez soit modifier la fonction, soit attendre que quelqu'un la mette à jour en amont, mais en l'état, elle ne fonctionne pas. J'ai signalé cela sur la liste emacs-org, mais pas encore de réponse.
Tim X

Votre solution fonctionne parfaitement. Mon ob-clojureétait un peu plus alors j'ai tiré par les plus récents, a fait les changements pertinents et ça marche! Merci beaucoup! Je souhaite que vous ayez répondu quelques jours auparavant! Je vous donnerais certainement la prime. :) Merci!
Jeel Shah

1
Depuis le 3 juin 2017, Emacs 25.1.1, org 9.0.7, spacemacs 0.200.9, ce correctif n'est toujours pas là quand j'ai fait un nouveau clone de spacemacs développer une branche et un effacement de mon répertoire elpa. J'avais encore besoin de purger les répertoires de l'organisation pour que n'importe quelle évaluation de bloc de code fonctionne find ~/.emacs.d/elpa/org* -name "*elc" -delete, puis d'appliquer manuellement le correctif ci-dessus. La bonne nouvelle est que le patch fonctionne aujourd'hui.
Reb.Cabin

Pour être honnête, je ne comprends pas la structure des branches org git et leur relation avec le package org-plus-contrib. Je sais que le correctif a été validé dans le référentiel org principal parce que j'ai fait un pull et dit le commit. Aucune idée de la façon dont ces correctifs entrent dans les fichiers du package.
Tim X

0

Vous devez avoir des arguments d'en-tête dans le bloc indiquant à org-babel ce que vous voulez inclure dans les résultats produits - résultat de l'évaluation ou sortie vers stdout ou les deux. Dans votre cas, il n'y a aucune sortie que l'évaluation de (+ 1 1)produit. Essayez (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)

Malheureusement, (println (+ 1 1))ne fonctionne pas. J'ai copié-collé le code que vous avez ci-dessus et cela ne fonctionne pas non plus.
Jeel Shah


0

Essayer

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

qui imprime la valeur retournée au lieu de la sortie.


1
Ne fonctionne toujours pas, la zone de message affiche "Le bloc de code n'a renvoyé aucune valeur".
stardiviner

0

Ce problème n'est pas nécessairement spécifique aux Spacemacs.

Bien que l'OP ait implicitement cherché une solution dans Spacemacs, cela semble être un bon endroit pour mentionner une autre alternative (en particulier pour les utilisateurs non-Spacemacs qui rencontrent le même problème après avoir mis à jour une partie de leur configuration emacs / org-mode, qui c'est ce qui m'est arrivé).

Après avoir essayé de nombreuses réinstallations de diverses versions d'emacs et d'org, j'ai finalement trouvé que Aquamacs (!) Et Org 9.0.5 (téléchargés en tant que tar.gz comme indiqué sur http://orgmode.org/ ) ont réussi à contourner le code block produced no outputproblème que cette affiche a également connu.

Bien qu'Aquamacs ne soit pas une solution à long terme pour tout le monde, il peut certainement aider d'autres personnes très dépendantes à utiliser org-babel avec clojure à contourner ce problème jusqu'à ce que la solution ci-dessus soit pleinement reconnue et mise en œuvre.

La version d'emacs utilisée par Aquamacs à compter du 9 mars 2017 est:

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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.