Emacs Lisp: Function Parameters (optional, rest)
Optional Parameters
To have optional parameters, add &optional
at the end of parameter list. Any parameter after that is optional.
- When optional parameter is not given in a function call, the function gets nil for it.
- If a function received a nil as argument for one of its optional parameter, there is no way for a function to know if it is specified by caller or omitted.
;; defining a function with 2 optional params named cc and dd (defun ff (aa bb &optional cc dd) "test optional params" (interactive) (message "%s %s %s %s" aa bb cc dd)) ;; call it (ff 1 2) ;; "1 2 nil nil" (ff 1 2 3) ;; "1 2 3 nil" (ff 1 2 3 4) ;; "1 2 3 4"
Rest Parameters (Unspecified Number of Parameters)
To specify unspecified number of parameters, add &rest name
after the last parameter. In the function, value of name is a list, or nil if not given.
You can have both &optional
and &rest
, in that order.
(info "(elisp) Argument List")
;; defining a function with rest parameters (defun ff (aa bb &rest cc) "test rest arguments" (message "%s" cc) ; cc is a list ) ;; test (ff "1" "2" "3" "4") ;; ("3" "4")
No Named Parameter, No Default Values
- Emacs lisp does not support named parameter.
- Emacs lisp does not support parameter default value.
- Emacs lisp does not support parameter type checking.
You can define your function to take a Association List as argument to emulate these features.
(defun myf (x &optional xOpt) "demo of using alist as optional named param with defult values. Prints args received. x is required param. xOpt is optional. If given, must be an alist. keys are strings. \"y1\" default to 1. \"y2\" default to 2. \"y3\" default to 3. any other key are ignored." (interactive) (let ((y1 (or (cdr (assoc "y1" xOpt)) 1)) (y2 (or (cdr (assoc "y2" xOpt)) 2)) (y3 (or (cdr (assoc "y3" xOpt)) 3))) (message "param values: x %s, y1 %s, y2 %s, y3 %s" x y1 y2 y3))) (myf 3 '(("y2" . 99))) ;; prints ;; param values: x 3, y1 1, y2 99, y3 3