2016-08-19 77 views
4

我一直在尝试使用Haskell来运行简单的生产过程。像许多生产过程一样,它涉及改变各地的状态。出于这个原因,这将是非常方便的,让我有一个脚本文件,在那里我可以跟踪的东西,有选择地运行命令为互动哈斯克尔,像Haskell/Intero - 将行发送到Intero REPL缓冲区

-- 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 ["[email protected]", "[email protected]", 
          "[email protected]" "[email protected]", 
          "[email protected]"] 

-- 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" 

这将是,如果真的很酷,喜欢与ESS (Emacs讲统计数据)在R中,如果你可以按下按钮将这些行发送到repl进程。也许分隔线,段落,地区的按钮。有没有办法做到这一点?

例如用ESS,C-Ret发送一行,C-c C-c发送一个段落,C-c C-r发送一个区域。

+0

什么使您无法使用正确的命令和参数将文件加载到repl中?什么让你无法用合适的'main'函数编译代码? – MarLinn

+0

我不想一次全部运行这段代码,我想根据当前的进程状态选择性地将其加载到repl中,并且通过一次按键('C-Ret')做到这一点是一个数量级与键入(10-60个击键)相比性能提升,比emacs中的复制粘贴(约5个按键)效率高5倍。 –

+0

我也可能想要自定义如何在线运行这些线,因此将它们编码为单个命令,然后重新加载模块的效率也低于仅更改脚本中的行并将其加载到缓冲区中的效率。 –

回答

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

相关问题