#:g1: modfの紹介

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

(LISP Library 365参加エントリ)

 LISP Library 365 の99日目です。

modfとはなにか

 modfは、Zach Kost-Smith氏作の「非破壊的SETF」のようなものです。

パッケージ情報

パッケージ名modf
Quicklisp
参考サイト
Quickdocshttp://quickdocs.org/modf

インストール方法

(ql:quickload :modf)

試してみる

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

 上では非破壊的SETFなどという表現をしましたが、どういうものかというと、READMEにも詳しいですが、

(let ((foo (*:iota 15)))
  (list (modf (tenth foo) '--)
        foo))
;=>  ((0 1 2 3 4 5 6 7 8 -- 10 11 12 13 14) (0 1 2 3 4 5 6 7 8 9 10 11 12 13 14))

のように、元のオブジェクトを変更することはなしに、元のオブジェクトの一部を変更したものを返すというものです。

 クラスのオブジェクト等、Common Lisp標準のデータ型にも対応しています。

(defclass foo () 
  ((a :initform 0)))

(let ((o (make-instance 'foo))) (list (slot-value (modf (slot-value o 'a) 1) 'a) (slot-value o 'a))) ;=> (1 0)

 コピーしてSETFすれば良いんじゃないのかというところもありますが、その辺りをすっきり纏めてくれるところが便利なのではないでしょうか。
ちなみにリストは、コピーしてSETFではなく、新規にCONSする戦略のようです。

 また、SETFのようにmodfでもユーザーに拡張する手段が提供されています。
主な道具は、

ですが、-expanderと、-methodの方は対応するSETFのものから使い方も想像が付くかなと思います。
-rewriteは、(caar ...) -> (car (car ...))等、複合したオペレーターを分解するルールを記述するのに使います。

まとめ

 今回は、modfを紹介してみました。
元のオブジェクトには変更を加えないで一部分だけ変えたいということは、それなりにあるかなと思いますが、modというとどうも元のオブジェクトを変更するような動作を想像してしまいます。copyf等でも良かったような、そうでもないような。

comments powered by Disqus