====== Scheme přednáška 1 ====== define, quote, ', if, =, +, -, *, /, null?, car, cdr, cons (define (faktorial n) (if (= n 0) 1 (* n (faktorial (- n 1)))) ) (define (posledni ls) (if (null? (cdr ls)) (car ls) (posledni (cdr ls)) )) (define (negace? b) (if b #f #t) ) (define (lichy? ls) (if (null? ls) #f (if (null? (cdr ls)) #t (negace? (lichy? (cdr ls))) ))) ====== Scheme přednáška 2 ====== append, cond, lambda, let, let*, letrec ;(define (maximum ls) (define maximum (lambda (ls) (if (null? (cdr ls)) (car ls) (if (> (car ls) (maximum (cdr ls))) (car ls) (maximum (cdr ls)) ) ) ) ) (define maximum2 (lambda (ls) (if (null? (cdr ls)) (car ls) (let ( (m (maximum2 (cdr ls))) ) (if (> (car ls) m) (car ls) m ) ) ) ) ) (define maximum3 (lambda (ls) (if (null? (cdr ls)) (car ls) ((lambda (m) (if (> (car ls) m) (car ls) m ) ) (maximum3 (cdr ls))) ) ) ) (define (split ls) (cond ((null? ls) (cons '() '())) ((null? (cdr ls)) (cons ls '())) (else (let* ((a (car ls)) (b (cadr ls)) (rs (cddr ls)) (p (split rs)) ) (cons (cons a (car p)) (cons b (cdr p))) )))) (define (slij as bs) (cond ((null? as) bs) ((null? bs) as) ((<= (car as) (car bs)) (cons (car as) (slij (cdr as) bs))) (else (slij bs as)) ) ) (define (merge-sort ls) (cond ((null? ls) ls) ((null? (cdr ls)) ls) (else (let* ( (p (split ls)) (as (car p)) (bs (cdr p)) (sas (merge-sort as)) (sbs (merge-sort bs)) ) (slij sas sbs) ) ))) ====== Scheme přednáška 3 ====== použití define pro definici uživatelských hodnot, vnořený define, lambda s proměnlivým počtem argumentů, list, eval, (interaction-environment), (scheme-report-environment 5), (null-environment 5), apply, display, newline, begin (define soucet (lambda ls (define (sum ls) (if (null? ls) 0 (+ (car ls) (sum (cdr ls))) )) (sum ls) )) (define (soucet1 . ls) (define (sum ls) (if (null? ls) 0 (+ (car ls) (sum (cdr ls))) )) (sum ls) ) (define (soucet2 . ls) (apply + ls)) (define (my-list . ls) ls) (define (my-apply f . ls) (define (argumenty ls) (if (null? (cdr ls)) (car ls) (cons (car ls) (argumenty (cdr ls))))) (eval (cons f (argumenty ls)) (interaction-environment)) ) ====== Scheme přednáška 4 ====== map, call-with-current-continuation, vector, vector?, list?, list→vector, vector→list, make-vector, vector-ref, vector-set!, set!, set-car!, set-cdr!, cyklické datové struktury, jazykem scheme garantovaná optimalizace koncového volání (tail call optimization) (define (make-cyclic-list! ls) (define (cyc! xs) (if (null? (cdr xs)) (set-cdr! xs ls) (cyc! (cdr xs)) )) (cyc! ls)) ====== Scheme přednáška 5 ====== quasiquote (`), unquote (,), unquote-splicing(,@), delay, force, reprezentace seznamů jako stream, implementace ekvivalentů k funkcím: cons, car a cdr pouze s lambda (define (derivuj expr x) (define (d e) (cond ((number? e) 0) ((equal? e x) 1) ((symbol? e) 0) ((equal? (car e) '+) `(+ ,@(map d (cdr e)))) ((equal? (car e) '-) `(- ,@(map d (cdr e)))) ((equal? (car e) '*) (if (null? (cddr e)) (d (cadr e)) (let* ( (f (cadr e)) (g (cons '* (cddr e))) (df (d f)) (dg (d g)) ) `(+ (* ,df ,g) (* ,f ,dg)) ))) ((equal? (car e) '/) (let* ( (f (cadr e)) (g (caddr e)) (df (d f)) (dg (d g)) ) `(/ (- (* ,df ,g) (* ,f ,dg)) (* ,g ,g)) )) ((equal? (car e) 'sin) `(* (cos ,(cadr e)) ,(d (cadr e)))) ((equal? (car e) 'cos) `(* (- (sin ,(cadr e))) ,(d (cadr e)))) )) (d expr) ) (define (my-cons e mls) (lambda (f) (f e mls)) ) (define (my-car mls) (mls (lambda (x y) x)) ) (define (my-cdr mls) (mls (lambda (x y) y)) )