スライムから 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)))