229 |
;;; deug-eval: Deug-Programme -> Valeur
;;; (deug-eval p) rend la valeur du programme (de Deug-Scheme) «p». (define (deug-eval p) (evaluation p (env-initial) ) ) |
234 |
;;; evaluation: Expression * Environnement -> Valeur
;;; (evaluation exp env) rend la valeur de l'expression «exp» dans ;;; l'environnement «env». |
624 |
;;; env-initial: -> Environnement
;;; (env-initial) rend l'environnement initial, i.e. l'environnement qui ;;; contient toutes les primitives. |
237 |
(define (evaluation exp env)
;; (discrimine l'expression et invoque l'évaluateur spécialisé) (cond ((variable? exp) (variable-val exp env)) ((citation? exp) (citation-val exp)) ((alternative? exp) (alternative-eval (alternative-condition exp) (alternative-consequence exp) (alternative-alternant exp) env)) ((conditionnelle? exp) (conditionnelle-eval (conditionnelle-clauses exp) env)) ((sequence? exp) (sequence-eval (sequence-exps exp) env)) ((bloc? exp) (bloc-eval (bloc-liaisons exp) (bloc-corps exp) env)) ((application? exp) (application-eval (application-fonction exp) (application-arguments exp) env)) (else (deug-erreur 'evaluation "pas un programme" exp))) ) |
256 |
;;; alternative-eval: Expression3 * Environnement -> Valeur
;;; (alternative-eval condition consequence alternant env) rend la valeur de ;;; l'expression «(if condition consequence alternant)» dans l'environnement «env». (define (alternative-eval condition consequence alternant env) (if (evaluation condition env) (evaluation consequence env) (evaluation alternant env)) ) |
264 |
;;; LISTE[Clause] * Environnement -> Valeur
;;; (conditionnelle-eval clauses env) rend la valeur, dans l'environnement «env», ;;; de l'expression «(cond c1 c2 ... cn)», «c1», «c2»... «cn» étant les éléments ;;; de la liste «clauses». (define (conditionnelle-eval clauses env) (evaluation (conditionnelle-expansion clauses) env) ) |
271 |
;;; conditionnelle-expansion: LISTE[Clause] -> Expression
;;; (conditionnelle-expansion clauses) rend l'expression, écrite avec des ;;; alternatives, équivalente à l'expression «(cond c1 c2 ... cn)», ;;; «c1», «c2»... «cn» étant les éléments de la liste «clauses». |
289 |
;;; sequence-eval: LISTE[Expression] * Environnement -> Valeur
;;; (sequence-eval exps env) rend la valeur, dans l'environnement «env», de ;;; l'expression «(begin e1 ... en)», «e1»... «en» étant les éléments de la liste ;;; «exps». ;;; (Il faut évaluer tour à tour les expressions et rendre la valeur de la ;;; dernière d'entre elles.) |
295 |
(define (sequence-eval exps env)
;; sequence-eval+ : LISTE[Expression]/non vide/ -> Valeur ;; même fonction, sachant que la liste "exps" n'est pas vide et en globalisant la variable "env". (define (sequence-eval+ exps) ... à faire ... à faire ... à faire ... à faire ) ;; expression de (sequence-eval exps env) : (if (pair? exps) (sequence-eval+ exps) #f ) ) |
295 |
(define (sequence-eval exps env)
;; sequence-eval+ : LISTE[Expression]/non vide/ -> Valeur ;; même fonction, sachant que la liste "exps" n'est pas vide et en globalisant la variable "env". (define (sequence-eval+ exps) (if (pair? (cdr exps)) ... à faire ... à faire ... à faire ) ;; expression de (sequence-eval exps env) : (if (pair? exps) (sequence-eval+ exps) #f ) ) |
295 |
(define (sequence-eval exps env)
;; sequence-eval+ : LISTE[Expression]/non vide/ -> Valeur ;; même fonction, sachant que la liste "exps" n'est pas vide et en globalisant la variable "env". (define (sequence-eval+ exps) (if (pair? (cdr exps)) ... à faire ... à faire (evaluation (car exps) env))) ;; expression de (sequence-eval exps env) : (if (pair? exps) (sequence-eval+ exps) #f ) ) |
295 |
(define (sequence-eval exps env)
;; sequence-eval+ : LISTE[Expression]/non vide/ -> Valeur ;; même fonction, sachant que la liste "exps" n'est pas vide et en globalisant la variable "env". (define (sequence-eval+ exps) (if (pair? (cdr exps)) (begin (evaluation (car exps) env) (sequence-eval+ (cdr exps)) ) (evaluation (car exps) env))) ;; expression de (sequence-eval exps env) : (if (pair? exps) (sequence-eval+ exps) #f ) ) |
309 |
;;; application-eval: Expression * LISTE[Expression] * Environnement -> Valeur
;;; (application-eval exp-fn arguments env) rend la valeur de l'invocation de ;;; l'expression «exp-fn» aux arguments «arguments» dans l'environnement «env». |
312 |
(define (application-eval exp-fn arguments env)
;; eval-env : Expression -> Valeur ;; (eval-env exp) rend la valeur de «exp» dans l'environnement «env» (define (eval-env exp) (evaluation exp env)) ;; expression de (application-eval exp-fn arguments env) : (let ((f (evaluation exp-fn env))) (if (invocable? f) (invocation f (deug-map eval-env arguments)) (deug-erreur 'application-eval "pas une fonction" f ) ) ) ) |
324 |
;;; bloc-eval: LISTE[Liaison] * Corps * Environnement -> Valeur
;;; (bloc-eval liaisons corps env) rend la valeur, dans l'environnement «env», ;;; de l'expression «(let liaisons corps)». |
327 |
(define (bloc-eval liaisons corps env)
(corps-eval corps (env-add-liaisons liaisons env)) ) |
330 |
;;; corps-eval: Corps * Environnement -> Valeur
;;; (corps-eval corps env) rend la valeur de «corps» dans l'environnement «env» |
332 |
(define (corps-eval corps env)
(let ((def-exp (corps-separation-defs-exps corps))) (let ((defs (car def-exp)) (exp (cadr def-exp))) (evaluation exp (env-enrichissement env defs)) ) ) ) |
338 |
;;; corps-separation-defs-exps: Corps -> (LISTE[Definition] * LISTE[Expression])
;;; (corps-separation-defs-exps corps) rend une liste dont le premier élément est ;;; la liste des definitions du corps «corps» et les autres éléments sont les ;;; expressions de ce corps. |
338 |
;;; corps-separation-defs-exps: Corps -> (LISTE[Definition] * LISTE[Expression])
;;; (corps-separation-defs-exps corps) rend une liste dont le premier élément est ;;; la liste des definitions du corps «corps» et les autres éléments sont les ;;; expressions de ce corps. |
342 |
(define (corps-separation-defs-exps corps)
(if (definition? (car corps)) (let ((def-exp-cdr (corps-separation-defs-exps (cdr corps)))) (cons (cons (car corps) (car def-exp-cdr)) (cdr def-exp-cdr))) (cons '() corps) ) ) |