#:g1: cl-locativesの紹介

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

(LISP Library 365参加エントリ)

 LISP Library 365 の17日目です。

cl-locativesとはなにか

 cl-locativesは、Lispマシンにあったlocative(ポインタ的なもの)をCommon Lisp上に再現しようというライブラリです。

パッケージ情報

パッケージ名cl-locatives
Quicklisp
参考サイトLisp Machine Manual: locf
Quickdocshttp://quickdocs.org/cl-locatives

インストール方法

(ql:quickload :cl-locatives)

試してみる

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

 Lispマシンのlocativeとは、セルへのポインタとして表現されたオブジェクトで、セルとはLispオブジェクトを保持するマシンワードでした。
C等とは違って整数での表現ではなく、ポインタの数値的な演算等はありません。
身近なところでは、シンボルは5つのセルを持つオブジェクトとなっていて、名前セル、値セル、関数セル、プロパティリストセル、パッケージセルから構成されていました。

 これらのセルの中身を操作することで、色々と低レベルな操作も行っていたようなのですが、Lispマシンのような専用マシンでのマシンレベルの支援があって効率良く機能したもののようなので、汎用マシンでの動作も考慮されたCommon Lispには導入されませんでした。
そんなLocativeを再現しようというパッケージですが、とりあえず動作を眺めてみましょう。

(let* ((x (make-array 5 :initial-element 0))
       (l (loc:locative-for (aref x 2))))
  (setf (loc:dereference l) 5)
  (list l
        x
        (loc:dereference l)))
;=>  (#<LOC:LOCATIVE {101E4C38A3}> #(0 0 5 0 0) 5)

(let* ((x 3) (xl (loc:locative-for x))) (setf (loc:dereference xl) 4) x) ;=> 4

 Lispマシンではlocfで統一されていますが、cl-locativesでは、locative-forと、dereferenceを利用するようです。
どうやって、読み書きする場所を取り出しているかというと、get-setf-expansionで抽出したフォームをクロージャーで保持しています。
なかなかナイスなアイデアですね。

cl-locativesの紹介/関連記事等

 gmane.lisp.sources.codeへの投稿でも類似のアイデアがあるようです。

まとめ

 今回は、cl-locativesを紹介してみました。
LispマシンのLocativeでは更に色々なことができますが、Common Lisp上でそのまま再現するのは厳しいものもあるようです。
とはいうものの、あれこれ考えるのも楽しいですよね。

comments powered by Disqus