Bonjour,
je viens de modifier comment les macros sont gérés. J'ai une question sur le comportement attendu des macros.
Voici l'exemple que j'utilise:
sqr_fun = node_ (symbol_ "lambda_->_") (symbol_ "x") (node_ (symbol_ "_*_") (symbol_ "x") (symbol_ "x"));
sqr_type = node_ (symbol_ "_->_") (symbol_ "Int") (symbol_ "Int");
give_type : Sexp -> Sexp -> Sexp; give_type = lambda expr -> lambda tp -> node_ (symbol_ "_:_") expr tp;
sqr = Macro_ (give_type sqr_fun sqr_type);
main = (sqr 2);
Est-ce que l'on s’attend à
sqr = (lambda x -> x * x) : Int -> Int
ou
sqr = Macro_ (give_type sqr_fun sqr_type); main = (((lambda x -> x * x) : Int -> Int) 2)
Pour l'instant (commit 6967d92) fait le premier cas. Mais je pense que le second est le comportement attendu.
Pour lexp_decls, j'ai un problème parce que pour certain cas nous avons besoin d'avoir le Type et l'expression ensemble (pour lexp_p_check) mais nous avons aussi besoin d'avoir le Type tout seul (pour les définitions récursives).
Afficher les réponses par date
Est-ce que l'on s’attend à
sqr = (lambda x -> x * x) : Int -> Int
ou
sqr = Macro_ (give_type sqr_fun sqr_type); main = (((lambda x -> x * x) : Int -> Int) 2)
L'expansion devrait donner qqch d'équivalent à
sqr = Macro_ (give_type sqr_fun sqr_type); main = (((lambda x -> x * x) : Int -> Int) 2)
[ En fait, l'expansion ne s'applique qu'à (sqr 2), donc tout le reste doit rester inchangé. ]
Pour lexp_decls, j'ai un problème parce que pour certain cas nous avons besoin d'avoir le Type et l'expression ensemble (pour lexp_p_check) mais nous avons aussi besoin d'avoir le Type tout seul (pour les définitions récursives).
Hmm... il me manque du contexte pour bien comprendre quel est le problème.
Je pense que la manière la plus simple est de faire qqch comme: - quand tu vois une déclaration "x : τ", tu parses "τ" dans l'environnement actuel avec lexp_p_infer, puis tu ajoutes un nouveau "x" dans l'environnement avec comme valeur ForwardRef (défini dans typecheck.ml). - quand tu vois une déclaration "x = e", il y a deux cas: - "x" existe dans l'environnent avec valeur ForwardRef: parse "e" (avec lexp_p_check) dans l'environnement actuel and ensuite remplace la valeur ForwardRef par "LetDef <lexp>". Petite difficulté: il faut s'assurer que le ForwardRef vient effectivement des "decls" actuelles et non d'autres extérieures (cas d'exemple: let x : τ; y = let x = 4 in x; ...). - Sinon, tu parses "e" avec lexp_p_infer dans l'environnement actuel, et tu ajoutes un nouve au "x" dans l'environnement avec comme valeur "LetDef <lexp>".
– Stefan