Оцените буфер в ghci или объятиях через Emacs - PullRequest
9 голосов
/ 20 октября 2011

Используя sml-режим в Emacs, я смог отправить содержимое буфера напрямую в низший процесс SML, используя C-c C-b. Теперь я хочу сделать то же самое только с Haskell. Режим Haskell, похоже, не поддерживает это, поэтому я задаюсь вопросом: как правильно поступить с Emacs и Haskell?

При изучении SML я почти непрерывно использовал C-c C-b, чтобы легко оценить свою программу на ходу, мгновенно увидеть результаты присвоения значений и т. Д. Но если я использую C-c C-l в режиме haskell на сохраненном файл, содержащий две строки, let foo = "foo" и let bar = "bar" - я получаю "parse error (possibly incorrect indentation)"

Ответы [ 2 ]

9 голосов
/ 21 октября 2011

Я думаю, что вы делаете распространенную ошибку новичка, путая то, что вы можете написать внутри repl из ghci и что вы пишете в исходном файле на haskell.

Все интерпретаторы sml сделаны таким образом, что вы можете записать любое объявление верхнего уровня в repl или поместить другими словами: все, что вы можете записать в файл sml, вы можете написать в интерпретатор sml. Таким образом, вам разрешено записать val foo = "bar" в файл и использовать C-c C-b для загрузки файла, и вам разрешено просто вставить val foo = "bar" в интерпретатор.

С другой стороны, из-за того, как работает haskell, вы можете записать let foo = 42 в ghci, однако это недопустимое объявление верхнего уровня, и, следовательно, это не может быть в исходном файле haskell (сам по себе). С другой стороны, вы можете иметь id n = n в исходном файле haskell и использовать C-c C-l для загрузки файла, однако вы не можете записать это непосредственно в ghci (вы получите ошибку:: 1: 6: ошибка разбора на введите '='). Причина этого в том, что repl в ghci выполняется в монаде IO, и поэтому все, что вы пишете в ghci, должно выполняться с использованием нотации do. Я могу только порекомендовать вам прочитать Интерактивная оценка по приглашению из Руководства пользователя Using GHCi.

C-c C-b в режиме sml - это то же самое, что и C-c C-l в режиме haskell, по крайней мере концептуально. Я не знаю много о внутренностях haskell-mode, но в sml-mode C-c C-b выполняет некоторый sml-код в интерпретаторе, обычно это функция use(...). В режиме haskell он, кажется, просто выполняет команду :load "..." ghci

5 голосов
/ 20 октября 2011

Вы не можете сделать это с помощью ghci (или объятий) по той простой причине, что вы не можете написать определения верхнего уровня в ghci (или объятиях).Поэтому, даже если вы вручную вставили содержимое вашего файла в ghci, все, что вы получите, это синтаксическая ошибка.

Поэтому загрузка файла с помощью Cc Cl - лучшее, что вы можете сделать.

...