Đánh giá mã Clojure trong chế độ org không tạo ra đầu ra


10

Tôi đang cố chạy mã clojure từ tệp org của mình để thực hiện một số chương trình biết chữ.

Những gì không hoạt động:

Khi tôi thực thi khối mã nguồn tôi nhận được No output produced.

Khối mã src mẫu

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

Những gì đang làm việc:

  1. cider-jack-in đang hoạt động và tôi có thể thực thi mã trong nREPL
  2. Tôi có thể thực thi mã từ một .cljtập tin

Cảm ơn

Chi tiết

Emacs 25.1 sử dụng Spacemacs

Chế độ Org 9.0.5

Cấu hình 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)))
  )

Xin vui lòng cho tôi biết nếu bạn cần bất kỳ thông tin khác

Câu trả lời:


10

Tôi đang nhìn thấy anh ấy cùng một vấn đề. Trong một chút đào, tôi nghĩ rằng tôi đã xác định được vấn đề. Tuy nhiên, không chắc chắn điều này nên được báo cáo cho ai.

Vấn đề là ở hàm org-babel-exec: clojure. Hàm này có bit mã sau

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

Vấn đề là trong lệnh gọi nrepl-sync-request: eval. Các tài liệu nêu rõ chức năng này

(nrepl-sync-request: eval INPUT KẾT NỐI & NS tùy chọn)

Gửi INPUT đến máy chủ nREPL một cách đồng bộ. Yêu cầu được gửi qua KẾT NỐI. Nếu NS không phải là con số không, hãy đưa nó vào yêu cầu.

Lưu ý đối số tùy chọn cuối cùng NS. Đây được cho là một không gian tên clojure. Tuy nhiên, hàm org-babel-exec: clojure đang gọi hàm này với đầu ra từ cider-current-session, trả về một ID duy nhất đại diện cho phiên hiện tại. Do đó, cuộc gọi đang trả về cấu trúc dữ liệu có lỗi và không có đầu ra (có lẽ cần phải xử lý một số lỗi). Kết quả trả về là

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

Lưu ý không gian tên không tìm thấy

Đối số nên là một cuộc gọi đến (cider-current-ns) hoặc có lẽ nó nên bị bỏ qua vì tôi không thấy cách bạn có thể vượt qua không gian tên như một phần của đánh giá khối.

EDIT: đây là một bản vá đơn giản xuất hiện để khắc phục vấn đề. Tạo ra chống lại người đứng đầu hiện tại của 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

Đồng thời gửi bản vá đến danh sách emacs-orgmode


Vì vậy, bạn đang nói rằng chúng ta nên chỉnh sửa chức năng và thay thế nó bằng (cider-current-ns)? Và nếu vậy, tôi có thể tìm thấy chức năng đó ở đâu?
Jeel Shah

1
Tôi đang nói rằng để làm cho ob-clojure hoạt động, hoặc cuộc gọi đến (phiên bản hiện tại) cần phải bị hủy hoặc nó cần phải được thay thế bằng (cider-current-ns). (Cider-current-ns) là một phần của thư viện cider (cùng với cider-current-Connection) và (cider-current-session)). Hoặc bạn cần chỉnh sửa chức năng hoặc đợi cho đến khi ai đó cập nhật nó ngược dòng, nhưng như hiện tại, nó không hoạt động. Tôi đã báo cáo điều này trên danh sách emacs-org, nhưng chưa có phản hồi nào.
Tim X

Giải pháp của bạn đang hoạt động hoàn hảo. Tôi ob-clojuređã lớn hơn một chút nên tôi đã kéo những cái mới nhất, thực hiện những thay đổi có liên quan và nó hoạt động! Cảm ơn bạn rất nhiều! Tôi ước bạn đã trả lời một vài ngày trước đó! Tôi chắc chắn sẽ đưa tiền thưởng cho bạn. :) Cảm ơn!
Jeel Shah

1
Kể từ ngày 3 tháng 6 năm 2017, Emacs 25.1.1, org 9.0.7, spacemacs 0.200.9, bản sửa lỗi này vẫn chưa xuất hiện khi tôi thực hiện một bản sao mới của spacemacs phát triển chi nhánh và xóa sạch thư mục elpa của tôi. Tôi vẫn cần phải xóa các thư mục org để làm cho bất kỳ eval chặn mã nào hoạt động find ~/.emacs.d/elpa/org* -name "*elc" -delete, sau đó áp dụng bản vá ở trên. Tin tốt là bản vá hoạt động ngày hôm nay.
Reb.Cabin

Thành thật mà nói, tôi không hiểu cấu trúc của các nhánh org git và cách chúng liên quan đến gói org-plus-contrib. Tôi biết bản vá đã được cam kết vào kho org chính vì tôi đã thực hiện thao tác kéo và nói cam kết. Không biết làm thế nào các bản vá như vậy có được vào các tập tin gói.
Tim X

0

Bạn cần phải có các đối số tiêu đề trong khối thông báo cho org-babel những gì bạn muốn đưa vào kết quả được tạo ra - kết quả đánh giá hoặc đầu ra cho thiết bị xuất chuẩn hoặc cả hai. Trong trường hợp của bạn, không có đầu ra mà việc đánh giá (+ 1 1)sản xuất. Hãy thử (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)

Thật không may, (println (+ 1 1))không hoạt động. Tôi đã sao chép-dán mã bạn có ở trên và nó cũng không hoạt động.
Jeel Shah


0

Thử

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

trong đó in giá trị trả về thay vì đầu ra.


1
Vẫn không hoạt động, Vùng thông báo hiển thị "Khối mã không trả về giá trị".
stardiviner

0

Vấn đề này không nhất thiết phải cụ thể đối với Spacemacs.

Mặc dù OP có thể đã ngầm tìm kiếm một giải pháp trong Spacemacs, nhưng đây có vẻ là một nơi tốt để đề cập đến một giải pháp thay thế khác (đặc biệt đối với người dùng không phải Spacemacs đang gặp vấn đề tương tự sau khi cập nhật một số cấu hình emacs / org-mode của họ, mà là những gì đã xảy ra với tôi).

Sau khi thử nhiều lần cài đặt lại các phiên bản emac và org khác nhau, cuối cùng tôi cũng thấy rằng Aquamacs (!) Và Org 9.0.5 (được tải xuống dưới dạng tar.gz theo hướng dẫn trên http://orgmode.org/ ) đã thành công trong việc khắc phục code block produced no outputvấn đề poster này cũng có kinh nghiệm.

Mặc dù Aquamacs có thể không phải là một giải pháp lâu dài cho tất cả mọi người, nhưng nó chắc chắn có thể giúp những người khác phụ thuộc nhiều vào việc sử dụng org-babel với clojure khắc phục vấn đề này cho đến khi giải pháp trên được công nhận và thực hiện đầy đủ.

Phiên bản emacs được Aquamacs sử dụng kể từ ngày 9 tháng 3 năm 2017 này là:

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.