#:g1: cl-anonfunの紹介

Posted 2014-03-20 15:00:00 GMT

(LISP Library 365参加エントリ)

 LISP Library 365 の80日目です。

cl-anonfunとはなにか

 cl-anonfunは、Tomohiro Matsuyama氏作のlambdaを簡便に書くためのユーティリティです。

パッケージ情報

パッケージ名cl-anonfun
Quicklisp
参考サイト
CLiKihttp://cliki.net/cl-anonfun
Quickdocshttp://quickdocs.org/cl-anonfun

インストール方法

(ql:quickload :cl-anonfun)

試してみる

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

 全体的にはClojureのfn/#()をCommon Lispにもってきたような感じになっています。
fnとfnnがありますが、fnnは引数の数を別途確保する必要がある場合に利用するようです。

(mapcar (fn (list :- %2 %1)) 
        '(1 2 3 4)
        '(a b c d e))
;=>  ((:- A 1) (:- B 2) (:- C 3) (:- D 4))

(mapcar (fn (list :- %2 %1)) '(1 2 3 4) '(a b c d e) '(i g n o r e)) ;!> invalid number of arguments: 3

(mapcar (fnn 3 (list :- %2 %1)) '(1 2 3 4) '(a b c d e) '(i g n o r e)) ;=> ((:- A 1) (:- B 2) (:- C 3) (:- D 4))

 fn/fnnを#%()で表記することも可能です。
%の後に整数が来るとfnnに展開されます。

(*:register-readtable :anonfun
                      (let ((*readtable* (copy-readtable nil)))
                        (anonfun:enable-fn-syntax)
                        *readtable*))

(*:in-readtable :anonfun)

(mapcar #%(list :- %2 %1) '(1 2 3 4) '(a b c d e)) ;=> ((:- A 1) (:- B 2) (:- C 3) (:- D 4))

(mapcar #%3(list :- %2 %1) '(1 2 3 4) '(a b c d e) '(i g n o r e)) ;=> ((:- A 1) (:- B 2) (:- C 3) (:- D 4))

(mapcar #%(list :- %2 %1) '(1 2 3 4) '(a b c d e) '(i g n o r e))

(mapcar #%(identity %&) '(1 2 3 4) '(a b c d e) '(i g n o r e)) ;=> ((1 A I) (2 B G) (3 C N) (4 D O))

(mapcar #%`(,@%& ,%1) '(1 2 3 4) '(a b c d e) '(i g n o r e)) ;=> ((A I 1) (B G 2) (C N 3) (D O 4))

まとめ

 今回は、cl-anonfunを紹介してみました。
Clojureのfn/#()をCommon Lispでも利用したいという人には結構良いんじゃないかなと思います。

comments powered by Disqus