27

Me gustaría saber si hay un REPL que no es específico del idioma. Paso mucho tiempo sumergiéndome y saliendo de los REPL (principalmente para Clojure, Scala y Haskell), y todos los paquetes me frustran en mayor o menor medida. Parece que el trabajo de un REPL es bastante genérico en el que:¿Una REPL para enlazarlos a todos?

  • Leer: tomar la entrada del usuario
  • Evaluar: pasar la entrada a algún tiempo de ejecución para el procesamiento de
  • de impresión: imprimir los resultados a la pantalla
  • Loop: esperar a la siguiente entrada del usuario

no veo por qué no debería haber alguna REPL independiente del idioma, pero no he podido encontrar tal cosa. Algunas cosas que me gustaría en mi REPL ideales:

  • Linux línea de comandos de la aplicación
  • historia Infinito accesible a través de la flecha hacia arriba
  • Posibilidad de editar los comandos anteriores antes de volver a ejecutar
  • Ctrl-R para historial like bash has
  • múltiples sesiones en un REPL, por lo que puede cambiar entre ellos fácilmente

Y más optimismo

  • resaltado de sintaxis, completado de código sensible al contexto

¿Existe esta?

+5

Todos los modos Emacs REPL se crean sobre el modo comint, por lo que tienden a ser muy similares entre sí. Naturalmente, son compatibles con la historia y la finalización del código (según corresponda). – dfan

+2

Tiene requisitos contradictorios aquí: desea una REPL que al mismo tiempo no sepa nada sobre el idioma y, de alguna manera, mágicamente tiene un conocimiento íntimo sobre el idioma para proporcionar la finalización del código. –

+3

No veo esto como conflictivo. Quiero un REPL que presente una interfaz uniforme para cualquier cantidad de backends. Las cosas que tienen en cuenta el lenguaje deberían ser conectables, eso es todo. –

Respuesta

31

Bash no sabe nada de C-r: utiliza readline, que lo hace, así como el historial de flecha arriba, para ello. Parece que el REPL que estás buscando es readline? Simplemente prefija el comando con el que desea un comportamiento similar a REPL con rlwrap (instálelo si no lo tiene, es genial), y debería estar listo para comenzar.

$ rlwrap java -jar clojure.jar 
+0

OK Esto funciona muy bien para la clj repl, pero no me da ctrl-r en la scala repl por alguna razón. Parece que ghci ya usa readline, así que eso es bueno. Editar: en realidad esto hace una * tremenda * diferencia para el clojure repl - ¡gracias! –

+0

+1 para rlwrap: Empecé a usarlo para aprender clojure y lo ha hecho mucho más divertido –

+0

Parece que responde el bit ctrl-r pero no el bit REPL. Solo está agregando readline a un comando que ya hace repl. –

5

Scala 2.9 REPL tendrá soporte de búsqueda inversa CTRL-R. Las construcciones nocturnas ya lo tienen. Se ha completado la pestaña de reconocimiento de contexto por un tiempo (aunque podría mejorarse).

Al utilizar Scala con rlwrap, usar la bandera -Xnojline:

rlwrap scala -Xnojline 

Eso jline impide interferir con rlwrap. Entonces rlwrap es libre de usar readline para implementar movimientos de cursor e historial , pero eso es antes de que los intérpretes vean la línea y usted no tendrá la terminación con conocimiento del idioma.

Espero que se mejore el Scala REPL.

  • Hay un compilador de presentaciones que forma parte de 2.9 que creo que se usa para cosas como resaltar errores y completar.
  • La jline utilizada por scala 2.9 es capaz de usar colores ANSI aprovechando jansi

por lo que puedo soñar que un día voy a tener función de nivel de IDE en el Scala REPL. De forma realista, requeriría un esfuerzo considerable y agregar estas características es sin duda una prioridad menor que mejorar el soporte de eclipse, por ejemplo ... Además, puede tener más sentido agregar soporte REPL en eclipse.

+0

Parece que responde el bit ctrl-r pero no el bit REPL. Solo está agregando readline a un comando que ya hace repl. –

2

Aunque no es estrictamente un REPL, Seco ofrece un shell de tipo portátil que puede evaluar expresiones en cualquier idioma con un enlace JSR-223. Este rapidly growing list incluye lenguajes como Javascript, Scheme, Python, Ruby, Clojure, Groovy y Prolog.

La inspiración de Seco, el front-end de notebook Mathematica, en principio puede evaluar expresiones en cualquier idioma, aunque se necesita some work para que eso suceda.