La evaluación del código Clojure en modo org no produce salida


11

Estoy tratando de ejecutar el código clojure desde mi archivo de organización para hacer una programación alfabetizada.

Lo que no funciona:

Cuando ejecuto el bloque de código fuente que obtengo No output produced.

Bloque de código src de muestra

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

Qué esta trabajando:

  1. cider-jack-in está funcionando y puedo ejecutar código en el nREPL
  2. Puedo ejecutar código de un .cljarchivo

Gracias

Detalles

Emacs 25.1 usando Spacemacs

Org-Mode 9.0.5

Configuración de org 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)))
  )

Por favor avíseme si necesita otra información

Respuestas:


10

Estoy viendo el mismo problema. En una pequeña excavación, creo que he identificado el problema. Sin embargo, no estoy seguro de a quién se debe informar esto.

El problema está en la función org-babel-execute: clojure. Esta función tiene el siguiente bit de código

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

El problema está en la llamada a nrepl-sync-request: eval. La documentación indica para esta función

(nrepl-sync-request: eval INPUT CONNECTION y NS opcional)

Envíe la ENTRADA al servidor nREPL sincrónicamente. La solicitud se envía a través de CONNECTION. Si NS no es nulo, inclúyalo en la solicitud.

Tenga en cuenta el último argumento opcional NS. Se supone que este es un espacio de nombres clojure. Sin embargo, la función org-babel-execute: clojure está llamando a esta función con la salida de cider-current-session, que devuelve una ID única que representa la sesión actual. Como resultado, la llamada está devolviendo una estructura de datos con un error y sin salida (quizás se requiera algún manejo de errores). El resultado devuelto es

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

Tenga en cuenta el espacio de nombres no encontrado

O el argumento debería ser una llamada a (cider-current-ns) o tal vez debería omitirse, ya que no veo cómo puede pasar el espacio de nombres como parte de la evaluación del bloque.

EDITAR: aquí hay un parche simple que parece solucionar el problema. Generado contra el actual jefe de 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

También envió el parche a la lista emacs-orgmode


Entonces, ¿estás diciendo que deberíamos editar la función y reemplazarla (cider-current-ns)? Y si es así, ¿dónde puedo encontrar esa función?
Jeel Shah

1
Estoy diciendo que para que ob-clojure funcione, o bien la llamada a (cider-current-session) necesita ser eliminada o debe ser reemplazada por (cider-current-ns). (Cider-current-ns) es parte de la biblioteca de sidra (junto con cider-current-connection) y (cider-current-session)). O necesita editar la función o esperar hasta que alguien la actualice en sentido ascendente, pero tal como está ahora, no funciona. He informado esto en la lista emacs-org, pero aún no hay respuesta.
Tim X

Tu solución está funcionando perfectamente. Mi ob-clojureera un poco mayor, así que saqué los más nuevos, hice los cambios relevantes y ¡funciona! Muchas gracias! ¡Ojalá hubieras respondido unos días antes! Definitivamente te daría la recompensa. :) ¡Gracias!
Jeel Shah

1
A partir del 3 de junio de 2017, Emacs 25.1.1, org 9.0.7, spacemacs 0.200.9, esta solución aún no está disponible cuando hice una nueva rama de desarrollo de spacemacs y un borrado de mi directorio elpa. Todavía necesitaba purgar los directorios de la organización para que cualquier evaluación de bloque de código funcionara find ~/.emacs.d/elpa/org* -name "*elc" -delete, luego aplicar manualmente el parche anterior. La buena noticia es que el parche funciona hoy.
Reb.Cabin

Para ser honesto, no entiendo la estructura de las ramas org git y cómo se relacionan con el paquete org-plus-contrib. Sé que el parche se confirmó en el repositorio principal de la organización porque hice una extracción y dije el compromiso. No tengo idea de cómo esos parches entran en los archivos del paquete.
Tim X

0

Debe tener argumentos de encabezado en el bloque que le digan a org-babel lo que desea incluir en los resultados producidos: resultado de la evaluación o salida a stdout o ambos. En su caso, no hay salida que la evaluación de (+ 1 1)produce. Tratar (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)

Lamentablemente, (println (+ 1 1))no está funcionando. Copié y pegué el código que tienes arriba y eso tampoco funciona.
Jeel Shah


0

Tratar

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

que imprime el valor devuelto en lugar de la salida.


1
Todavía no funciona. El área de mensajes muestra "El bloque de código no devolvió ningún valor".
stardiviner

0

Este problema no es necesariamente específico de Spacemacs.

Si bien el OP puede haber buscado implícitamente una solución dentro de Spacemacs, este parece ser un buen lugar para mencionar otra alternativa (especialmente para usuarios que no son de Spacemacs que están experimentando el mismo problema después de actualizar alguna parte de su configuración de emacs / org-mode, que es lo que me paso)

Después de intentar muchas reinstalaciones de varias versiones de emacs y org, finalmente descubrí que Aquamacs (!) Y Org 9.0.5 (descargado como tar.gz como se indica en http://orgmode.org/ ) lograron sortear el code block produced no outputproblema que este cartel también experimentó.

Si bien Aquamacs puede no ser una solución a largo plazo para todos, ciertamente puede ayudar a otras personas que dependen en gran medida del uso de org-babel con clojure a solucionar este problema hasta que la solución anterior sea completamente reconocida e implementada.

La versión de emacs utilizada por Aquamacs a partir de este 9 de marzo de 2017 es:

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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.