60 lines
1.5 KiB
Common Lisp
60 lines
1.5 KiB
Common Lisp
;;; &optional (with and without default value)
|
|
;;; &rest
|
|
;;; &key (with or without default value)
|
|
;;; &aux - similar to LET* - additional variables, that can be calculated from other inputs, for example &rest
|
|
;;;
|
|
;; cool
|
|
|
|
;; default argument
|
|
(defun lala-1 (x &optional y)
|
|
(format t "~&x value is ~S" x)
|
|
(format t "~&y value is ~S" y)
|
|
(list x y))
|
|
|
|
(lala-1 2 5)
|
|
(lala-1 7)
|
|
|
|
(defun lala-2 (x &optional (y 2))
|
|
(format t "~&x value is ~S" x)
|
|
(format t "~&y value is ~S" y)
|
|
(list x y))
|
|
|
|
(lala-2 1 5)
|
|
(lala-2 7)
|
|
|
|
;; rest arguments - accessed as list, unlimited number on call
|
|
(defun lala-3 (x y &rest args)
|
|
(append (list x y) args))
|
|
|
|
(lala-3 7 5 1 2 34 5 6)
|
|
|
|
;;; keyword arguments
|
|
(defun make-sundae (name &key (ice-cream `vanilla)
|
|
(syrup `chocolate)
|
|
nuts
|
|
cherries
|
|
whipped-cream)
|
|
(list 'sundae
|
|
(list 'for name)
|
|
(list ice-cream 'with syrup 'sypup)
|
|
(list 'toppings '=
|
|
(remove nil
|
|
(list (and nuts 'nuts)
|
|
(and cherries 'cherries)
|
|
(and whipped-cream 'whipped-cream))))))
|
|
|
|
(make-sundae 'yo)
|
|
(make-sundae 'yo
|
|
:syrup 'maple
|
|
:whipped-cream t)
|
|
|
|
;;; auxillary variables
|
|
;; &aux - additional local variables?
|
|
;; "a matter of taste, whether to use LET* around body or &aux attributes"
|
|
|
|
(defun my-average (&rest args
|
|
&aux (len (length args)))
|
|
(/ (reduce #'+ args) len))
|
|
|
|
(my-average 1 2 3 4 5 6)
|