Evaluasi kode Clojure dalam mode-org tidak menghasilkan keluaran


11

Saya mencoba menjalankan kode clojure dari file org saya untuk melakukan beberapa pemrograman melek.

Apa yang tidak berfungsi:

Ketika saya menjalankan blok kode sumber saya dapatkan No output produced.

Contoh blok kode src

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

Apa yang berhasil:

  1. cider-jack-in berfungsi dan saya dapat menjalankan kode di nREPL
  2. Saya dapat menjalankan kode dari .cljfile

Terima kasih

Detail

Emacs 25.1 menggunakan Spacemacs

Org-Mode 9.0.5

Konfigurasi orb 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)))
  )

Tolong beri tahu saya jika Anda membutuhkan informasi lain

Jawaban:


10

Saya melihat dia masalah yang sama. Dalam sedikit penggalian, saya pikir saya telah mengidentifikasi masalahnya. Namun, tidak yakin kepada siapa ini harus dilaporkan.

Masalahnya ada di fungsi org-babel-execute: clojure. Fungsi ini memiliki sedikit kode berikut

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

Masalahnya adalah dalam panggilan ke nrepl-sync-request: eval. Status dokumentasi untuk fungsi ini

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

Kirim INPUT ke server nREPL secara sinkron. Permintaan dikirim melalui CONNECTION. Jika NS bukan nol, sertakan dalam permintaan.

Perhatikan argumen opsional terakhir NS. Ini seharusnya menjadi namespace clojure. Namun, fungsi org-babel-execute: clojure memanggil fungsi ini dengan output dari sesi cider-current, yang mengembalikan ID unik yang mewakili sesi saat ini. Akibatnya, panggilan mengembalikan struktur data dengan kesalahan dan tanpa output (mungkin diperlukan penanganan kesalahan). Hasil yang dikembalikan adalah

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

Perhatikan namespace-not-found

Entah argumennya harus berupa panggilan ke (cider-current-ns) atau mungkin harus ditinggalkan karena saya tidak melihat bagaimana Anda dapat melewati namespace sebagai bagian dari evaluasi blok.

EDIT: di sini adalah tambalan sederhana yang muncul untuk memperbaiki masalah. Dihasilkan melawan kepala saat ini dari 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

Juga mengirim tambalan ke daftar emacs-orgmode


Jadi maksudmu kita harus mengedit fungsinya dan menggantinya (cider-current-ns)? Dan jika demikian, di mana saya dapat menemukan fungsi itu?
Jeel Shah

1
Saya mengatakan bahwa untuk membuat ob-clojure berfungsi, baik panggilan ke (sesi-saat-sari) perlu dibatalkan atau perlu diganti dengan (sari-saat-ns). (Cider-current-ns) adalah bagian dari perpustakaan cider (bersama dengan cider-current-connection) dan (cider-current-session)). Entah Anda perlu mengedit fungsi atau menunggu hingga seseorang memperbaruinya di hulu, tetapi seperti saat ini, itu tidak berfungsi. Saya telah melaporkan ini pada daftar emacs-org, tetapi belum ada tanggapan.
Tim X

Solusi Anda bekerja dengan sempurna. Saya ob-clojuresedikit lebih tua jadi saya menarik yang terbaru, membuat perubahan yang relevan dan berhasil! Terima kasih banyak! Saya berharap Anda telah menjawab beberapa hari sebelumnya! Saya pasti akan memberikan hadiah untuk Anda. :) terima kasih!
Jeel Shah

1
Pada 3 Juni 2017, Emacs 25.1.1, org 9.0.7, spacemacs 0.200.9, perbaikan ini masih belum ketika saya melakukan klon baru spacemacs mengembangkan cabang dan menghapus direktori elpa saya. Saya masih perlu membersihkan direktori org untuk mendapatkan kode-blok eval agar berfungsi find ~/.emacs.d/elpa/org* -name "*elc" -delete, kemudian secara manual menerapkan tambalan di atas. Berita baiknya adalah tambalan bekerja hari ini.
Reb.Cabin

Sejujurnya, saya tidak mengerti struktur cabang org git dan bagaimana mereka berhubungan dengan paket org-plus-contrib. Saya tahu tambalan dimasukkan ke dalam repositori org utama karena saya melakukan penarikan dan mengatakan komit. Tidak tahu bagaimana tambalan tersebut masuk ke file paket.
Tim X

0

Anda harus memiliki argumen tajuk di blok yang memberitahukan org-babel apa yang ingin Anda sertakan dalam hasil yang dihasilkan - hasil evaluasi atau keluaran ke stdout atau keduanya. Dalam kasus Anda, tidak ada output yang dihasilkan evaluasi (+ 1 1). Coba (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)

Sayangnya, (println (+ 1 1))tidak berfungsi. Saya menyalin-menempelkan kode yang Anda miliki di atas dan itu tidak berhasil.
Jeel Shah

2
Sepertinya masalah yang sama dengan milikku. lists.gnu.org/archive/html/emacs-orgmode/2017-02/msg00429.html
stardiviner

0

Mencoba

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

yang mencetak nilai yang dikembalikan, bukan keluaran.


1
Masih tidak berfungsi, Area pesan menunjukkan "Blok kode tidak menghasilkan nilai".
stardiviner

0

Masalah ini belum tentu spesifik untuk Spacemacs.

Sementara OP mungkin secara implisit mencari solusi dalam Spacemacs, ini sepertinya tempat yang bagus untuk menyebutkan alternatif lain (khususnya untuk pengguna non-Spacemacs yang mengalami masalah yang sama setelah memperbarui beberapa bagian dari konfigurasi emacs / org-mode mereka, yang adalah apa yang terjadi pada saya).

Setelah mencoba banyak menginstal ulang berbagai emacs dan versi org, saya akhirnya menemukan bahwa Aquamacs (!) Dan Org 9.0.5 (diunduh sebagai tar.gz seperti yang diperintahkan pada http://orgmode.org/ ) berhasil menyiasati code block produced no outputmasalah poster ini juga dialami.

Sementara Aquamacs mungkin bukan solusi jangka panjang untuk semua orang, itu pasti dapat membantu orang lain yang sangat bergantung pada penggunaan org-babel dengan clojure mengatasi masalah ini sampai solusi di atas diakui dan diimplementasikan sepenuhnya.

Versi emacs yang digunakan oleh Aquamacs pada 9 Maret 2017 ini adalah:

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.