#:g1: let-plusの紹介

Posted 2014-02-04 15:00:00 GMT

(LISP Library 365参加エントリ)

 LISP Library 365 の36日目です。

let-plusとはなにか

 let-plusとは、metabang-bindにインスパイアされた分配束縛系構文のライブラリです。

パッケージ情報

パッケージ名let-plus
Quicklisp
プロジェクトホームtpapp/let-plus · GitHub
CLiKihttp://cliki.net/let-plus
Quickdocshttp://quickdocs.org/let-plus

インストール方法

(ql:quickload :let-plus)

試してみる

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

 パターンマッチや分配束縛系の構文は、拡張の行き着くところまで行ってしまうことも珍しくないですが、let-plusも凡そ考えられるケースにはほぼ対応しています。

通常のlet
(let+ ((x 3))
  x)
;=>  3
リスト構造の分配束縛
(let+ (((x (y) ((z))) '(1 (2) ((3)))))
  (list x y z))
;=>  (1 2 3)
クラスや構造体のスロットへのアクセス
(defclass foo-class ()
  ((a :accessor a :initarg :a)
   (b :accessor b-accessor :initarg :b)))

(let+ (((&slots a (my-b b)) (make-instance 'foo-class :a 1 :b 2))) (list a my-b)) ;=> (1 2)

関数も
(let+ (((&labels fib (n)
          (if (< n 2)
              n
              (+ (fib (1- n))
                 (fib (- n 2)))))))
  (fib 10))
;=>  55
plistも
(let+ (((&plist a b c) 
        '(b 2 a 1 c 3)))
  (list a b c))
;=>  (1 2 3)
さらに

おまけという感じですが、defunを拡張した、defun+というものも付属してきます。

(defun+ foo ((&plist a b c))
  (list a b c))

(foo '(a 0 c 2 b 1)) ;=> (0 1 2)

そしてさらにdefine-let+-expansionによって拡張構文をユーザーが定義することも可能です。

まとめ

 今回は、let-plusを紹介してみました。
Lisp界には果てしない拡張構文も多く存在しますが、一度各種を詳しく比較してみたいところです。

comments powered by Disqus