2016-08-19 2 views
4

Я пытаюсь использовать Haskell для запуска простого производственного процесса. Как и многие производственные процессы, это связано с изменением состояния вещей повсюду. По этой причине, было бы очень удобно для меня, чтобы файл сценария, в котором я мог бы следить за вещами и выборочно запускать команды в интерактивном 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 нажатий клавиш) и в 5 раз эффективнее, чем копия в emacs (около 5 нажатий клавиш). –

+0

Я также могу настроить, как я запускаю строки «на лету», поэтому их кодирование в отдельные команды, а затем перезагрузка модуля также менее эффективна, чем просто изменение строк в скрипте и загрузка их в буфер. –

ответ

1

Это Emacs Lisp функция будет посылать команду РЕПЛА Хаскель

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

я использовал те построить небольшой графический интерфейс отладки для Haskell в Emacs. У меня есть ярлыки для установки точек останова и степпинга, а положение отладчика выделяется непосредственно в коде haskell.

Смежные вопросы