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 说统计)一样,如果您可以按下按钮将这些行发送到 repl 进程,那将是非常酷的。可能是行、段落、区域的单独按钮。有没有办法做到这一点?

例如使用 ESS,C-Ret发送行、C-c C-c发送段落和C-c C-r发送区域。

4

1 回答 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 代码中突出显示。

于 2016-08-24T11:09:58.000 回答