#!/usr/bin/env racket #lang racket ;;; fichier mon-script.rkt (define (get-scheme-files) ; la A-liste ((fichier nb-defs) ...) (define (iter L acc) ; L est une liste de chemins (if (null? L) acc (let ((f (path->string (car L)))) (if (and (file-exists? f) (regexp-match ".rkt$" f)) (iter (cdr L) (cons (list f (nb-defs f)) acc)) (iter (cdr L) acc))))) (iter (directory-list) '())) (define (nb-defs f) ; nombre de definitions dans f (define (def? x) ; x est-elle une definition ? (and (pair? x) (equal? (car x) 'define))) (call-with-input-file f (lambda (p-in) (let ((x (read p-in))) ; s'agit-il d'un module ? ;(printf "x=~a\n" x) (if (and (pair? x) (equal? (car x) 'module)) ; oui (length (filter def? (cadddr x))) ; <------------- bug dans le livre ligne 459 ! (do ((e (read p-in) (read p-in)) ; non} (acc (if (def? x) 1 0) (if (def? e) (+ acc 1) acc))) ((eof-object? e) acc))))))) (read-accept-reader #t) ; pour le #lang eventuel (printf "Le repertoire courant est :\n ~a\n" (current-directory)) (define FILES (get-scheme-files)) (printf "Il contient ~a fichiers d'extension .rkt\n" (length FILES)) (printf "Les voici, tries suivant le nombre de definitions :\n") (printf "~s\n" (sort FILES (lambda (L1 L2) (<= (second L1) (second L2)))))