2008-09-28 9 views

Respuesta

53

Es fácil de evaluar expresiones Lisp en Inferiores Emacs-Lisp modo:

M-x ielm 

Usted puede leer más sobre esta opción en el Emacs manual section on "Lisp Interaction"

+1

exactamente lo que estaba? buscando, ¡muchas gracias! –

1

En el búfer *scratch*, simplemente escriba C-j para evaluar la expresión antes del punto.

0

Bueno, si usted está realmente interesado en un REPL literal para emacs es posible escribir uno usando el modo de emacs -batch:

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

Usted puede llamar a esto desde la línea de comandos, o, como parece que desear, desde el interior de un búfer de Emacs ejecutar un intérprete:

[email protected]:~/projects/elisp$ emacs -batch -l test.el 
Loading 00debian-vars... 
> (defvar x '(lambda (y) (* y 100))) 
=> x 
> (funcall x 0.25) 
=> 25.0 
> 
[email protected]:~/projects/elisp$ 
+0

Esto se ve más complicado de lo que debería ser: ejecutar un shell, que ejecuta otro emacs en modo batch, que ejecuta el REPL, todo dentro del tiempo de ejecución principal de emacs. De todos modos, soluciona mi problema, ¡así que gracias por la ayuda! –

+0

Esta implementación de REPL no maneja las entradas de varias líneas. Si usted no termina una expresión en una sola línea que da: error de análisis '(lo que sea' (EOF repl.el) ¿Hay una manera fácil de arreglar eso –

8

Su mejor apuesta es el buffer *scratch*. Puede que sea más como un REPL por primera encender el depurador:

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

A continuación, utilice C-j en lugar de C-x C-e, que se inserte el resultado de evaluar la expresión en la memoria intermedia en la línea después de la expresión. En lugar de cosas como el historial de comandos, * * * y demás, simplemente mueva el buffer *scratch* y edítelo.

Si desea que cosas como * * * funcionen, más como un REPL habitual, intente ielm.

M-x ielm 
1

Para ejecutar sólo una expresión elisp puede utilizar M-: atajo e ingrese expresión en mini-buffer. Para otros casos, puede usar cero memoria intermedia

14

Eshell es otra opción para un intérprete interactivo de Elisp.

M-x eshell 

No sólo es una consola de comandos como bash (o si cmd.exe en Windows) pero también se puede escribir de forma interactiva y ejecutar código Elisp.

+2

bien, eso es simplemente ... fascinante ... la capacidad de mezcla ... Definitivamente tendré que jugar más con esto. Aunque es una respuesta indirecta a la pregunta, me alegra que ¡la respuesta está aquí! '$ echo (buffer-name) | sed -e 's/\ */X/g'' da 'XeshellX', etc. – lindes

Cuestiones relacionadas