2019年3月7日木曜日

&optional

 たとえば

(defun wrk (x y)
  (* x y))

 という関数があって「y」をoptionalにして(wrk 123)のときは(* x x)を返却するように変更しようとしたとする。

(defun wrk (x &optional y)
  (let ((w (if y
               y
               x)))
    (* x w)))

 としたところでふと気づいた。

(defun wrk (x &optional (y x))
  (* x y))

 これでいいんじゃね?

CL-USER> (wrk 2)
4
CL-USER> 

 なんともあっさり。
 んー?
 としたらこうもできるのか。

(defun wrk (x &optional (x1 (nth 0 x))(x2 (nth 1 x))(x3 (nth 2 x)))
  (+ x1 x2 x3))

CL-USER> (wrk '(1 2 3))
6
CL-USER> (wrk '(4 5 6))
15
CL-USER> 

 ……わけがわからん。