common-lisp-study/optional-arguments.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)