#haskell #emacs
Вопрос:
В файле исходного кода Haskell:
-- gt;gt;gt; sin 5
Набрав комбинацию клавиш, вы получите следующие результаты:
-- λgt; sin 5 -- -0.9589242746631385 -- it :: Floating a =gt; a -- (0.03 secs, 133,480 bytes)
Эта функция довольно удобна. Кто-нибудь знает, как это сделать с Emacs?
Комментарии:
1. «результаты ниже» Ниже ничего нет. Пожалуйста, включите это в свой вопрос.
2. @Фрэнки обновил
3. О чем ты спрашиваешь? Как рассчитать sin(5) с помощью Emacs? Вопрос не совсем ясен.
4. Это возможно, но, похоже, не прилагается
haskell-mode
. Вы могли бы посмотреть наhaskell-repl.el
это и попробовать построить поверх этого. С таким же успехом вы могли бы создатьghci
процесс и вручную взаимодействовать с ним.5. @раджашекар тх. Мне удалось найти функцию:
(haskell-interactive-mode-run-expr)
. Изменил(defun haskell-interactive-mode-expr-result (state response)
, чтобы просто печатать в текущем буфере
Ответ №1:
Мне удалось изменить код в режиме хаскелла:
(require 'subr-x) (defun my-run-haskell-expr () "Get haskell expression" (interactive) (search-backward "-- gt;gt;gt;") (setq my-expr (string-remove-prefix "-- gt;gt;gt;" (buffer-substring-no-properties (line-beginning-position) (line-end-position)))) (my-haskell-interactive-mode-run-expr my-expr) ) (defun my-haskell-interactive-mode-run-expr (expr) "Run the given expression." (let ((session (haskell-interactive-session)) (process (haskell-interactive-process))) (haskell-process-queue-command process (make-haskell-command :state (list session process expr 0) :go (lambda (state) ;; (goto-char (point-max)) ;; (insert "n") (end-of-line) (insert "n") (beginning-of-line) (setq haskell-interactive-mode-result-end (point-max)) (haskell-process-send-string (cadr state) (haskell-interactive-mode-multi-line (cl-caddr state))) (haskell-process-set-evaluating (cadr state) t)) :complete (lambda (state response) (haskell-process-set-evaluating (cadr state) nil) (unless (haskell-interactive-mode-trigger-compile-error state response) (my-haskell-interactive-mode-expr-result state response))))))) (defun my-haskell-interactive-mode-expr-result (state response) "Print the result of evaluating the expression." ;; (mapc 'insert (split-string-and-unquote response)) (mapc (lambda (str) (progn (insert "-- ") (insert str) (insert "n"))) (split-string-and-unquote response "n"))) (global-set-key (kbd "C-c C-e") 'my-run-haskell-expr) ;; end of haskell inline evaluation
Просто привяжите функцию my-get-haskell-expr
к ярлыку, и она будет работать.