Emacs: как оценить выражения Haskell в разделе комментариев в исходном файле

#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 к ярлыку, и она будет работать.