La valutazione del codice Clojure in modalità org non produce output


11

Sto cercando di eseguire il codice clojure dal mio file org per fare una programmazione alfabetica.

Cosa non funziona:

Quando eseguo il blocco di codice sorgente ottengo No output produced.

Esempio di blocco codice src

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

Cosa sta funzionando:

  1. cider-jack-in funziona e sono in grado di eseguire il codice in nREPL
  2. Sono in grado di eseguire il codice da un .cljfile

Grazie

Dettagli

Emacs 25.1 usando Spacemacs

Modalità Org 9.0.5

Configurazione babel dell'organizzazione

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

Per favore fatemi sapere se avete bisogno di altre informazioni

Risposte:


10

Sto vedendo lo stesso problema. In un po 'di scavo, penso di aver identificato il problema. Tuttavia, non sono sicuro a chi debba essere segnalato.

Il problema è nella funzione org-babel-execute: clojure. Questa funzione ha il seguente bit di codice

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

Il problema è nella chiamata a nrepl-sync-request: eval. La documentazione afferma per questa funzione

(nrepl-sync-request: eval INPUT CONNECTION e NS opzionale)

Invia l'INGRESSO al server nREPL in modo sincrono. La richiesta viene inviata tramite CONNECTION. Se NS è diverso da zero, includerlo nella richiesta.

Nota l'ultimo argomento facoltativo NS. Questo dovrebbe essere uno spazio dei nomi clojure. Tuttavia, la funzione org-babel-execute: clojure chiama questa funzione con l'output di cider-current-session, che restituisce un ID univoco che rappresenta la sessione corrente. Di conseguenza, la chiamata restituisce una struttura di dati con un errore e nessun output (forse è necessaria una gestione degli errori). Il risultato restituito è

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

Nota lo spazio dei nomi non trovato

O l'argomento dovrebbe essere una chiamata a (sidro-corrente-ns) o forse dovrebbe essere lasciato fuori dal momento che non vedo come si possa passare lo spazio dei nomi come parte della valutazione del blocco.

EDIT: ecco una semplice patch che sembra risolvere il problema. Generato contro l'attuale capo del repository git org

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

Inoltre ha inviato la patch all'elenco emacs-orgmode


Quindi stai dicendo che dovremmo modificare la funzione e sostituirla con (cider-current-ns)? E se sì, dove posso trovare quella funzione?
Jeel Shah,

1
Sto dicendo che per far funzionare l'ob-clojure, o la chiamata a (sidro-corrente-sessione) deve essere eliminata o deve essere sostituita con (sidro-corrente-ns). (Sidro-corrente-ns) fa parte della libreria sidro (insieme a sidro-corrente-connessione) e (sidro-corrente-sessione)). O è necessario modificare la funzione o attendere fino a quando qualcuno non la aggiorna a monte, ma così com'è ora, non funziona. L'ho segnalato nell'elenco emacs-org, ma non ho ancora ricevuto risposta.
Tim X

La tua soluzione funziona perfettamente. Ero ob-clojureun po 'più grande, quindi ho estratto quelli più recenti, ho apportato le modifiche pertinenti e funziona! Grazie mille! Vorrei che avessi risposto qualche giorno prima! Ti darei sicuramente la generosità. :) Grazie!
Jeel Shah,

1
A partire dal 3 giugno 2017, Emacs 25.1.1, org 9.0.7, spacemacs 0.200.9, questa correzione non è ancora presente quando ho fatto un nuovo clone di spacemacs per sviluppare il ramo e cancellare la mia directory elpa. Avevo ancora bisogno di eliminare le directory dell'organizzazione per far funzionare l'eval a blocchi di codice find ~/.emacs.d/elpa/org* -name "*elc" -delete, quindi applicare manualmente la patch sopra. La buona notizia è che la patch funziona oggi.
Reb.Cabin

Ad essere sincero, non capisco la struttura dei rami org git e come si relazionano al pacchetto org-plus-contrib. So che la patch è stata impegnata nel repository principale dell'organizzazione perché ho fatto un pull e ho detto il commit. Non ho idea di come tali patch entrino nei file del pacchetto.
Tim X

0

È necessario disporre di argomenti di intestazione nel blocco che indichino a org-babel cosa si desidera includere nei risultati prodotti: risultato della valutazione o output su stdout o entrambi. Nel tuo caso, non esiste alcun output prodotto dalla valutazione (+ 1 1). Prova (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)

Sfortunatamente, (println (+ 1 1))non funziona. Ho copiato e incollato il codice che hai sopra e che non funziona neanche.
Jeel Shah,


0

Provare

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

che stampa il valore restituito anziché l'output.


1
Non funziona ancora, L'area dei messaggi mostra "Il blocco di codice non ha restituito alcun valore".
Stardiviner,

0

Questo problema non è necessariamente specifico di Spacemacs.

Mentre l'OP potrebbe aver implicitamente cercato una soluzione all'interno di Spacemacs, questo sembra un buon posto per menzionare un'altra alternativa (in particolare per gli utenti non Spacemacs che stanno riscontrando lo stesso problema dopo aver aggiornato un pezzo della loro configurazione emacs / org-mode, che è quello che mi è successo).

Dopo aver provato molte reinstallazioni di varie emac e versioni dell'organizzazione , ho finalmente scoperto che Aquamacs (!) E Org 9.0.5 (scaricati come tar.gz come indicato su http://orgmode.org/ ) sono riusciti a aggirare il code block produced no outputproblema anche questo poster.

Mentre Aquamacs potrebbe non essere una soluzione a lungo termine per tutti, sicuramente può aiutare gli altri che sono altamente dipendenti dall'uso di org-babel con clojure aggirare questo problema fino a quando la soluzione di cui sopra non sarà pienamente riconosciuta e implementata.

La versione di emacs utilizzata da Aquamacs a partire dal 9 marzo 2017 è:

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.