; Проверка дали един обект присъства в списък. ; Тъй като обектът може да е всякакъв, проверяваме с equal?. ; Три варианта: обикновено търсене, филтриране, или използвайки ; странната вградена функция member - която при успех връща ; подсписък, вместо #t. (define (elem-1 el lst) (cond [(null? lst) #f] [(equal? el (car lst)) #t] [else (elem-1 el (cdr lst))])) (define (elem-2 el lst) (list? (member el lst))) (define (elem-3 el lst) (not (null? (filter (lambda (x) (equal? el x)) lst)))) ; Oбръщане на списъk. Съществува вградена в езика (reverse lst) (define (reverse-1 lst) (define (helper lst res) (if (null? lst) res (helper (cdr lst) (cons (car lst) res)))) (helper lst '())) (define (reverse-2 lst) (foldl cons '() lst)) ; Премахване на първото срещане на елемент от списък. ; Съществува вградена в езика (remove el lst) (define (remove-first el lst) (cond [(null? lst) '()] [(equal? el (car lst)) (cdr lst)] [else (cons (car lst) (remove-first el (cdr lst)))])) ; Премахване на всички срещания на елемент от списък. ; Може с обикновено обхождане, но е много по-лесно с филтър (define (remove-all-1 el lst) (cond [(null? lst) '()] [(equal? el (car lst)) (remove-all-1 el (cdr lst))] [else (cons (car lst) (remove-all-1 el (cdr lst)))])) (define (remove-all-2 el lst) (filter (lambda (x) (not (equal? el x))) lst)) ; Стандартни функции от по-висок ред върху списъци. ; Съществуват вградени в езика с имената map и filter, съответно. (define (my-map func lst) (if (null? lst) '() (cons (func (car lst)) (my-map func (cdr lst))))) (define (my-filter pred? lst) (cond [(null? lst) '()] [(pred? (car lst)) (cons (car lst) (filter pred? (cdr lst)))] [else (filter pred? (cdr lst))])) (define (extract-ints lst) (filter integer? lst)) (define (sum-of-sums lst) (apply + (map (lambda (el) (apply + el)) lst)))