การประเมินโค้ด Clojure ในโหมดองค์กรไม่สร้างผลลัพธ์


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

การกำหนดค่าองค์กร 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-: eval INPUT CONNECTION & NS ตัวเลือก)

ส่ง INPUT ไปยังเซิร์ฟเวอร์ nREPL พร้อมกัน การร้องขอถูกส่งผ่านการเชื่อมต่อ หาก NS ไม่ใช่ศูนย์ให้รวมไว้ในคำขอ

หมายเหตุอาร์กิวเมนต์ NS ทางเลือกล่าสุด นี่ควรจะเป็นเนมสเปซของการปิดบัง อย่างไรก็ตามฟังก์ชั่น org-babel-execute: clojure กำลังเรียกใช้ฟังก์ชันนี้พร้อมกับเอาต์พุตจากไซเดอร์ - กระแส - เซสชันซึ่งส่งคืน ID เฉพาะที่แสดงถึงเซสชันปัจจุบัน ดังนั้นการโทรกำลังส่งคืนโครงสร้างข้อมูลที่มีข้อผิดพลาดและไม่มีเอาต์พุต (อาจจำเป็นต้องจัดการข้อผิดพลาดบางอย่าง) ผลลัพธ์ที่ได้คือ

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

หมายเหตุnamespace-not-found

อาร์กิวเมนต์ควรเป็นการเรียกไปยัง (cider-current-ns) หรือบางทีมันควรจะถูกปล่อยทิ้งไว้เพราะฉันไม่เห็นว่าคุณสามารถส่ง namespace เป็นส่วนหนึ่งของการประเมินผลบล็อกได้อย่างไร

แก้ไข: นี่คือแพทช์ง่ายซึ่งดูเหมือนจะแก้ไขปัญหาได้ สร้างกับหัวหน้าปัจจุบันของ 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)? และถ้าเป็นเช่นนั้นฉันจะหาฟังก์ชั่นนั้นได้จากที่ไหน?
Jeel Shah

1
ฉันกำลังบอกว่าจะทำให้ ob-clojure ทั้งการเรียกไปที่ (ไซเดอร์ - กระแส - เซสชัน) ต้องถูกลบทิ้งหรือมันจะต้องถูกแทนที่ด้วย (ไซเดอร์ - ปัจจุบัน - เอ็น) (cider-current-ns) เป็นส่วนหนึ่งของ cider library (พร้อมกับ cider-current-connection) และ (cider-current-session)) ไม่ว่าคุณจะต้องแก้ไขฟังก์ชั่นหรือรอจนกว่าจะมีคนอัปเดตอัปสตรีม แต่ตอนนี้มันไม่ทำงาน ฉันได้รายงานสิ่งนี้ไว้ในรายการ emacs-org แล้ว แต่ยังไม่มีการตอบกลับ
ทิม X

โซลูชันของคุณทำงานอย่างสมบูรณ์ ฉันob-clojureแก่กว่านิดหน่อยดังนั้นฉันจึงดึงสิ่งที่ใหม่ที่สุดออกมาทำการเปลี่ยนแปลงที่เกี่ยวข้อง ขอบคุณมาก! ฉันขอให้คุณตอบไปสองสามวันก่อน! ฉันจะมอบความโปรดปรานให้คุณอย่างแน่นอน :) ขอบคุณ!
Jeel Shah

1
ตั้งแต่วันที่ 3 มิ.ย. 2560, 25.1.1 ของ Emacs, org 9.0.7, spacemacs 0.200.9, การแก้ไขนี้ยังไม่ได้เกิดขึ้นเมื่อฉันได้ทำการโคลนของ spacemacs ที่พัฒนาสาขาและล้างข้อมูลไดเรกทอรี elpa ของฉัน ฉันยังคงต้องกำจัดไดเรกทอรีขององค์กรเพื่อให้โค้ดบล็อก eval ทำงานfind ~/.emacs.d/elpa/org* -name "*elc" -deleteได้จากนั้นจึงใช้โปรแกรมแก้ไขด้านบนด้วยตนเอง ข่าวดีก็คือว่าแพทช์ทำงานวันนี้
Reb.Cabin

ตามจริงแล้วฉันไม่เข้าใจโครงสร้างของสาขาขององค์กรและวิธีการที่เกี่ยวข้องกับแพคเกจ org-plus-contrib ฉันรู้ว่าแพทช์ได้ถูกส่งไปยังแหล่งเก็บข้อมูลหลักเพราะฉันดึงและพูดคำสั่ง ไม่ทราบว่าแพตช์ดังกล่าวจะเข้าสู่ไฟล์แพ็คเกจได้อย่างไร
ทิม 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))ไม่ทำงาน ฉันคัดลอกโค้ดที่คุณมีด้านบนและไม่ทำงานเช่นกัน
Jeel Shah

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 ต่างๆและองค์กรรุ่นในที่สุดผมก็พบว่าAquamacs (!) และองค์กร 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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.