Emacs Lisp: Function Parameters (optional, rest)

By Xah Lee. Date: . Last updated: .

Optional Parameters

To have optional parameters, add &optional at the end of parameter list. Any parameter after that is optional.

;; defining a function with 2 optional params named cc and dd

(defun ff (aa bb &optional cc dd)
  "test optional params"
  (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

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."
  (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

Emacs Lisp Function

Lisp Basics


Lisp Data Structure


Lisp Symbol

Lisp Misc

Working with Elisp