coucou747

Ce blog présente principalement les évolutions du compilateur metalang : les nouveaux backends, les nouvelles corrections de bugs, les nouvelles features, nouvaux tests, son utilisation dans le cadre du concours prologin.

le 10/03/2014

Backend Common Lisp

Metalang peut maintenant générer du Common Lisp.

J'avais tenté il y a longtemps de coder un backend scheme pour Metalang, j'avais abandonné pour plusieurs raisons :

  • Ce n'était pas prioritaire
  • La lecture sur l'entrée standard n'est pas simple
  • Je ne connais pas bien les lisps
  • à Prologin, il y avait un débat sur quel lisp/scheme utiliser

J'ai découvert cette grande famille de langages avec DrScheme il y a plusieurs années, et je m'étais amusé à résoudre des exercices du projet euler avec. J'avais aimé le coté langage fonctionnel non typé mais je n'étais pas allé jouer avec les macros. Quand j'ai du coder ce backend, je suis tombé sur plusieurs problèmes :

  • En Gambit scheme (version utilisée en demie de prologin 20011) while n'existe pas
  • Il existe deux opérateurs différents pour l'affectation, selon ce que l'on affecte (variable, case d'un tableau, champ d'une structure)
  • les erreurs de common lisp n'ont pas de position dans le fichier
  • Différents schemes ont des syntaxes différentes pour : char_of_int, !=, quotient, block, etc...

Je dois dire que j'ai quand même été agréablement surpris (même si je m'y attendais) de trouver (en common lisp) une fonction : return qui permet de quitter un bloc ou une fonction. L'idée c'est qu'ils ont accès à la return stack (ou à une continuation) et qu'on peut l'appeller n'importe quand pour renvoyer. Cette feature me permet d'avoir dans certains cas un code plus clean qu'en ocaml.

Après 12 000 lignes de code généré, les tests passent, je commit donc aujourd'hui la finalisation du backend LISP.

Dans Catégories/Metalang/Changelog.

Sujets : #backend #Common Lisp #Metalang #scheme #prologin