90 votes

Écrire un interpréteur Haskell en Haskell

Un classique de la programmation de l'exercice est d'écrire un Lisp/Scheme interprète Lisp/Scheme. La puissance de la pleine langue peut être mis à profit pour produire un interprète pour un sous-ensemble de la langue.

Est-il un exercice similaire pour Haskell? J'aimerais mettre en œuvre un sous-ensemble de Haskell à l'aide de Haskell que le moteur. Bien sûr, il peut être fait, mais y at-il toutes les ressources en ligne disponibles à l'oeil?

Edit: Voici la trame de fond.

Je me penche sur l'idée d'utiliser Haskell comme langue d'explorer quelques-uns des concepts dans une des Structures Discrètes sûr, je suis d'enseignement. Pour ce semestre, j'ai décidé de Miranda, une petite langue qui a inspiré Haskell. Miranda est d'environ 90% de ce que je voudrais faire, mais Haskell fait près de 2000%. :)

Donc, mon idée est de créer un langage qui a exactement les caractéristiques de Haskell que je voudrais et rejette tout le reste. Comme la progression des élèves, je peux sélectivement activer diverses fonctions une fois qu'ils ont maîtrisé les bases.

Pédagogique "niveaux de langue" ont été utilisés avec succès pour enseigner Java et de Régime. En limitant ce qu'ils peuvent faire, vous pouvez les empêcher de se tirant dans le pied alors qu'ils sont encore la maîtrise de la syntaxe et les concepts que vous êtes en train d'enseigner. Et vous pouvez offrir de meilleurs messages d'erreur.

76voto

Norman Ramsey Points 115730

J'aime votre but, mais c'est un gros travail. Quelques conseils:

  • J'ai travaillé sur GHC, et vous ne voulez pas partie des sources. Câlins est beaucoup plus simple, plus propre mise en œuvre, mais malheureusement il est en C.

  • C'est un petit morceau du puzzle, mais Mark Jones a écrit un magnifique livre appelé Tapant Haskell en Haskell , qui serait un point de départ idéal pour votre frontal.

Bonne chance! L'identification des niveaux de langue pour Haskell, avec preuves à l'appui de la salle de classe, serait d'une grande utilité pour la communauté, et certainement une résultat publiable!

37voto

Christopher Done Points 2699

Il est un Haskell analyseur: http://hackage.haskell.org/package/haskell-src-exts

Une fois que vous avez analysé, de décapage ou interdisant certaines choses, c'est facile. Je l'ai fait pour tryhaskell.org pour interdire les déclarations d'importation, à l'appui de haut niveau des définitions, etc.

Juste analyser le module:

parseModule :: String -> ParseResult Module

Ensuite, vous avez un AST pour un module:

Module SrcLoc ModuleName [ModulePragma] (Maybe WarningText) (Maybe [ExportSpec]) [ImportDecl] [Decl]    

Le Decl type est vaste: http://hackage.haskell.org/packages/archive/haskell-src-exts/1.9.0/doc/html/Language-Haskell-Exts-Syntax.html#t%3ADecl

Tout ce que vous devez faire est de définir une liste blanche -- de ce que les déclarations, les importations, les symboles, la syntaxe est disponible, puis à pied de l'AST et de lancer une "parse error" sur quelque chose que vous ne voulez pas qu'ils soient encore conscients. Vous pouvez utiliser le SrcLoc valeur attachée à chaque nœud de l'AST:

data SrcLoc = SrcLoc
     { srcFilename :: String
     , srcLine :: Int
     , srcColumn :: Int
     }

Il n'y a pas besoin de re-mettre en œuvre Haskell. Si vous souhaitez fournir le plus convivial des erreurs de compilation, juste analyser le code, filtre, l'envoyer à l'compilateur, et d'analyser la sortie du compilateur. Si c'est un "ne pouvait pas faire correspondre un type contre déduit a -> b" alors vous savez qu'il est probablement trop peu d'arguments à une fonction.

À moins que vous vraiment envie de passer du temps la mise en œuvre de Haskell à partir de zéro ou de jouer avec le fonctionnement interne de Câlins, ou un bête de mise en œuvre, je pense que vous devriez juste de filtrer ce qui est passé à GHC. De cette façon, si les étudiants veulent prendre leur code de base et de le prendre à l'étape suivante et y écrire le réel à part entière du code Haskell, la transition est transparente.

24voto

Dario Points 26259

Vous voulez construire votre interprète à partir de zéro? Commencer avec la mise en œuvre plus facilement un langage fonctionnel comme le lambda calcul ou un lisp variante. Pour le dernier cas, il existe un très agréable wikibook appelé Écrire vous-même un Régime de 48 heures donnant un endroit frais et pragmatique de l'introduction dans l'analyse et l'interprétation des techniques.

L'interprétation de Haskell par la main sera beaucoup plus complexe, car vous aurez à traiter avec très complexe fonctionnalités comme typeclasses, un très puissant système de type (inférence de type!) et paresseux-évaluation (techniques de réduction).

Donc, vous devez définir un petit sous-ensemble de Haskell pour travailler avec et puis peut-être commencer par l'extension du Régime-exemple étape par étape.

Plus:

Notez que dans Haskell, vous avez un accès complet aux interprètes de l'API (au moins en vertu de GHC), y compris des analyseurs, des compilateurs et des cours d'interprètes.

Le package à utiliser est un indice (de la Langue.Haskell.*). Je n'ai malheureusement ni trouvé des tutoriels en ligne sur le présent, ni essayé par moi-même, mais il est très prometteur.

20voto

yairchu Points 9694

créer un langage qui a exactement les caractéristiques de Haskell que je voudrais et rejette tout le reste. Comme la progression des élèves, je peux sélectivement activer diverses fonctions une fois qu'ils ont maîtrisé les bases.

Je suggère un plus simple (moins de travail concernés) solution à ce problème. Au lieu de créer un Haskell de mise en œuvre de l'endroit où vous pouvez activer des fonctionnalités hors, envelopper d'un compilateur Haskell avec un programme qui vérifie d'abord que le code ne pas utiliser toute la fonctionnalité de vous interdire, puis utilise le prêt-à-compilateur pour compiler.

Ce serait semblable à HLint (et aussi un peu de son contraire):

HLint (anciennement le Dr Haskell) lit Haskell programmes et suggère des changements qui, nous l'espérons les rendre plus faciles à lire. HLint permet également de désactiver les suggestions, et pour ajouter vos propres suggestions.

  • Mettre en place votre propre HLint "suggestions" de ne pas utiliser les fonctionnalités dont vous n'avez pas
  • Désactiver tous les HLint suggestions.
  • Faites votre wrapper exécuter votre modifiée HLint comme une première étape
  • Traiter HLint suggestions comme des erreurs. C'est, si HLint ", se plaint:" alors le programme ne veut pas passer à la phase de compilation

16voto

Don Stewart Points 94361

Baskell est une implémentation de l’enseignement, http://hackage.haskell.org/package/baskell

Vous pourriez commencer par choisir juste, par exemple, le système de type à mettre en œuvre. C’est tout aussi compliqué qu’un interprète pour régime, http://hackage.haskell.org/package/thih

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X