(define rl (lambda () (load "second.ss"))) ;;; are atom? and pair? YES! (define leftmost (lambda (ls) (cond [(atom? ls) ls] [else (leftmost (car ls))]))) ;;; do not reverse the list (define rightmost (lambda (ls) (cond [(atom? ls) ls] [(null? (cdr ls)) (rightmost (car ls))] [else (rightmost (cdr ls))]))) (define count-parens-all (lambda (ls) (cond [(null? ls) 2] [(pair? (car ls)) (+ (count-parens-all (car ls)) (count-parens-all (cdr ls)))] [(null? (car ls)) (+ 2 (count-parens-all (cdr ls)))] [else (count-parens-all (cdr ls))]))) ;;; visit each element just once ;;; dos not work yet, does not work when item is not in car (define remove-leftmost (lambda (e ls) (cond [(null? ls) '()] [(equal? e (car ls)) (cdr ls)] [(pair? (car ls)) (cons (remove-leftmost e (car ls)) (cdr ls))] [else (cons (car ls) (remove-leftmost e (cdr ls)))]))) ;;; remove-rightmost ;;; reverse-all p.107 (requires accu) (define reverse (lambda (ls accu) (cond [(null? ls) accu] [(pair? (car ls)) (reverse (cdr ls) (cons (reverse (car ls) '()) accu))] [else (reverse (cdr ls) (cons (car ls) accu))]))) ;;; flatten p.111 (define flatten (lambda (ls) (cond [(null? ls) '()] [(pair? (car ls)) (append (flatten (car ls)) (flatten (cdr ls)))] [else (cons (car ls) (flatten (cdr ls)))])))