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

Argument List (ELISP Manual)

;; 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 Default Values

Function Keyword Parameters (Named Parameters)

Emacs lisp does not support named parameter.

But by emacs convention, it is emulated using Property List

(defun my-test (x &rest keyword-args)
  "demo of using plist as optional named params with default values.
Return a string of valid argument values.

X is required param.

KEYWORD-ARGS is any number of pairs of key and value.

The following keys are recognized:

:a default to 1.
:b default to 2.
:c default to 3.

Any other key value are ignored."
  (interactive)
  (let (a b c)
    (setq a (or (plist-get keyword-args :a) 1))
    (setq b (or (plist-get keyword-args :b) 2))
    (setq c (or (plist-get keyword-args :c) 3))
    (format "param values: x %s, :a %s, :b %s, :c %s" x a b c)))

(my-test 3 :b 4 :xx 9)
"param values: x 3, :a 1, :b 4, :c 3"

Emacs Lisp, Function