Как вызвать интерактивный интерпретатор elisp в Emacs? - PullRequest
38 голосов
/ 28 сентября 2008

Сейчас я пишу выражения в буфер *scratch* и проверяю их, оценивая с помощью C-x C-e . Я был бы очень признателен, если бы у меня был интерактивный интерпретатор, такой как SLIME или irb, в котором я мог бы протестировать выражения Emacs Lisp.

Ответы [ 6 ]

59 голосов
/ 28 сентября 2008

Легко оценить выражения Lisp в режиме Inferior Emacs-Lisp:

M-x ielm

Подробнее об этой функции вы можете прочитать в разделе руководства Emacs "Lisp Interaction"

15 голосов
/ 19 января 2010

Eshell - еще один вариант для интерактивного переводчика Elisp.

M-x eshell

Это не только командная оболочка, такая как bash (или cmd.exe в Windows), но вы также можете в интерактивном режиме писать и выполнять код Elisp.

~ $ ls
foo.txt
bar.txt
~ $ (+ 1 1)
2
8 голосов
/ 28 сентября 2008

Ваша лучшая ставка - это буфер *scratch*. Вы можете сделать его более похожим на REPL, сначала включив отладчик:

M-x set-variable debug-on-error t

Затем используйте C-j вместо C-x C-e, который вставит результат вычисления выражения в буфер в строке после выражения. Вместо истории команд * * * и т. Д. Вы просто перемещаетесь по буферу *scratch* и редактируете.

Если вы хотите, чтобы такие вещи, как * * *, работали, больше как обычный REPL, попробуйте ielm.

M-x ielm
1 голос
/ 04 ноября 2008

Для запуска только одного выражения elisp вы можете использовать ярлык M-: и ввести выражение в мини-буфере. Для других случаев вы можете использовать нуля буфер

1 голос
/ 28 сентября 2008

Что ж, если вы действительно заинтересованы в буквальном REPL для emacs, вы можете написать его, используя режим -batch для emacs:

(require 'cl)

(defun read-expression ()
  (condition-case
      err
      (read-string "> ")
    (error
     (message "Error reading '%s'" form)
     (message (format "%s" err)))))

(defun read-expression-from-string (str)
  (condition-case
      err
      (read-from-string str)
    (error
     (message "Error parsing '%s'" str)
     (message (format "%s" err))
     nil)))

(defun repl ()
  (loop for expr = (read-string "> ") then (read-expression)
        do
        (let ((form (car (read-expression-from-string expr))))
          (condition-case
              err
              (message " => %s" (eval form))
            (error
             (message "Error evaluating '%s'" form)
             (message (format "%s" err)))))))

(repl)

Вы можете вызвать это из командной строки или, как вам кажется, из буфера emacs, на котором работает оболочка:

kburton@hypothesis:~/projects/elisp$ emacs -batch -l test.el
Loading 00debian-vars...
> (defvar x '(lambda (y) (* y 100)))
 => x
> (funcall x 0.25)
 => 25.0
> 
kburton@hypothesis:~/projects/elisp$
1 голос
/ 28 сентября 2008

В буфере *scratch* просто введите C-j, чтобы вычислить выражение перед точкой.

...