;; scheme je fukcionalni jazyk ;; vse jsou funkce (konstanty jsou nularni fce) ;; pomoci makra define (define (nadruhou x) (* x x)) (define mojepi 3.1415) ; u konstant nedavame do zavorek ;; N-tý prvek pole včetně kontroly, zda nejsme mimo index ;; Reagovat můžeme jakkoliv -- vrátit specifickou chybu nebo třeba prázdný seznam. ;; se vsim pracujeme v prefixove notaci ;; podmineny vyraz je bud ve forme (cond (p1 v1) (p2 v2) .. (pn vn)) kde pi je uzavorkovana podminka a vi je vyraz, ktery se ma vykonat, pokud pi uspeje. Podminky se prochazi od shora ;; druha varianta je pomoci (if (p) (then) (else)) ;; cond je spise jako switch ;; jeprvoc n - urci, zda je n prvocislo (define (jeprvoc n) (if (= n 1) false ( jeprvoc2 n (floor (sqrt n)) 2))) (define (jeprvoc2 n b i) (if (>= i b) true (and (not (= (modulo n i) 0)) (jeprvoc2 n b (+ i 1)))) ) ;; dulezita datova strutkura jsou dvojice ;; dvojice zadane pomoci konstruktoru cons a dvou selektoru car a cdr (define (udelejdv a b) (cons a b)) (define (vyberprvni x) (car x)) (define (vyberdruhy x) (cdr x)) ;; seznamy jsou reprezentovany pomoci dvojic ;; (cons 1 (cons 2 (cons 3 nil))) odpovida (list 1 2 3), list se da zapisovat pomoci '(1 2 3) ;; opet to funguje, ze se jedna o hlavu a telo, da se zkracovat pomoci apostrofu predem ;; (cons '1 '2) odpovida (1 . 2) - zapis dvojice ;; (cons '1 '(2 3 4)) odpovida (1 2 3 4) ;; (cons '(1 2 3) '(4 5 6)) odpovida ((1 2 3) 4 5 6) - tohle dava prvek (1 2 3) na hlavu ;; nty prvek seznamu (define (nprvek index seznam) (if (>= index (length seznam)) (error "Index je mimo seznam") (if (= index 0) (car seznam) (nprvek (- index 1) (cdr seznam))))) ;; spoji dva seznamy (define (spoj l1 l2) (if (null? l1) l2 (cons (car l1) (spoj (cdr l1) l2)) )) ;; let vyrazy - zavadeni pomocnych funkci uvnitr fce ;; zapis je (let ((v1 e1) (v2 e2)) (telo)) (define (koreny a b c) (let ((D (sqrt (- (* b b) (* 4 a c))))) (cons (/ (+ (- b) D) (* 2 a)) (/ (- (- b) D) (* 2 a))))) ;; lambda vyrazy - umoznuje psat fce bez udani nazvu ;; syntax maji (lambda (promenne) (telo vyrazu)) ;; nasleduji dva zapisy jsou ekvivalentni ( define ( plus4 x ) ( + x 4 ) ) ( define plus4 ( lambda (x ) ( + x 4 ) ) )