Bonjour les copains/copines,
je travaille actuellement sur une projet de compilateur pour un langage très fortement inspiré de Scheme écrit en C89 (pour le plaisir/pleurer un bon coup). Autant j’ai une idée assez précise de comment tout va se goupiller, autant je suis assez perdu concernant l’expansion des macros et de la "fonction" eval
.
En effet, même si je remplace un appel à une macro par son corps (moyennant des ajustements avec les quotations), je ne vois pas comment je peux compiler un appel à eval
puisque celle-ci peut nécessiter des informations disponibles uniquement au runtime. Par exemple, dans le code suivant, mes deux premières lignes de codes devraient être équivalentes, mais à cause du eval
, je devrais connaître la valeur de f à la compilation, ce qui n’est pas garanti, comme montré dans le bout de code juste après.
1 2 3 4 5 6 | (eval (list 'f 5)) (f 5) ;; Certes personne ne devrait écrire ça, mais ça illustre bien ce que je veux dire. (let ((function-name (readline))) (eval (list (string->symbol function-name) 5))) |
J’aurais donc voulu savoir comment régler ce problème, s’il y a une technique bien connue/définie pour compiler cette fonctionnalité du Scheme.
Par ailleurs, question annexe, j’ai cherché d’autres compilateurs de Scheme écrits en C pour voir comment d’autres font et je ne tombe que sur des compilateurs de "mini-Scheme" servant à bootstrap le vrai compilateur. Est-ce finalement obligé ou est-ce ainsi parce que le Scheme est quand-même bien plus agréable que le C écrire un compilateur ? Si, par hasard, vous connaissez un compilateur de Scheme écrit en C (uniquement en C) qui puisse me servir d’inspiration, il serait gentil de me mettre dans le coup
Merci beaucoup pour votre lecture et de vos éventuelles réponses.
Lalla.