;; CSE 413 21sp ;; Lecture 4 more list functions, scope, function definitions and examples #lang racket (define magic 42) (define xvii 17) (define pi 3.1415926535) ;; some sample lists (define nums '(5 17 3 12)) (define ab '(a b)) (define xyz '(x y z)) (define stuff '(1 banana (2 3) 4 (5))) ;; Functions on lists ;; done previously: list functions: cons, car, cdr; list, quoting ;; also done previously: predicates: null?, pair?, list? and functions like length ;; sum of numbers in a list (define (sum lst) (if (null? lst) 0 (+ (car lst) (sum (cdr lst))))) ;; sum numbers in list ignoring others (define (numsum lst) (cond [(null? lst) 0] [(number? (car lst)) (+ (car lst) (numsum (cdr lst)))] [else (numsum (cdr lst))])) ;; = length of lst (define (len lst) (if (null? lst) 0 (+ 1 (len (cdr lst))))) ;; First attempt to append lists - buggy (define (badapp lst1 lst2) (cons lst1 lst2)) ;; Fixed append (define (app lst1 lst2) (if (null? lst1) lst2 (cons (car lst1) (app (cdr lst1) lst2)))) ;; new - attempt to reverse a list ;; first attempt (define (rev1 lst) (if (null? lst) '() (cons (rev1 (cdr lst)) (car lst)))) ;; second attempt (define (rev2 lst) (if (null? lst) '() (append (rev2 (cdr lst)) (car lst)))) ;; fixed! (?) (define (rev3 lst) (if (null? lst) '() (append (rev3 (cdr lst)) (list (car lst))))) ;; return 2 copies of the reversed list (define (revrev lst) (append (rev3 lst) (rev3 lst))) ;; version 2 - local name for reversed list (define (r2 lst) (let ([r (rev3 lst)]) (append r r))) ;; append list to its reverse (define (apprev lst) (let ([r (rev3 lst)]) (append lst r))) (define (apprev2 lst) (let ([r (rev3 lst)]) (append r xyz)))