Emacs Lispでデフォルト値を有効にする方法がわからなかったのでメモしておく。
デフォルト値付きの関数を&optional
を使って定義してみる。&optional
は省略できる引数を定義するためのキーワードになる。例としてはこんな感じのやつ。
(defun add (&optional (x 2) (y 2))
(+ x y))
ここで(add 1 1)
を評価すると
Debugger entered--Lisp error: (invalid-function (lambda (&optional (x 2) (y 2)) (+ x y)))
add1(2 3)
eval((add1 2 3) nil)
eval-expression((add1 2 3) nil)
call-interactively(eval-expression nil nil)
エラーになる。
他の人のコードを見てたときに、defun*
を使うとデフォルト値付きで定義することができていた。なのでdefun*
を使ってみる。
(require 'cl)
(defun* add (&optional (x 2) (y 2))
(+ x y))
さてこのコードを実行してみる。
(add)
;=> 4
(add 10)
;=> 12
(add 10 20)
;=> 30
うまく実行できていることがわかると思う。
このdefun*
は引数部分に書かれたコードの評価ができる関数になる。let*
と同じ系統の関数になる。
できれば最初から評価ができるようにしてほしいんだけど、どういう歴史的経緯でこうなってるのか。そこはいつか機会があればしらべる。