Σύντομο (common) LISP tutorial 2

2010 Jul 05

Παράμετροι συναρτήσεων

Χρησιμοποιούμε 3 keywords για να δηλώσουμε ειδικές παραμέτρους συναρτήσεων: &optional και &key όταν η χρήση ή η αρχικοποίηση κάποιον παραμέτρων είναι προαιρετική και &rest όταν έχουμε μεταβλητό αριθμό παραμέτρων.

&optional (προαιρετικές κατά σειρά)

> (defun f1 (a &optional b) (list a b))
> (f1 1)
(1 NIL)
> (f1 1 2)
(1 2)

Η b είναι nil αν δεν της δώσουμε τιμή κατά την κλήση της f1
> (defun f1 (a &optional b c) (list a b c))
> (f1 1)
(1 NIL NIL)
> (f1 1 2)
(1 2 NIL)
> (f1 1 2 3)

Για να δώσουμε εξ'ορισμού (default) τιμή σε μια &optional παράμετρο, την δηλώνουμε ως λίστα (var val). Έτσι, η &optional παράμετρος var έχει εξ'ορισμού τιμή val. Πχ:
> (defun f1 (a &optional (b -1)) (list a b))
> (f1 1)
(1 -1)
> (f1 1 2)
(1 2)

Η b έχει την τιμή -1 αν δεν της δώσουμε τιμή κατά την κλήση της f1
> (defun f1 (a &optional (b a)) (list a b))
> (f1 1)
(1 1)
> (f1 2)
(2 2)
> (f1 1 2)
(1 2)

Η b έχει την τιμή της a αν δεν της δώσουμε τιμή κατά την κλήση της f1

&key (προαιρετικές κατά όνομα)

Με το &key δίνουμε στην μεταβλητή όνομα. Χρησιμοποιούμε το όνομα αυτό, για να δώσουμε τιμή στην μεταβλητή κατά την κλήση της συνάρτησης.

> (defun f3 (&key a) (list a))
> (f3 1)
; Error
> (f3)
(NIL)
> (f3 :a 1)
(1)
> (defun f3 (&key (a 1) (b 2)) (list a b))
> (f3)
(1 2)
> (f3 :b 10)
(1 10)
> (f3 :b 10 :a -1)
(-1 10)

&rest (ακαθόριστες)

Αν δεν ξέρουμε πόσες μεταβλητές έχουμε, χρησιμοποιούμε το &rest:

> (defun f2 (&rest vars) (list vars))
> (f2)
(NIL)
> (f2 1)
((1))
> (f2 1 2)
((1 2))
> (f2 1 2 3)
((1 2 3))

Πχ, μια συνάρτηση που παίρνει οποιοδήποτε αριθμό παραμέτρων και επιστρέφει το άθροισμά τους:
> (defun myadd (&rest vars)
    (loop for i in vars summing i))  
MYADD
> (myadd)
0
> (myadd 1)
1
> (myadd 1 2)
3
> (myadd 1 2 3 4)
10

See Also