Оценка кода Clojure в режиме org не приводит к выводу


11

Я пытаюсь запустить код clojure из моего файла org, чтобы выполнить грамотное программирование.

Что не работает:

Когда я выполняю блок исходного кода, я получаю No output produced.

Пример блока кода src

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

Что работает:

  1. cider-jack-in работает, и я могу выполнить код в nREPL
  2. Я могу выполнить код из .cljфайла

Спасибо

подробности

Emacs 25.1 с использованием Spacemacs

Орг-режим 9.0.5

Конфигурация 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)))
  )

Пожалуйста, дайте мне знать, если вам нужна другая информация

Ответы:


10

Я вижу у него ту же проблему. Немного покопавшись, думаю, я определил проблему. Однако не уверен, кому об этом следует сообщать.

Проблема в функции org-babel-execute: clojure. Эта функция имеет следующий бит кода

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

Проблема в вызове nrepl-sync-request: eval. Документация заявляет для этой функции

(nrepl-sync-request: eval INPUT CONNECTION и необязательный NS)

Отправьте INPUT на сервер nREPL синхронно. Запрос отправляется через СОЕДИНЕНИЕ. Если NS не ноль, включите его в запрос.

Обратите внимание на последний необязательный аргумент NS. Предполагается, что это будет закрытое пространство имен. Однако функция org-babel-execute: clojure вызывает эту функцию с выводом из cider-current-session, который возвращает уникальный идентификатор, представляющий текущий сеанс. В результате вызов возвращает структуру данных с ошибкой и без вывода (возможно, требуется некоторая обработка ошибок). Возвращенный результат

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

Обратите внимание на пространство имен-не-найдено

Либо аргумент должен быть вызовом (cider-current-ns), либо, возможно, его следует просто опустить, поскольку я не понимаю, как вы можете передать пространство имен как часть оценки блока.

РЕДАКТИРОВАТЬ: вот простой патч, который, кажется, чтобы решить проблему. Создано против текущей главы 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

Также отправил патч в список emacs-orgmode


Так вы говорите, что мы должны отредактировать функцию и заменить ее на (cider-current-ns)? И если да, где я могу найти эту функцию?
Джил Шах

1
Я говорю, что для того, чтобы ob-clojure работал, нужно либо отбросить вызов (cider-current-session), либо заменить его на (cider-current-ns). (Cider-current-ns) является частью библиотеки cider (наряду с cider-current-connection) и (cider-current-session)). Либо вам нужно отредактировать функцию, либо подождать, пока кто-нибудь не обновит ее, но сейчас она не работает. Я сообщил об этом в списке emacs-org, но ответа пока нет.
Тим Икс

Ваше решение работает отлично. Мой ob-clojureбыл немного старше, поэтому я вытащил самые новые, внес соответствующие изменения, и это работает! Спасибо огромное! Я хотел бы, чтобы вы ответили несколько дней назад! Я бы определенно дал вам награду. :) Спасибо!
Джил Шах

1
По состоянию на 3 июня 2017 года, Emacs 25.1.1, org 9.0.7, spacemacs 0.200.9, это исправление еще не вошло, когда я сделал новый клон spacemacs, разрабатывающий ветку и очистку моего каталога elpa. Мне все еще нужно было очистить каталоги org, чтобы заставить работать любой кодовый блок find ~/.emacs.d/elpa/org* -name "*elc" -delete, а затем вручную применить вышеописанный патч. Хорошей новостью является то, что патч работает сегодня.
Reb.Cabin

Честно говоря, я не понимаю структуру ветвей org git и как они связаны с пакетом org-plus-contrib. Я знаю, что патч был добавлен в основной репозиторий org, потому что я сделал pull и произнес коммит. Понятия не имею, как такие патчи попадают в файлы пакета.
Тим Икс

0

В блоке должны быть аргументы заголовка, указывающие org-babel, что вы хотите включить в полученные результаты - результат оценки или вывод в stdout или оба. В вашем случае нет результатов, которые производит оценка (+ 1 1). Попробуй (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)

К сожалению, (println (+ 1 1))не работает. Я скопировал и вставил код, который у вас есть выше, и это тоже не работает.
Джил Шах

2
Кажется, такая же проблема с моей. lists.gnu.org/archive/html/emacs-orgmode/2017-02/msg00429.html
stardiviner

0

Пытаться

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

который печатает возвращенное значение вместо вывода.


1
Все еще не работает, область сообщения показывает «Кодовый блок не вернул значение».
stardiviner

0

Эта проблема не обязательно специфична для Spacemacs.

Хотя OP, возможно, неявно искал решение в Spacemacs, кажется, что это хорошее место, чтобы упомянуть другую альтернативу (особенно для пользователей не-Spacemacs, которые испытывают ту же проблему после обновления некоторой части своей конфигурации emacs / org-mode, которая это то, что случилось со мной).

Попробовав многократную переустановку различных версий emacs и org, я, наконец, обнаружил, что Aquamacs (!) И Org 9.0.5 (загруженные как tar.gz в соответствии с инструкциями на http://orgmode.org/ ) удалось обойти code block produced no outputПроблема у этого постера тоже возникла.

Хотя Aquamacs не может быть долгосрочным решением для всех, он, безусловно, может помочь другим, которые сильно зависят от использования org-babel с clojure, обойти эту проблему, пока вышеупомянутое решение не будет полностью признано и реализовано.

Версия emacs, используемая Aquamacs по состоянию на 9 марта 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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.