如何快速方便的使 repl 中包含项目运行到某一处的上下文

不少 emacs 包都提供了 repl 的支持,像 sly、ghci、python 这种能把当前写的代码直接送到 repl 里运行,来直接做测试,查看结果。这很方便,可很多时候我需要 eval 的东西是有上下文依赖的。特别是在项目里,为了到达这一步,需要走很长的一串流程,手建这个环境会非常的麻烦。

有什么比较好的方法来让 repl 快速到我所需要的这个上下文环境里呢?

我的想法是给某个改变当前 buffer 就触发的全局钩子添加一个函数,当buffer当前路径变化时,就根据路径输入repl 特定的工作路径变更命令且发送到解释器来执行

不过具体是哪些buffer需要触发这个事件得考虑一下,也许可以限制在某个项目内

一个想法可能是写一个载入脚本, 比如叫做 .load-dep.lisp, 放在一个地方, 然后里面的内容是类似于载入其他的依赖文件, 每次写好一个模块之后就把这个模块文件添加到 .load-dep.lisp 里面.

类似的操作在 common lisp 里面大概就是往 xxx.asd 里面的 defsystem:component 里面加新的写好的模块, 然后每次重新进入这个环境的时候就 (ql:quickload xxx). 至少目前我是这么干的.

或者可以稍微不那么安全一点, 用 File Variable 来实现, 比如说在 foo.lisp 里面:

;; -*- eval: (sly-load-file "./bar.lisp") -*-
(format t "foo")

然后在 bar.lisp 里面:

(format t "balabala")

大概可以这样 (?) 最近看到一些老代码是这么干的.

1 个赞

我只有 lisp 和 clojure 的经验,之前自己的实践也是跟 3 楼的做法基本一致,不过我是把一系列上下文写在页面最底部的注释里

lisp 里就是

#|
(progn
 (func-a b c)
 (func-e f g)
 ;; ...
 )
|#

clojure 里就是

(comment 
  (do
    (func-a b c)
    (func-e f g)
    ;; ...
    )
  ;; For test only.
  )

打开文件后手动 C-x C-e 去 eval 一下,就能获得自己想要的上下文了