Analiza kodu Clojure w trybie org nie daje żadnych wyników


11

Usiłuję uruchomić kod clojure z mojego pliku org, aby wykonać trochę programowania.

Co nie działa:

Kiedy wykonuję blok kodu źródłowego, otrzymuję No output produced.

Przykładowy blok kodu src

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

Co działa:

  1. cider-jack-in działa i jestem w stanie wykonać kod w nREPL
  2. Jestem w stanie wykonać kod z .cljpliku

Dzięki

Detale

Emacs 25.1 za pomocą Spacemacs

Tryb organizacji 9.0.5

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

Daj mi znać, jeśli potrzebujesz innych informacji

Odpowiedzi:


10

Widzę ten sam problem. Przy odrobinie kopania wydaje mi się, że zidentyfikowałem problem. Nie jestem jednak pewien, do kogo należy to zgłosić.

Problem tkwi w funkcji org-babel-execute: clojure. Ta funkcja ma następujący bit kodu

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

Problem polega na wywołaniu polecenia nrepl-sync: eval. Dokumentacja stwierdza dla tej funkcji

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

Wyślij INPUT do serwera nREPL synchronicznie. Żądanie jest wysyłane przez POŁĄCZENIE. Jeśli NS ma wartość inną niż zero, dołącz ją do żądania.

Zwróć uwagę na ostatni opcjonalny argument NS. To ma być przestrzeń nazw clojure. Jednak funkcja org-babel-execute: clojure wywołuje tę funkcję z danymi wyjściowymi z sesji cydru-prądu, która zwraca unikalny identyfikator reprezentujący bieżącą sesję. W rezultacie wywołanie zwraca strukturę danych z błędem i bez danych wyjściowych (być może wymagana jest pewna obsługa błędów). Zwrócony wynik to

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

Zwróć uwagę na nieznaną przestrzeń nazw

Albo argumentem powinno być wywołanie do (cydr-prąd-ns), a może po prostu należy je pominąć, ponieważ nie widzę, jak można przekazać przestrzeń nazw w ramach oceny bloku.

EDYCJA: oto prosta łatka, która wydaje się naprawić problem. Wygenerowano w stosunku do bieżącego szefa repozytorium 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

Wysłałem również łatkę na listę emacs-orgmode


Więc mówisz, że powinniśmy edytować funkcję i zastąpić ją (cider-current-ns)? A jeśli tak, to gdzie mogę znaleźć tę funkcję?
Jeel Shah

1
Mówię, że aby ob-clojure działało, albo połączenie z (cydr-bieżąca-sesja) musi zostać porzucone, albo zastąpione przez (cydr-prąd-ns). (Cydr-prąd-ns) jest częścią biblioteki cydru (wraz z cydr-prąd-połączenie) i (cydr-prąd-sesja)). Musisz edytować funkcję lub poczekać, aż ktoś ją zaktualizuje, ale w obecnej wersji nie działa. Zgłosiłem to na liście emacs-org, ale jeszcze nie otrzymałem odpowiedzi.
Tim X

Twoje rozwiązanie działa idealnie. Mój ob-clojurebył trochę starszy, więc wyciągnąłem najnowsze, wprowadziłem odpowiednie zmiany i działa! Dziękuję bardzo! Chciałbym, żebyś odpowiedział kilka dni wcześniej! Zdecydowanie dałbym ci nagrodę. :) Dzięki!
Jeel Shah

1
Na dzień 3 czerwca 2017 r., Emacs 25.1.1, org 9.0.7, spacemacs 0.200.9, ta poprawka nadal nie jest dostępna, kiedy zrobiłem nowy klon kosmicznych znaków rozwijających gałąź i czyszczenie mojego katalogu elpa. Nadal musiałem wyczyścić katalogi organizacji, aby umożliwić ewaluację bloku kodu find ~/.emacs.d/elpa/org* -name "*elc" -delete, a następnie ręcznie zastosować powyższą poprawkę. Dobra wiadomość jest taka, że ​​łatka działa dzisiaj.
Reb.Cabin

Szczerze mówiąc, nie rozumiem struktury gałęzi org git i ich związku z pakietem org-plus-contrib. Wiem, że łatka została zatwierdzona w głównym repozytorium organizacji, ponieważ wykonałem ściągnięcie i powiedziałem zatwierdzenie. Nie mam pojęcia, jak takie łatki dostają się do plików pakietu.
Tim X

0

Musisz mieć w bloku argumenty nagłówka mówiące org-babel, co chcesz uwzględnić w uzyskanych wynikach - wynik oceny lub wyjście na standardowe wyjście lub oba. W twoim przypadku nie ma danych wyjściowych, które wynika z oceny (+ 1 1). Spróbować (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)

Niestety (println (+ 1 1))nie działa. Skopiowałem i wkleiłem wcześniej kod, który również nie działa.
Jeel Shah

2
Wydaje się, że mam taki sam problem z moim. lists.gnu.org/archive/html/emacs-orgmode/2017-02/msg00429.html
stardiviner

0

Próbować

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

która wyświetla zwracaną wartość zamiast wyniku.


1
Nadal nie działa, obszar wiadomości pokazuje „Blok kodu nie zwrócił żadnej wartości”.
stardiviner

0

Ten problem niekoniecznie jest specyficzny dla Spacemacs.

Chociaż OP mógł pośrednio poszukiwać rozwiązania w Spacemacs, wydaje się, że to dobre miejsce, aby wspomnieć o innej alternatywie (szczególnie dla użytkowników spoza Spacemac, którzy mają ten sam problem po aktualizacji niektórych ustawień trybu emacs / org, które co mi się stało).

Po wypróbowaniu wielu ponownych instalacji różnych wersji emacs i org, w końcu odkryłem, że Aquamacs (!) I Org 9.0.5 (pobrane jako tar.gz zgodnie z instrukcją na http://orgmode.org/ ) udało się obejść code block produced no outputProblem ten plakat również wystąpił.

Chociaż Aquamacs może nie być długoterminowym rozwiązaniem dla wszystkich, z pewnością może pomóc innym, którzy są wysoce zależni od używania org-babel z clojure, obejść ten problem, dopóki powyższe rozwiązanie nie zostanie w pełni rozpoznane i wdrożone.

Wersja emacsa używana przez Aquamacs od 9 marca 2017 roku to:

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.