Voici le type de mes lambda-expressions et de mes lambda-valeurs:
Et mon évaluateur:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 type lambda_expr = | Cst of int | Var of int | Abs of lambda_expr | App of lambda_expr * lambda_expr | Let of lambda_expr * lambda_expr | Letrec of lambda_expr * lambda_expr and lambda_val = | Val of int | Fun of (lambda_val -> lambda_val) ;;
Tout marche très bien... jusqu'au Letrec.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 let rec eval expr env = match expr with | Cst n -> Val n | Var n -> List.nth env n | Abs body -> Fun (fun x -> eval body (x::env)) | App (f,arg) -> ( match eval f env with | Fun f -> f (eval arg env) | _ -> invalid_arg "Can't apply, not a function") | Let (e1,body) -> eval body (eval e1 env::env) | Letrec (e1,body) -> let rec env1 = (eval e1 env1)::env in eval body env1 ;;
Partager