Cómo configurarar el REPL de SML con rlwrap

El REPL de smlnj no tiene soporte para readline. Es bastante molesto cuando se abre una sesión del REPL desde la consola y ésta no provee un histórico de comandos, edición de líneas y completado de sintaxis. Sin embargo todos estos problemas se pueden aliviar si usamos rlwrap. Este es un pequeño programa que intercepta la entrada del usuario para proveer edición tipo readline, historia persistente de comandos y completado de sintaxis.

Suponiendo que ya tenemos smlnj instalado, lo que hay que hacer primero es instalar el comando rlwrap. Evidentemente eso varía según el sistema operativo. En mi caso lo he configurado tanto en Ubuntu como en MAC OS, en este último usando Homebrew.

Para los usuarios de Ubuntu o Debian

apt-get install rlwrap

Los usuarios de MAC OS

brew install rlwrap

Y ahora solo resta configurar nuestro comando sml para que utilice rlwrap. En mi caso lo hice por medio de definir un alias en mi archivo .bashrc.

alias sml="rlwrap -f /usr/local/share/sml/keywords -t sml /usr/bin/sml"

El archivo llamado keywords no es otra cosa que un archivo de texto que contiene todos los keywords de SML y que rlwrap utilizara para proveer autocompletado de sintaxis. El siguiente es el contenido de mi archivo keywords según mi investigación de las palabras reservadas de SML:

abstype and andalso as case do datatype else
eqtype end exception fn fun functor handle
if in include infix infixr let local nonfix
of op open orelse raise rec sharing sig
signature struct structure then type val
with withtype while

Y ahora sí estamos listos. No hay más que invocar el comando sml desde la consola y entonces tendremos editado de lineas, histórico de comandos y autocompletado de sintaxis para nuestro REPL.