#:g1: CDR 9: File-local variablesの紹介

Posted 2014-10-09 22:30:00 GMT

(LISP Library 365参加エントリ)

 LISP Library 365 の283日目です。

CDR 9: File-local variablesとはなにか

 CDR 9: File-local variablesは、Didier Verna氏提案のCommon Lispでファイルローカル変数を実現する仕組みです。

パッケージ情報

パッケージ名CDR 9: File-local variables
Quicklisp×
CDRCDR 9: File-local variables
参照実装ASDF-FLV, variables locales aux fichiers par ASDF
CLiKiCLiki: asdf-flv

インストール方法

 参照実装は、Quicklispのlocal-projects以下に配置すれば、

(ql:quickload :com.dvlsoft.asdf-flv)

で利用可能です。

試してみる

 詳しくは、CDRのドキュメントに書いてあるのですが、ファイルローカルな振舞いをする変数には、*package*と*readtable*があります。この振舞いをユーザーが定義できるようにする提案です。
実際どんな所で使えそうか考えてみるに、システムの大域変数を変更してしまうようなプロジェクトをロードする時に現在の状態を保護するのにも使えたりしそうです。

;;;; asdf-flv-demo.lisp -*- Mode: Lisp;-*- 

(cl:in-package :asdf-flv-demo.internal)

;;; "asdf-flv-demo" goes here. Hacks and glory await!

(eval-when (:compile-toplevel :load-toplevel :execute) (setq *read-default-float-format* 'double-float))

(defun foo () 10.0)

;;; *EOF*

こんな感じのプロジェクトがあったとすると、そのままロードすれば、

(progn
  (asdf:load-system :asdf-flv-demo :force t)
  (type-of (read-from-string "0.0")))
;=>  DOUBLE-FLOAT

こんな感じのことになってしまいます。CL標準では、*read-default-float-format*はsingle-floatですが、読み込んだシステム内で値を上書きしてしまったので外側まで影響が及んでいます。
これがCDR 9: File-local variablesを利用すれば、

(com.dvlsoft.asdf-flv:make-variable-file-local '*read-default-float-format*)
;=>  (*READ-DEFAULT-FLOAT-FORMAT*)

(progn (asdf:load-system :asdf-flv-demo :force t) (type-of (read-from-string "0.0"))) ;=> SINGLE-FLOAT

(type-of (asdf-flv-demo.internal::foo)) ;=> DOUBLE-FLOAT

こんな感じにファイルローカルに閉じ込めることが可能です。

まとめ

 今回は、CDR 9: File-local variablesを紹介してみました。
MIT Lispマシン(Lisp machine Lisp)では、attribute list(Emacs系でお馴染の先頭行の-*- VAR0: VAL0; VARn: VALn ... -*-)でファイルローカルの変数が指定できましたが、ああいうのが利用できると便利ですね。

comments powered by Disqus