0

スライムから nrepl にいくつかのコードをひねろうとしています。スライムを扱うときのコードは明らかです。評価する clojure コードを送信し、結果の文字列を取得して、必要に応じて処理します。nrepl とやり取りできるようにコードを変更しました。つまり、結果の文字列を処理する独自の値ハンドラーを作成し、それを nrepl-make-response-handler に渡します。今まで問題なく動作しています。しかし、一度に複数のバッファを操作するコードを見つけました。nrepl-make-response-handler は 1 つのバッファー引数しか受け付けないので、それを無視して、値ハンドラーで複数のバッファーを処理するコードを呼び出すことができるかどうか疑問に思っていました。やってみたが失敗、何も変わらない。そこにelispの専門家はいますか?私は本当に助けが必要です。

私自身のハンドラー:

(defun nrepl-interactive-eval-read-replace-handler (buffer)
"Make a handler for evaluating and process global replacement."
  (nrepl-make-response-handler buffer
                           (lambda (buffer value)
                             (let ((sexp (read value)))
                               (clojure-refactorcng-process-global-replacements sexp)))
                           '()
                           (lambda (buffer err)
                             (message "%s" err))
                           '()))

クライアントコード:

(defun nrepl-interactive-eval-read-replace (form)
"Evaluate the given FORM and process global replacement"
  (let ((buffer (current-buffer)))
    (nrepl-send-string form
                   (nrepl-interactive-eval-read-replace-handler buffer)
                   nrepl-buffer-ns)))

結果を処理するコード:

(defun get-from-alist (key alist)
  (car (cdr (assoc key alist))))

(defun clojure-refactoring-process-global-replace (replace)
  (if (get-from-alist :new-source replace)
    (progn
      (if (string= (file-truename (buffer-file-name))
                 (file-truename (get-from-alist :file replace)))
        nil
        (find-file (get-from-alist :file replace)))
      (goto-char (point-min))
      (erase-buffer)
      (insert (get-from-alist :new-source replace)))))

(defun clojure-refactoring-process-global-replacements (replacements)
  (save-window-excursion
    (mapcar #'clojure-refactoring-process-global-replace replacements)))
4

1 に答える 1