#:g1: Clozure CL: Static Variablesの紹介

Posted 2014-09-19 12:30:00 GMT

(LISP Library 365参加エントリ)

 LISP Library 365 の262日目です。

Clozure CL: Static Variablesとはなにか

 Clozure CL: Static Variablesは、Clozure CLの機能でスレッドの違いによらないグローバルな変数を実現するものです。

パッケージ情報

パッケージ名Clozure CL: Static Variables
参考サイトClozure CL: 4.8. Static Variables

インストール方法

 Clozure CL標準で提供されていて、CCLパッケージ内で定義されています。シンボルはエクスポートされていますが、cl-userには標準状態でインポートされています。

試してみる

 Clozure CLでのStatic Variableの定義は、スレッド間でも共通のグローバル変数で、束縛構文による束縛は禁止で代入しかできない変数です。
他の処理系だとLispマシンの時代から、大体defglobalとか、なんとか-globallyという名前で提供されています。

 提供されている機能は、マニュアルによるとdefstaticのみですが、兄弟にdefstaticvarというものもあるようです。
これらは、defparameterとdefvarの関係で、destaticvarの方がdefvarにあたります。

(defstatic **foo** 42)

(let ((**foo** 8)) **foo**) ;!> **FOO** is declared static and can not be bound

(setq **foo** 8) ;=> 8

(defvar **bar** 42)

(defstaticvar **bar** 84)

**bar** ;=> 42

 defstaticvarではdefvarのでの宣言のように未束縛のままにしておくというのができないのが謎ですが、何か理由があるのでしょうか。
ちなみに、処理系の実装を眺める限りでは、未束縛のStatic Variableは作ろうと思えば作れるようです。

(defvar **baz**)

(ccl::%symbol-bits '**baz** 20) ;20は、Static Variableのフラグ

(boundp '**baz**) ;=> NIL

(let ((**baz** 42)) **baz**) ;!> **BAZ** is declared static and can not be bound

まとめ

 今回は、Clozure CL: Static Variablesを紹介してみました。
Lispマシンにあった機能が脈々と受け継がれていたり、浮上してきたりするのは面白いところですね。

comments powered by Disqus