(********* Exercice 1 *********) #lang racket ;; Represent a set as a simple list (define set? list?) (define (set-empty) '()) (define set-length length) (define (set-mem set s) (cons? (member s set))) (define (set-add set s) (match set ['() (list s)] [(cons x xs) (cond [(< s x) (cons s set)] [(= s x) set] [else (cons x (set-add s xs))])])) ;; set-list.rkt #lang racket ;; Represent a set as a struct containing a vector (struct vset (size tab)) (define SIZE 10) (define set? vset?) (define (set-empty) (vset 0 (make-vector SIZE -1))) (define set-length vset-size) (define (set-mem set x) (number? (vector-member x (vset-tab set)))) (define (set-add set x) (if (or (set-mem set x) (= (set-length set) SIZE)) set (let* ([size (vset-size set)] [tab (vset-tab set)]) (vector-set! tab size x) (vector-sort! tab < 0 (add1 size)) ;; bad (vset (add1 size) tab)))) ;; set-vector.rkt #lang racket (require rackunit) (require rackunit/text-ui) (define all-tests (test-suite "Tests for a set implementation" (test-case "Empty set has size zero" (let* ([set (set-empty)]) (check-equal? (set-length set) 0))) (test-case "Adding to empty set yields size one" (let* ([set (set-empty)]) (check-equal? (set-length (set-add set 666)) 1))) (test-case "Integer added to empty set is found back" (let* ([set (set-empty)]) (check-true (set-mem (set-add set 666) 666)) (check-false (set-mem (set-add set 666) 667)))) )) (printf "Running tests\n") (run-tests all-tests) ;; set-test.rkt (********* Exercice 2 *********) (********* Exercice 3 *********) (define-syntax-rule (first l) (car l)) (first '(1 2 3)) (first '(f (g x y))) (define-syntax-rule (second l) (first (cdr l))) (second '(1 2 3)) (second '(f (g x y))) (define-syntax-rule (third l) (caddr l)) (third '(1 2 3)) ;; -> 3 (third '(f (g x y) z)) ;; -> z (********* Exercice 4 *********) (let ((x 1)) (double x) x) ; --> 2 (********* Exercice 5 *********) (define (suspicious-choice n) (cond-raise [(zero? n) 'zero] [(= 1 n) 'un] [(= 2 n) 'deux])) (suspicious-choice 1) ;; -> un (suspicious-choice 5) ;; -> Error : cond-raise : no match (********* Exercice 6 *********) (letm ([x 45] [y (+ 3 4)]) (print x) (cons x y))) ;; expands to ((lambda (x y) (print x) (cons x y)) 45 (+ 3 4)) ;; prints 45, -> (45 . 7) ;; Trick for using eval from within the module ;; Taken from : http://docs.racket-lang.org/guide/eval.html ;; Not necessary inside the REPL (define-namespace-anchor anchor) (define ns (namespace-anchor->namespace anchor)) (define (eval-expr expr) (eval expr ns)) (********* Exercice 7 *********)