Ich lese gerade das Buch „ANSI Common Lisp“ von Paul Graham und veröffentliche hier meine Lösungen zu den Übungen am Ende der Kapitel. Hier sind meine Lösungen zu Kapitel 2.
Übung 1:
1 2 3 4 5 6 7 |
(+ (- 5 1) (+ 3 7)) ; 14 (list 1 ( + 2 3)) ; (1 5) (if (listp 1) (+1 2 ) (+ 3 4)) ; 7 (list (and (listp 3) t) (+ 1 2)) ; (nil 3) |
Übung 2:
1 2 3 4 5 |
(cons 'a (cons 'b (cons 'c nil))) (cons 'a (cons 'b '(c))) (cons 'a '(b c)) |
Übung 3:
1 2 3 4 |
(defun my-fourth (lst) (car (cdr (cdr (cdr lst))))) (my-fourth '(1 2 3 4 5 6)) |
Übung 4:
1 2 3 4 |
(defun my-max (a b) (if (> a b) a b)) (my-max 2 1) |
Übung 5a:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
(defun enigma (x) (and (not (null x)) (or (null (car x)) (enigma (cdr x))))) (enigma nil) ; nil (enigma '(a)) ; nil(defun enigma (x) (and (not (null x)) (or (null (car x)) (enigma (cdr x))))) (enigma nil) ; nil (enigma '(a)) ; nil (enigma '(a b)) ; nil (enigma '(nil a)) ; t (enigma '(a nil b)); t (enigma '(nil)); t ;;; d.h. Die Funktion gibt t zurück, wenn in der übergebenen ;;; Liste nil vorkommt, sonst nil |
Übung 5b:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
(defun mystery (x y) (if (null y) nil (if (eql (car y) x) 0 (let ((z (mystery x (cdr y)))) (and z (+ z 1)))))) (mystery 'a '(b c a d e a a f a)) (mystery 'x '(b c d e a a f a)) ;;; wenn y keine Liste ist, dann nil ;;; wenn x in der Liste nicht vorkommt, dann auch nil ;;; sonst die Position vom ersten x in der Liste |
Übung 6:
1 2 3 4 5 |
(car (car (cdr '(a (b c) d)))) ; x = car (or 13 (/ 1 0)) ; x = or (apply #'list 1 nil) ; x = apply |
Übung 7:
1 2 3 4 5 6 7 8 9 10 11 12 |
(defun contains-list (lst) (if (null lst) nil (if (listp (car lst)) t (contains-list (cdr lst))))) (contains-list nil) (contains-list '(a b c d)) (contains-list '(a (b c) d)) |
Übung 8a:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
(defun print-dots-iter (n) (do ((i n (- i 1))) ((= i 0) 'done) (format t "."))) (print-dots-iter 3) (defun print-dots-rec (n) (if (zerop n) nil (progn (format t ".") (print-dots-rec (- n 1))))) (print-dots-rec 3) |
Übung 8b:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
(defun count-iter (x lst) (do ((counter 0)) ((null lst) counter) (if (eql x (car lst)) (setf counter (+ counter 1))) (setf lst (cdr lst)))) (count-iter 'a '(a b a c d a f g a)) (defun count-rec (x lst) (if (null lst) 0 (if (eql x (car lst)) (+ 1 (count-rec x (cdr lst))) (count-rec x (cdr lst))))) (count-rec 'a '(a b a c d a f g a)) |
Übung 9:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
(defun summit (lst) (setf lst (remove nil lst)) (apply #' + lst)) (summit '(1 nil 2 nil nil 3)) ;;; Die ursprüngliche Version hat nicht funktioniert ;;; weil remove eine neue liste zurück liefert ;;; und die ursprüngliche liste wird nicht verändert (defun summit2 (lst) (if (null lst) 0 (let ((x (car lst))) (if (null x) (summit2 (cdr lst)) (+ x (summit2 (cdr lst))))))) (summit2 '(nil 1 2 3 nil 4 5 nil)) (summit2 nil) ;;; Es fehlte die Abbruchbedingung, wenn die Liste leer ist |