Lisp Praktikum 1
Page content
Lisp Praktikum 1
1. First Steps
a.
;; 10 * (4 + 3 + 3 + 1) - 20 = 90
* (- (* 10 (+ 4 3 3 1)) 20)
90
* 42
42 ;;evalueates to itself
* pi
3.141592653589793d0
* (/4 3)
4/3
* (/ 12 3)
4
* (/ 4 3.0)
1.3333334
* (+ 0.5 1/2)
1.0
* (+ 0.5 1/4)
0.75
* (+ 1/2 1/4)
3/4
* (* 35 1.16)
40.6
* (* 5 0.06)
0.29999998 ;;why??? > default is single-float which is not very precise
* (* 5 0.06d0)
0.3d0 ;;that's better
* (sqrt 2)
1.4142135
* (expt 12 32)
34182189187166852111368841966125056
* (floor 5/2)
2
1/2 ;;that was unexpected (type-of 5/2) >> RATIO
* (zerop 25)
NIL
* (zerop 0)
T
b.
* 'zitrone
ZITRONE
* (quote zitrone)
ZITRONE
* (list 'apfel 'banane 'zitrone)
(APFEL BANANE ZITRONE)
* (car '(apfel banane zitrone))
APFEL
* (cdr '(apfel banane zitrone))
(BANANE ZITRONE)
* (caaddr '((apfel banane) zitrone (dattel erdbeere))) ;;why?? >> cdr always creates an "extra" outer list
DATTEL ;;since it has to return multiple items
;;* (cdr '(A (B))) >> ((B))
* (length '((apfel banane) zitrone (dattel erdbeere)))
3
* (append '(apfel banane zitrone) '(dattel erdbeere))
(APFEL BANANE ZITRONE DATTEL ERDBEERE)
* (cons 'zitrone '(apfel banane)) ;;Creates a fresh cons, the car of which is object-1 and
(ZITRONE APFEL BANANE) ;;the cdr of which is object-2.
* (reverse '(apfel banane zitrone))
(ZITRONE BANANE APFEL)
c. Extract Y from these lists
* (car (cdadar '((w (x y)))))
Y
* (cadr'((w u) y z))
Y
* (caddar'((w (x) y) u))
Y
* (caaaar '((((y))) w))
Y
2. Functions and Lists
;; double every entry in a list
(defun double-list (seq)
(if (null seq) nil ;; else
(cons (* 2 (car seq)) (double-list (cdr seq)))))
;;checks wether a number is 0, positiv or negativ
(defun sign (a)
(cond
((> a 0) '1)
((< a 0) '-1)
(t '0)))
;;sign function like above but for a list
(defun list-sign (seq)
(if (not(null seq))
(cons (sign (car seq)) (list-sign (cdr seq)))))
;;recursive processing of lists, pass desired function as an argument
(defun map-list (f lst)
(if (null lst) nil
;; else
(cons (funcall f (car lst))
(map-list f (cdr lst)))))
;;double a number
(defun double (number)
(* number 2))
;;square root of a number
(defun sqr (number)
(sqrt number))
;;verdoppelt jeden eintrag einer Liste
(defun double-list2 (seq)
(map-list #'double seq))
;;zieht die Wurzel von jedem Eintrag einer Liste
(defun sqr-list2 (seq)
(map-list #'sqr seq))
;;zeigt das vorzeichen jedes Listeneintrags an (0,-1,1)
(defun sign-list2 (seq)
(map-list #'sign seq))
;;summiert alle Einträge einer Liste
(defun list-sum (seq)
(if (not(null seq))
(+ (car seq) (list-sum (cdr seq)))0))
;;Multipliziert alle Einträge einer Liste
(defun list-mult (seq)
(if (not(null seq))
(* (car seq) (list-mult (cdr seq)))1))
;;gibt True zurück wenn alle Einträge der Liste True sind
(defun all-true (list)
(if (null list) t
(and (car list)
(all-true (cdr list)))))