Emacs SLIME - Common Lisp - 评估区域并打印所有结果

Emacs SLIME - Common Lisp - evaluating region and printing all the results

我安装了 Emacs+SLIME+SBCL,我是这方面的新手。所以,我的问题是如何评估整个文件或文件的选定区域并将每个表达式的结果打印到控制台。例如,代码

(+ 3 5)
(defun my-first (a) (car a))
(my-first (list 5 7 3))

我想在控制台中看到这个:

8
MY_FIRST
5

感谢您的帮助。

基本上取决于您的 emacs 设置:

但是请将光标放在 s 表达式中最后一个父项之后;

C-x C-e 计算s表达式,并将结果发送到迷你缓冲区,如果将结果存储在变量中,则该变量在REPL SESSION中可用

如果你想编译和加载一个函数,检查这个

C-c C-c,在函数的最后一个父函数处,那么该函数将在 REPL 上可用

最后在 emacs 菜单栏中检查你的 slime 菜单是否启用了 F10:

以及编译和加载文件:

youtube 上有 marco Baringer 的一个很好的教程,我建议你花点时间去做,这是对 emacs 和 slime 的一个很好的(我认为最好的)介绍。

您可以定义自己的 Emacs-Lisp 函数,该函数 将您所在区域的表单 list 包装在 list 内,评估此列表并打印所有结果。 如果我需要查看多个表单的结果,这就是我手动执行的确切操作,这种情况很少见。

否则,我只是在每个表格上使用C-x e

所以,对我来说最好和最简单的解决方案是按以下方式包装代码:

    (format t "~{~a~%~}" (list
     <code in file>
    ))

然后我在文件末尾执行 C-x C-e,然后在 REPL 中一一获取我所有表达式的结果。谢谢大家。

UPD 我使用互联网和这个答案:How to run Common Lisp code with Slime in Emacs Lisp 来编写这两个函数。 此代码位于我的 .emacs 文件中。 现在我只需要按 'C-c e' 或 'C-c r' 来评估所有文件或仅选择区域。 问题彻底解决

(require 'slime)
(defun lispy--eval-lisp (str)
  "Eval STR as Common Lisp code."
  (unless (slime-current-connection)
    (let ((wnd (current-window-configuration)))
      (slime)
      (while (not (and (slime-current-connection)
                       (get-buffer-window (slime-output-buffer))))
        (sit-for 0.2))
      (set-window-configuration wnd)))
  (let (deactivate-mark)
    (slime-eval `(swank:eval-and-grab-output ,str))))

(defun feval () 
    "Evaluates the whole file"
    (interactive)
    (message (car (lispy--eval-lisp 
        (concat "(format t \"~{~a~%~}\" (list " (string-make-unibyte (buffer-string)) "))")))))
(defun reval (from to)
    (interactive "r")
    (message (car (lispy--eval-lisp 
        (concat "(format t \"~{~a~%~}\" (list " (string-make-unibyte (buffer-substring from to)) "))")))))  

(global-set-key "\C-ce" 'feval)
(global-set-key "\C-cr" 'reval)