;;; Module adt-arbre23.rkt - Livre "Premiers Cours de Programmation avec Scheme" (Ellipses ed, 2010) ;;; Doit etre sauvegarde comme 'langage determine par le source' ! ;;; Racket > v5.0 ;;; Arbres 2-3 d'expressions sur les operateurs + - * / = < <= > >= #lang racket (provide arbre feuille? variable? operateur? racine fg fd fdd) (define (arbre r Ag . Lfils) ; au moins un fils ! (cons r (cons Ag Lfils))) (define (feuille? A) (or (number? A) (boolean? A) (variable? A))) (define (variable? x) (and (symbol? x) (not (operateur? x)))) (define (operateur? x) (if (member x '(+ - * / = < <= > >=)) #t #f)) ; member n'est pas un predicat en vrai Scheme ! (define (racine A) (if (feuille? A) (error 'racine "Pas de racine : ~a" A) (first A))) (define (fg A) (if (feuille? A) (error 'fg "Pas de fils gauche : ~a" A) (second A))) (define (fd A) (if (feuille? A) (error 'fd "Pas de fils droit : ~a" A) (third A))) (define (fdd A) (if (or (feuille? A) (not (equal? (racine A) 'if))) (error 'fdd "Pas de fdd : ~a" A) (fourth A)))