データと制御フロー - Alexandria

概要

このページではCommon Lispの汎用ライブラリであるAlexandriaの制御系マクロを中心としたオペレータについて紹介します。

多くのオペレータはANSI Common Lisp標準仕様の第5章「データと制御フロー」を拡張するものですので、適宜参照してください。

switchマクロ: :test指定可能な分岐

ANSI Common Lispではcaseマクロが定められており、値による多方向分岐が可能ですが、caseマクロは値の判定に用いる述語関数を指定することができないため、基本的にeqlでは等価性を判定することのできない文字列などの多方向分岐には対応していません。数やシンボルによる分岐が中心です。

Alexandriaのswitchマクロはcaseマクロと似ていますが、述語関数を:testで指定することができるため、文字列の分岐に用いることができます。
;; あらかじめ switch をインポートしておく
(shadowing-import 'alexandria:swtich)
; => T

(defun switch-test (string)
  (switch (string :test #'string=)
    ("a" "A")
    ("b" "B")
    (otherwise "Unknown")))
; => SWITCH

(switch-test "a")
; => "A"

(switch-test "b")
; => "B"

(switch-test "c")
; => "Unknown"

switchマクロの第1引数が判定に用いる値で、リストの形式で指定します。その中で:testキーワード引数を使うと述語関数を指定することができます。

なお、totherwiseなどでデフォルトを指定するのではなく、エラーを発生させるeswitchマクロと、continueRestart)付でエラーを発生させるcswitchマクロもあります。

whicheverマクロ: どれか1つだけを評価する

使いどころはあまりよく分かりませんが、Alexandriaのwhicheverマクロは複数の値または式の中から1つだけを評価するというオペレータです。
(alexandria:whichever (princ 'a) (princ 'b) (princ 'c))
; B
; => B

xorマクロ: 排他的論理和

Alexandriaのxorマクロは「排他的論理和」を意味します。論理和orは「共に真」の時は「真」となりますが、排他的論理は「偽」となる点が異なります。
(shadowing-import 'alexandria:xor)
; => T

(xor 1 2)
; => NIL ;
;    NIL

(xor 1 nil)
; => 1 ;
;    T

(xor nil 2)
; => 2 ;
;    T

(xor nil nil)
; => NIL ;
;    T
ANSI Common Lispの標準にもありそうなオペレータですが、Alexandriaの中で定義されています。

nth-value-orマクロ: 多値のN番目

ANSI Common Lispの標準ではnth-valueマクロというものがあり、多値を返す式を評価してそのN番目の返り値を抜き出すことができます。Alexandriaのnth-value-orマクロはnth-valueマクロを複数式に対応させて拡張したもので、指定したN番目の返り値がnilの場合は次の式を評価し、nil以外になるまで複数式の評価を繰り返していきます。
(alexandria:nth-value-or 1 (values 1 nil) (values 2 nil) (values 3 t))
; => 3 ;
;    T

multiple-value-prog2マクロ: 2番目の式を多値で返す

ANSI Common Lispの標準ではmultiple-value-prog1マクロが定められており、複数式の最初の返り値を多値で返すことができますが、Alexandriaのmultiple-value-prog2マクロは名前の通り2番目の式を返します。
(alexandria:multiple-value-prog2 (values 1 nil) (values 2 nil) (values 3 t))
; => 2 ;
;    NIL

0 件のコメント :

コメントを投稿