#:g1: cartesian-product-switchの紹介

Posted 2014-09-17 07:45:00 GMT

(LISP Library 365参加エントリ)

 LISP Library 365 の260日目です。

cartesian-product-switchとはなにか

 cartesian-product-switchは、HexstreamことJean-Philippe Paradis氏のデカルト積的な分岐をする構文のライブラリです。

パッケージ情報

パッケージ名cartesian-product-switch
Quicklisp
プロジェクトサイトcartesian-product-switch: Hexstreamsoft
CLiKiCLiki: cartesian-product-switch
Quickdocscartesian-product-switch | Quickdocs
CL Test Grid: ビルド状況cartesian-product-switch | CL Test Grid

インストール方法

(ql:quickload :cartesian-product-switch)

試してみる

 どんな関数があるかは、Quickdocsで確認できます。

 名前からして大体想像が付く感じですが、こんな感じのマクロです。

(let ((x 1) (y 2) (z 3))
  (cp-switch:cartesian-product-switch ((case x 1 2 3)
                                       (case y 1 2 3)
                                       (case z 1 2 3))
    0 1 2
    3 4 5
    6 7 8

9 10 11 12 13 14 15 16 17

18 19 20 21 22 23 24 25 26 (t (error "~x = A, y = ~A, z = ~A" x y z)))) ;=> 5

これは、こんな感じに展開されます。

(BLOCK #:CARTESIAN-PRODUCT-SWITCH1424
  (TAGBODY
    (RETURN-FROM #:CARTESIAN-PRODUCT-SWITCH1424
      (ECASE
          (+ (* 9 (OR (CASE X (1 0) (2 1) (3 2)) (GO #:ELSE1425)))
             (* 3 (OR (CASE Y (1 0) (2 1) (3 2)) (GO #:ELSE1425)))
             (* 1 (OR (CASE Z (1 0) (2 1) (3 2)) (GO #:ELSE1425))))
        (0 0)
        (1 1)
        (2 2)
        (3 3)
        (4 4)
        (5 5)
        (6 6)
        (7 7)
        (8 8)
        (9 9)
        (10 10)
        (11 11)
        (12 12)
        (13 13)
        (14 14)
        (15 15)
        (16 16)
        (17 17)
        (18 18)
        (19 19)
        (20 20)
        (21 21)
        (22 22)
        (23 23)
        (24 24)
        (25 25)
        (26 26)))
   #:ELSE1425
    (RETURN-FROM #:CARTESIAN-PRODUCT-SWITCH1424
      (PROGN (ERROR "~x = A, y = ~A, z = ~A" X Y Z)))))

このcaseの部分を書き換えることによって他の構文もサポートしていますが、標準では

がサポートされています。cp-switch:defineによってユーザーが定義することも可能とのこと。

まとめ

 今回は、cartesian-product-switchを紹介してみました。
一発物は紹介が楽で良いです。

comments powered by Disqus