Haskell / Intero - 将行发送到 Intero REPL 缓冲区

4

我一直在尝试使用Haskell来运行一个简单的生产过程。像许多生产过程一样,它涉及到在各个地方改变事物的状态。因此,对于我来说,有一个可以跟踪事物并选择性地将命令运行到交互式Haskell中的脚本文件将非常方便,类似于:

-- to start the process
process <- startProcess

-- to stop process
stopProcess

-- to check how things are going
summary <- checkStuff
summary 

-- optionally restart bad processes
restartProcesses (getBadProcesses summary)

-- send summary emails
sendSummaryEmails summary ["abunch@ofemails.com", "thatIwould@rather.com", 
                           "nothaveto@keep.com" "typing@out.com",
                           "orcopy@pasting.com"]

-- set up something big that I don't want to have to retype/paste every time
studentGrades <- getStudentGrades "John Peterson"
gen <- getStdGen
let (randomTest, gen') = generateRandomTest studentGrades gen
compilePdf randomTest
answers <- getAnswers
gradeTest randomTest answers "John Peterson"

如果像R中的ESS (Emacs speaks statistics)一样,你可以按下一个按钮将这些行发送到repl进程,那就太棒了。也许有单独的按钮用于行、段落和区域。这方面是否已经有了解决方法?

例如,在ESS中,C-Ret发送行,C-c C-c发送段落,C-c C-r发送区域。


你为什么无法将文件加载到REPL中,并使用正确的命令和参数?你为什么无法将代码与适当的“main”函数一起编译? - MarLinn
我不想一次性运行这段代码,我想根据进程的当前状态有选择地将其加载到 repl 中,并且使用一个按键 (C-Ret) 来完成这个过程比手动输入(10-60 个按键)快上一个数量级,比在 Emacs 中复制粘贴高效 5 倍左右(大约 5 个按键)。 - Mike Flynn
我也可能想要在运行时自定义如何运行这些代码行,因此将它们编码为单个命令,然后重新加载模块比只是更改脚本中的行并将其加载到缓冲区中效率低下。 - Mike Flynn
我明白......对此我没有答案。但是你仍然可以定义本地函数;如果它们只有一个字符长,那么每个指令只需要两个按键。也许可以使用 :e 或者自己在 .ghci 中创建一个命令来帮助即时编辑。 - MarLinn
1个回答

1
这个Emacs Lisp函数将发送命令到Haskell的REPL。
(defun haskell-send-command (cmd)
  (process-send-string (inferior-haskell-process) (concat cmd "\n")))

这将使用当前选择调用上一个。
(defun haskell-send-selection ()
  (interactive)
  (haskell-send-command (x-selection)))

你可以使用global-set-key为其分配一个键盘快捷方式。然后,您需要弄清楚如何快速选择要发送的内容。例如,M-h是标记段落。或者只需重新编码您喜欢的ESS函数:

(defun haskell-send-paragraph ()
  (interactive)
  (mark-paragraph)
  (haskell-send-selection))

我实际上使用它们在emacs中构建了一个小的Haskell调试GUI。我有设置断点和步进的快捷键,调试器的位置直接在Haskell代码中突出显示。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接