Оцінка коду 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

Org-режим 9.0.5

Конфігурація оргушки

(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 ВХІД З'ЄДУ та необов'язковий NS)

Введіть ВХОД на сервер nREPL синхронно. Запит надсилається через CONNECTION. Якщо NS не відповідає нулю, включіть його у запит.

Зверніть увагу на останній необов'язковий аргумент NS. Це має бути простором імен clojure. Однак функція org-babel-Execute: clojure викликає цю функцію з виведенням із седер-поточного сеансу, який повертає унікальний ідентифікатор, що представляє поточний сеанс. Як результат, виклик повертає структуру даних з помилкою та без виводу (можливо, потрібна деяка обробка помилок). Повернений результат є

(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), або, можливо, його просто слід опустити, оскільки я не бачу, як можна передавати простір імен як частину блокової оцінки.

EDIT: ось простий патч, який, як видається, вирішує проблему. Згенеровано проти нинішнього керівника органополітичної репо

---
 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)? І якщо так, то де я можу знайти цю функцію?
Jeel Shah

1
Я кажу, що для того, щоб зробити роботу з приводу клоуреру, потрібно або відмовитись від виклику (cider-current-session), або замінити його на (cider-current-ns). (Cider-current-ns) є частиною бібліотеки сидру (поряд із з'єднанням cider-current) та (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-plus-contrib. Я знаю, що виправлення було зафіксовано в основне сховище org, тому що я здійснив тягнення і скажу "фіксація". Не знаю, як такі патчі потрапляють у файли пакунків.
Тім X

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))не працює. Я скопіював вкладений вище код, який не працює.
Джел Шах


0

Спробуйте

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

який друкує повернене значення замість виводу.


1
Все ще не працює, область повідомлень показує "Код блоку не повернув значення".
stardiviner

0

Ця проблема не обов'язково стосується Spacemacs.

Хоча ОП, можливо, неявно шукала рішення у 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 з клоджуром, подолати цю проблему до тих пір, поки вищезазначене рішення не буде повністю визнано та не реалізовано.

Версія 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.