valuesのvalues

Common Lispには多値が存在するが、多値を要素にもつ多値が扱えるのかどうか何となく気になったので実験。 実行環境はUbuntu 22.04 amd64とCCL 1.12.1。

多値を返す関数と多値の受け取り。

(defun f ()
  (values :alfa :bravo))

(multiple-value-bind (a b) (f)
  (pprint a)
  (pprint b))

(pprint (f))
:ALFA
:BRAVO
:ALFA

valuesをマクロ展開してみる。

(macroexpand '(values :alfa :bravo))

valuesはマクロじゃなかった。

(VALUES :ALFA :BRAVO)

multiple-value-bindをマクロ展開してみる。

(macroexpand '(multiple-value-bind (a b) (f)
  (pprint a)
  (pprint b)))

中身はmultiple-value-callだった。

(MULTIPLE-VALUE-CALL #'(LAMBDA (&OPTIONAL A B &REST #:IGNORE) (DECLARE (IGNORE #:IGNORE)) (PPRINT A) (PPRINT B)) (F))

multiple-value-callにvaluesを持つvaluesを渡してみる。

(multiple-value-call #'list (values (values :alfa :bravo) :charlie))

:bravoが取れない。

(:ALFA :CHARLIE)