Kuruluş kipinde clojure kodu değerlendirmesi çıktı üretmez


11

Bazı okuryazar programlama yapmak için benim org dosyasından clojure kodu çalıştırmak çalışıyorum.

Çalışmayanlar:

Kaynak kod bloğunu çalıştırdığımda alıyorum No output produced.

Örnek src kod bloğu

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

Ne çalışıyor:

  1. cider-jack-in çalışıyor ve nREPL kodunu çalıştırabiliyorum
  2. Bir .cljdosyadan kod yürütebilirim

Teşekkürler

ayrıntılar

Spacemacs kullanarak Emacs 25.1

Kuruluş Modu 9.0.5

Kuruluş babel yapılandırması

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

Başka bilgiye ihtiyacınız olursa lütfen bize bildirin.

Yanıtlar:


10

Aynı sorunu görüyorum. Biraz araştırmada, sanırım sorunu tespit ettim. Ancak, bunun kime bildirilmesi gerektiğinden emin değilim.

Sorun org-babel-execute: clojure işlevindedir. Bu işlev aşağıdaki kod bitine sahiptir

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

Sorun nrepl-sync-request: eval çağrısındadır. Bu işlev için belgeler

(nrepl-sync-request: INPUT CONNECTION ve isteğe bağlı NS'yi değerlendirin)

INPUT'u nREPL sunucusuna eşzamanlı olarak gönderin. İstek BAĞLANTI yoluyla gönderilir. NS sıfır değilse, isteği ekleyin.

Son isteğe bağlı NS bağımsız değişkenine dikkat edin. Bunun bir clojure ad alanı olması gerekiyordu. Ancak, org-babel-execute: clojure işlevi bu işlevi, geçerli oturumu temsil eden benzersiz bir kimlik döndüren cider-current-session çıkışıyla çağırır. Sonuç olarak, çağrı bir veri yapısını bir hata ile ve çıkış olmadan döndürüyor (belki de bazı hataların işlenmesi gerekir). Döndürülen sonuç

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

Bulunamayan ad alanını not edin

Ya argüman (elma şarabı-akım-ns) çağrısı olmalı ya da blok değerlendirmesinin bir parçası olarak ad alanını nasıl geçirebileceğinizi görmediğim için belki de dışarıda bırakılmalıdır.

EDIT: İşte sorunu çözmek için görünen basit bir yama. Org git repo'nun şu anki başkanına karşı oluşturuldu

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

Yamayı emacs-orgmode listesine de gönderdi


Yani fonksiyonu düzenlememiz ve onun yerine koymamız gerektiğini mi söylüyorsunuz (cider-current-ns)? Ve eğer öyleyse, bu işlevi nerede bulabilirim?
Jeel Shah

1
Ob-clojure'un çalışması için ya (elma şarabı-oturum) çağrısının bırakılması ya da (elma şarabı-akım) ile değiştirilmesi gerektiğini söylüyorum. (Elma şarabı-akım-ns) elma şarabı kütüphanesinin (elma şarabı-akım bağlantısı ile birlikte) ve (elma şarabı-akım-oturumu) bir parçasıdır. İşlevi düzenlemeniz veya birisinin akış yukarı güncelleyene kadar beklemeniz gerekir, ancak şimdi durduğu gibi çalışmaz. Bunu emacs-org listesinde bildirdim, ancak henüz yanıt yok.
Tim X

Çözümünüz mükemmel çalışıyor. Benim ob-clojurebiraz yaşlıydı, bu yüzden en yeni olanları çektim, ilgili değişiklikleri yaptım ve işe yarıyor! Çok teşekkür ederim! Keşke birkaç gün önce cevap vermiş olsaydın! Sana kesinlikle ödül verirdim. :) Teşekkürler!
Jeel Shah

1
3 Haziran 2017, Emacs 25.1.1, org 9.0.7, spacemacs 0.200.9'dan itibaren, spacemacs yeni bir klon dalı ve elpa dizinimi silme geliştirdiğimde bu düzeltme hala değil. Hala herhangi bir kod bloğu eval çalışmak için org dizinleri temizlemek gerekiyordu find ~/.emacs.d/elpa/org* -name "*elc" -delete, sonra elle yukarıdaki yama uygulamak. İyi haber şu ki yama bugün çalışıyor.
Reb.Cabin

Dürüst olmak gerekirse, org git dallarının yapısını ve org-plus-katkı paketi ile ilişkilerini anlamıyorum. Yamanın ana kuruluş deposuna işlendiğini biliyorum çünkü bir çekim yaptım ve taahhüdü söyledim. Bu yamaların paket dosyalarına nasıl girdiği hakkında hiçbir fikrim yok.
Tim X

0

Blokta, org-babel'e üretilen sonuçlara ne eklemek istediğinizi söyleyen başlık argümanlarına sahip olmanız gerekir - değerlendirme veya stdout'a çıktı veya her ikisi. Sizin durumunuzda, değerlendirmenin (+ 1 1)ürettiği bir çıktı yoktur . Deneyin (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)

Maalesef (println (+ 1 1))çalışmıyor. Yukarıdaki kodu kopyaladım ve bu da çalışmıyor.
Jeel Shah

2
Benimkiyle aynı problemi var gibi görünüyor. lists.gnu.org/archive/html/emacs-orgmode/2017-02/msg00429.html
stardiviner

0

Deneyin

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

çıktı yerine döndürülen değeri yazdırır.


1
Hala çalışmıyor, Mesaj alanı "Kod bloğu değer döndürmedi" gösterir.
stardiviner

0

Bu sorun Spacemac'lara özgü değildir.

OP, Spacemacs içinde dolaylı olarak bir çözüm aramış olsa da, bu, emacs / org-mode yapılandırmasının bir kısmını güncelledikten sonra aynı sorunu yaşayan Spacemacs olmayan kullanıcılar için başka bir alternatiften söz etmek için iyi bir yer gibi görünüyor. başıma gelen şey).

Çeşitli emacs ve org sürümlerinin birçok yeniden yüklemesini denedikten sonra , sonunda Aquamacs (!) Ve Org 9.0.5'in ( http://orgmode.org/ adresinde belirtildiği gibi tar.gz olarak indirildi ) code block produced no outputsorun bu poster de yaşadı.

Aquamacs herkes için uzun vadeli bir çözüm olmasa da, yukarıdaki çözüm tamamen tanınana ve uygulanıncaya kadar, orj-babel'i clojure ile kullanmaya son derece bağımlı olanların bu sorunu aşmasına kesinlikle yardımcı olabilir.

9 Mart 2017 itibariyle Aquamacs tarafından kullanılan emacs sürümü:

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.