A avaliação do código Clojure no modo organizacional não produz saída


11

Estou tentando executar o código clojure do meu arquivo organizacional para fazer alguma programação alfabética.

O que não está funcionando:

Quando executo o bloco do código-fonte, recebo No output produced.

Bloco de código src de amostra

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

O que está funcionando:

  1. cider-jack-in está funcionando e eu sou capaz de executar código no nREPL
  2. Eu sou capaz de executar código de um .cljarquivo

obrigado

Detalhes

Emacs 25.1 usando Spacemacs

Org-Mode 9.0.5

Configuração do babel da organização

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

Entre em contato se precisar de outras informações

Respostas:


10

Estou vendo o mesmo problema. Em algumas escavações, acho que identifiquei o problema. No entanto, não tenho certeza para quem isso deve ser relatado.

O problema está na função org-babel-execute: clojure. Esta função possui o seguinte 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")))

O problema está na chamada para nrepl-sync-request: eval. Os estados da documentação para esta função

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

Envie a ENTRADA para o servidor nREPL de forma síncrona. O pedido é enviado via CONNECTION. Se o NS for nulo, inclua-o na solicitação.

Observe o último argumento opcional NS. Supõe-se que seja um espaço para nome de clojure. No entanto, a função org-babel-execute: clojure está chamando essa função com a saída de cider-current-session, que retorna um ID exclusivo que representa a sessão atual. Como resultado, a chamada está retornando uma estrutura de dados com um erro e sem saída (talvez seja necessário algum tratamento de erro). O resultado retornado é

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

Observe o espaço para nome não encontrado

O argumento deve ser uma chamada para (cider-current-ns) ou talvez deva ser deixado de fora, pois não vejo como você pode passar o namespace como parte da avaliação do bloco.

EDIT: aqui está um patch simples que parece resolver o problema. Gerado com base no atual diretor de repositório 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

Também enviou o patch para a lista emacs-orgmode


Então você está dizendo que devemos editar a função e substituí-la por (cider-current-ns)? E se sim, onde posso encontrar essa função?
21417 Jeel Shah

11
Estou dizendo que, para fazer o ob-clojure funcionar, a chamada para (cider-current-session) precisa ser cancelada ou substituída por (cider-current-ns). O (cider-current-ns) faz parte da biblioteca de cidras (junto com cider-current-connection) e (cider-current-session)). Você precisa editar a função ou aguardar até que alguém a atualize a montante, mas, como está agora, ela não funciona. Eu relatei isso na lista emacs-org, mas nenhuma resposta ainda.
Tim X

Sua solução está funcionando perfeitamente. Como eu ob-clojureera um pouco mais velho, peguei os mais novos, fiz as alterações relevantes e funciona! Muito obrigado! Eu gostaria que você tivesse respondido alguns dias antes! Eu definitivamente daria a recompensa para você. :) Obrigado!
21417 Jeel Shah

11
A partir de 3 de junho de 2017, Emacs 25.1.1, org 9.0.7, spacemacs 0.200.9, essa correção ainda não está em vigor quando eu fiz um novo clone de spacemacs desenvolver ramificação e limpeza do diretório elpa. Eu ainda precisava limpar os diretórios org para que qualquer avaliação de bloco de código funcionasse e find ~/.emacs.d/elpa/org* -name "*elc" -delete, em seguida, aplique manualmente o patch acima. A boa notícia é que o patch funciona hoje.
precisa

Para ser sincero, não entendo a estrutura dos ramos org git e como eles se relacionam com o pacote org-plus-contrib. Eu sei que o patch foi confirmado no repositório principal da organização porque fiz um puxão e disse o commit. Não faço ideia de como esses patches entram nos arquivos do pacote.
Tim X

0

Você precisa ter argumentos de cabeçalho no bloco informando ao org-babel o que deseja incluir nos resultados produzidos - resultado da avaliação ou saída para stdout ou ambos. No seu caso, não há saída que a avaliação (+ 1 1)produz. Tente (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)

Infelizmente, (println (+ 1 1))não está funcionando. Copiei e colei o código que você tem acima e isso também não funciona.
21417 Jeel Shah


0

Tentar

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

que imprime o valor retornado em vez da saída.


11
Ainda não funciona, a área de mensagem mostra "O bloco de código não retornou valor".
Stardiviner

0

Esse problema não é necessariamente específico para o Spacemacs.

Embora o OP possa ter implicitamente procurado uma solução no Spacemacs, este parece ser um bom lugar para mencionar outra alternativa (especialmente para usuários que não são do Spacemacs que estão enfrentando o mesmo problema depois de atualizar parte de sua configuração do emacs / modo de organização, que foi o que aconteceu comigo).

Depois de tentar várias reinstalações de várias versões do emacs e org, finalmente descobri que o Aquamacs (!) E a Org 9.0.5 (baixados como tar.gz, conforme instruído em http://orgmode.org/ ) conseguiram contornar o problema. code block produced no outputproblema que este pôster também enfrentou.

Embora o Aquamacs possa não ser uma solução de longo prazo para todos, certamente pode ajudar outras pessoas altamente dependentes do uso de org-babel com clojure a contornar esse problema até que a solução acima seja totalmente reconhecida e implementada.

A versão do emacs usada pelo Aquamacs em 9 de março de 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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.