#:g1: hu.dwim.defの紹介

Posted 2014-01-27 15:00:00 GMT

(LISP Library 365参加エントリ)

 LISP Library 365 の28日目です。

hu.dwim.defとはなにか

 hu.dwim.defは、関数等の定義フォームのより拡張しやすい形式を提供したユーティリティです。
元祖は、Marco Antoniotti氏作のDEFINER: A COMMON LISP Extensionな気がしますが、dwim.hu版との関係は良く分かりません。

パッケージ情報

パッケージ名hu.dwim.def
Quicklisp
参考サイトCLiki: dwim.hu
Quickdocshttp://quickdocs.org/hu.dwim.def

インストール方法

(ql:quickload :hu.dwim.def)

試してみる

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

 hu.dwim.defでは基本的にDylanのようにdefine+何々 という形式で書きますが、defineではなく、短くdefとなっています。

(def function fib (n)
  (if (< n 2)
      n
      (+ (fib (1- n))
         (fib (- n 2)))))

def+functionでdefunになります。defclass、defmacro等々も同じで、さらにユーザーが追加可能です。
標準の状態では、

等が用意されている様子。定義のタイプの指定にも拡張機能があり、

(def (function e) fib (n)
  (if (< n 2)
      n
      (+ (fib (1- n))
         (fib (- n 2)))))

と書くと(export 'fib)が追加されます。
この辺りのオプションは、cl-annotに似た感じもあり、defclassのアクセサのexport等の制御オプションも用意されています。

 with-macroというのが面白そうなので試してみましたが、

(def with-macro with-base-8 ()
  (let ((*read-base* 8.)
        (*print-base* 8.))
    (-with-macro/body-)))

のようなものを定義すると、call-with-base-8 とそのラッパーとして、with-base-8が定義されます。

(call-with-base-8 
 (lambda () (print 10.)))
;>>  
;>>  12 
;=>  10

(with-base-8 (print 10.)) ;>> ;>> 12 ;=> 10

しかし、上記のようにパターンにぴったり嵌まれば便利ですが、嵌まらないないと書き方を調べるのがめんどうなので手書きした方が早いとも思えました。
上記の例でも-with-macro/body-が何をするものなのか初見には謎です。

まとめ

 今回は、hu.dwim.defを紹介してみました。
dwim.huの人達は変なことをしていて面白いのでコードを読んでみるのも一興でしょう。

comments powered by Disqus