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

时间:2015-10-26 11:24:39

标签: emacs lisp common-lisp slime

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

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

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

8
MY_FIRST
5

感谢您的帮助。

3 个答案:

答案 0 :(得分:1)

因此,对我来说最好和最简单的解决方案是下一步包装代码:

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

而不是我在文件的末尾做C-x C-e,并逐个获取所有表达式的结果。谢谢大家。

<强> 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)

答案 1 :(得分:0)

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

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

C-x C-e评估de表达式,并将结果发送到迷你缓冲区,如果将结果存储在变量中,则此varibable可用于REPL SESSION

如果你想编译并加载一个函数,请检查

C-c C-c,在函数的最后一个父级,然后该函数将在REPL上可用

如果你启用F10:

,最后检查emacs菜单栏中的slime菜单

enter image description here

以及编译和加载文件:

enter image description here

并且youtube上有一个来自marco Baringer的精彩教程,我建议您花点时间做这件事,对于emacs和史莱姆来说是一个很好的(我认为是最好的)。

答案 2 :(得分:0)

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

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