2011-07-05 27 views
19

Estoy tratando de insertar un Haskell REPL dentro de una de mis aplicaciones Haskell. La idea sería que solo un subconjunto de las bibliotecas de Haskell se cargaría de forma predeterminada, más mi propio conjunto de funciones, y el usuario las usaría para interactuar con el entorno.Creando un Haskell REPL dentro de una aplicación Haskell

Para resolver este problema, sé que una manera sería crear un analizador sintáctico (mini-) Haskell + y correlacionar las funciones de mi mini-Haskell con las funciones reales de Haskell, pero estoy seguro de que hay una mejor manera de hacer esto.

¿Hay alguna manera agradable y limpia de construir un REPL para Haskell usando Haskell?

+0

¿Está utilizando las bibliotecas GHC una opción para usted? (Proporcionan muchísimas formas de interactuar con el código Haskell compilado) – fuz

+0

Sí, es una opción, pero no tengo experiencia en su uso. ¿Puede dirigirme a las bibliotecas correctas para que pueda verlas? – CharlieP

+0

¿Qué tal si echas un vistazo a [haskell.org] (http://haskell.org/haskellwiki/GHC/As_a_library)? – fuz

Respuesta

10

Un par de cosas que ya existen:

  • GHCi, por supuesto, tanto en el sentido de ser capaz de ver cómo se implementa o ser capaz de utilizarlo directamente (es decir, que su REPL sólo hablar a GHCi vía stdin/stdout).
  • El full GHC API, que le permite enganchar en GHC y deja que haga todo el trabajo pesado para usted - la carga de archivos, persiguiendo dependencias, análisis sintáctico, la comprobación de tipos, etc.
  • hint, que es una envoltura alrededor de un subconjunto de la API GHC, con un enfoque en la interpretación interactiva en lugar de la compilación, que parece ajustarse a lo que desea hacer.
  • mueval, un evaluador con límites en los módulos cargados, uso de recursos, etc., básicamente un modo interactivo "seguro". Es lo que usa lambdabot, si alguna vez has estado en el canal IRC#haskell.

Todo lo anterior supone que usted no desea ocuparse de escribir un intérprete Haskell usted mismo, que probablemente sea el caso.