1
|
> (defun f (x) (+ x (- 3 5)))
F
> (f 4)
2 |
|
|
> (defun g (x y) (+ (/ x y) (/ y x)))
G
> (g 3 4)
25/12 |
|
|
> (defun h (x y z) (* x (* y (/ z (* x y)))))
H
> (h 1 2 3)
3 |
|
|
|
2a
|
> (defun f (x) (* 2 x))
F
> (f 4)
8 |
|
|
> (defun g (x) (* x x))
G
> (g 4)
16 |
|
|
|
2b
|
> (defun sum-func (f1 f2 x) (+ (funcall f1 x) (funcall f2 x)))
SUM-FUNC
> (sum-func 'f 'g 4)
24 |
|
|
|
2c
|
> (defun maximum (x y) (if (> x y) x y))
MAXIMUM
> (maximum 3 4)
4 |
|
|
> (defun max-func (f1 f2 x) (maximum (funcall f1 x) (funcall f2 x)))
MAX-FUNC
> (max-func 'f 'g 4)
16 |
|
|
|
3
|
> (defun liste-sum (liste)
(if liste
(+
(car liste)
(liste-sum (cdr liste))
)
0
)
)
LISTE-SUM
> (liste-sum (list 1 2 3 4))
10 |
|
| Ligesom nil betyder
falsk, således betyder en ikke-tom liste modsat sandt.
|
| Bemærk hvordan car
og cdr indgår
på netop car
og cdr's pladser
i den nye cons vi
laver.
|
|
|
4
|
> (defun liste-func (liste f)
(if liste
(cons
(funcall f (car liste))
(liste-func (cdr liste) f)
)
nil
)
)
LISTE-FUNC
> (defun g (x) (+ x 1))
G
> (liste-func (list 1 2 3 4) 'g)
(2 3 4 5) |
|
| Udover funktionen: liste-func,
laver vi også en funktion: g,
til testformål.
|
|
|
5a
|
> (defun len (liste)
(if liste
(+ 1 (len (cdr liste)))
0
)
)
LEN
> (len (List 2 4 6 8 10))
5 |
|
|
|
5b
|
> (defun antal (&rest y) (len y))
ANTAL
> (antal 1 3 5 7 9)
5 |
|
| Man bemærker, at det er len-funktionen,
der gør hele arbejdet, mens antal
kun er katalysator for transformationen fra parameter-liste til liste.
|
|
|
6a
|
> (defun maximum (x y) (if (> x y) x y))
MAXIMUM
> (defun maximum-liste (liste)
(if liste
(maximum (car liste) (maximum-liste (cdr liste)))
0
)
)
MAXIMUM-LISTE
> (maximum-liste (list 3 5 9 7 1))
9 |
|
|
|
6b
|
> (defun maximum-parametre (&rest y) (maximum-liste y))
MAXIMUM-PARAMETRE
> (maximum-parametre 3 5 9 7 1)
9 |
|
| Igen er det liste-funktionen, der laver arbejdet, mens parameter-funktionen
blot er katalysator for "parameter til liste"-transformationen.
|
|
|
7
|
> (defun f (&optional x y) (if y 2 (if x 1 0)))
F
> (f 1 2)
2
> (f 1)
1
> (f)
0 |
|
| Bemærk, hvordan vi udnytter, at x,
henholdsvis y, evalueres
til sand/falsk alt efter om de har en rigtig værdi
eller nil.
|
|
|
8
|
> (defun f (x)
(setq i -1)
(loop
(setq i (+ i 1))
(if (> i x)
(return nil)
(print i))
)
)
F
> (f 5)
0
1
2
3
4
5
NIL |
|
|
> (defun f (x)
(do ((i 0 (+ i 1)))
((> i x) nil)
(print i))
)
F
> (f 5)
0
1
2
3
4
5
NIL |
|
|
|
9
|
> (defun f (x)
(do ((i 0 (+ i 1)))
((> i 10))
(print (* x i))
)
)
F
> (f 8)
0
8
16
24
32
40
48
56
64
72
80
NIL |
|
|
|
| |