Lisp関数仕様 - sysctl

nptのドキュメントです。
参照元:ANSI Common Lisp npt

Lisp関数仕様

npt-systemパッケージの下記の関数を説明します。

defun sysctl
sysctl: memory-stream, size
sysctl: memory-stream, array
sysctl: memory-stream, cache
sysctl: clos, slots
sysctl: recovery, no-applicable-method
sysctl: recovery, no-next-method
sysctl: structure, check
sysctl: structure, delete
sysctl: structure, type
sysctl: random-state, integer
sysctl: random-state, make
sysctl: random-state, write

関数sysctl

本関数は下記の操作を行います。

(defun sysctl (type &rest args) ...) -> *

入力: type, オブジェクト
入力: args, 引数
出力: *

typeは次の内容を指定できます。

関数sysctl: memory-stream

memory-streamオブジェクトから情報を取得します。
実行は次のようにして行います。

* (setq x (make-memory-io-stream ...))
* (sysctl x ...)

続けて次の引数を受け付けます。

sysctl: memory-stream, size

memory-streamsizeを取得します。
sizeは内部バッファのbyte数です。
実行例を下記に示します。

* (setq x (make-memory-io-stream :size 10))
* (sysctl x 'size)
10
T

sysctl: memory-stream, array

memory-streamarrayを取得します。
arrayは内部バッファの保有数です。
実行例を下記に示します。

* (setq x (make-memory-io-stream :array 20))
* (sysctl x 'array)
20
T

sysctl: memory-stream, cache

memory-streamcacheを取得します。
cacheopen関数がキャッシュを利用するかどうかの可否です。
実行例を下記に示します。

* (setq x (make-memory-io-stream :cache t))
* (sysctl x 'cache)
T
T

関数sysctl: clos

closオブジェクトから情報を取得します。
closオブジェクトとはmake-instanceで生成されるものすべてであり、 structure-object, structure-objectのインスタンスのことです。
standard-class, structure-class, built-in-classのインスタンスも含まれます。
ただし、built-in-classのクラスのインスタンスに対応するものは Lispオブジェクトのため含まれません。

実行は次のようにして行います。

* (setq x (make-instance ...))
* (sysctl x ...)

続けて次の引数を受け付けます。

sysctl: clos, slots

全てのスロットを取得します。
実行例は下記の通り。

* (sysctl (find-class 'class) 'slots)
(NPT-CLOS::NAME NPT-CLOS::DIRECT-SLOTS NPT-CLOS::DIRECT-SUBCLASSES
 NPT-CLOS::DIRECT-SUPERCLASSES NPT-CLOS:CLASS-PRECEDENCE-LIST NPT-CLOS::EFFECTIVE-SLOTS
 NPT-CLOS::FINALIZED-P NPT-CLOS::PROTOTYPE NPT-CLOS::DEFAULT-INITARGS
 NPT-CLOS::DIRECT-DEFAULT-INITARGS NPT-CLOS::VERSION NPT-CLOS::DOCUMENTATION
 NPT-CLOS::REDEFINED-CLASS)
T

関数sysctl: recovery

recoveryは指定した内容を初期状態に戻します。
実行は次のようにして行います。

* (sysctl 'recovery ...)

引数'recoverystringとして扱われ、equalpで判定されます。

続けて次の引数を受け付けます。

sysctl: recovery, no-applicable-method

ジェネリック関数no-applicable-methodを初期状態に戻します。
実行は次の通り。

* (sysctl 'recovery 'no-applicable-method)
T
T

sysctl: recovery, no-next-method

ジェネリック関数no-next-methodを初期状態に戻します。
実行は次の通り。

* (sysctl 'recovery 'no-next-method)
T
T

関数sysctl: structure

structureは構造体の操作を行います。
実行は次のようにして行います。

* (sysctl 'structure ...)

引数'structurestringとして扱われ、equalpで判定されます。

続けて次の引数を受け付けます。

sysctl: structure, check

指定した名前の、structure-classではない 構造体が存在するかどうかを調査します。

構造体を定義するとき、通常であればstructure-classに属するクラスが生成されます。
しかしdefstruct:type引数にlistvectorを指定した場合は、 クラスシステムとは別の構造体が生成されるため、 find-classのような関数では確認することができません。
checkは、そのような構造体の存在を調査します。

実行は下記の通り。

* (defstruct (aaa (:type list)))
* (sysctl 'structure 'check 'aaa)
T
T
* (defstruct bbb)
* (sysctl 'structure 'check 'bbb)
NIL
T

sysctl: structure, delete

指定した名前の構造体を削除します。

クラスシステムに存在するstructure-classと、 存在しないlist, vector型の構造体のどちらのものでも削除します。
削除は丁寧に行われ、アクセス関数をはじめ、 constructor, copier, print-objectを削除します。

実行例を示します。

* (defstruct aaa)
* (sysctl 'structure 'delete 'aaa)
T
T
* (find-class 'aaa nil)
NIL

* (defstruct (bbb (:type vector)))
* (sysctl 'structure 'delete 'bbb)
T
T
* (sysctl 'structure 'check 'bbb)
NIL
T
* (fboundp 'make-bbb)
NIL

sysctl: structure, type

指定した名前の構造体の型を返却します。

返却値は次のようになります。

実行例を下記に示します。

* (defstruct aaa)
* (defstruct (bbb (:type (vector (unsigned-byte 8)))))
* (sysctl 'structure 'type 'aaa)
CLASS
T
* (sysctl 'structure 'type 'bbb)
(VECTOR (UNSIGNED-BYTE 8))
T

関数sysctl: random-state

random-stateオブジェクトの操作を行います。
実行は次のようにして行います。

* (sysctl 'random-state ...)

引数'random-statestringとして扱われ、equalpで判定されます。

続けて次の引数を受け付けます。

sysctl: random-state, integer

random-stateの内部状態を整数で出力します。

nptは乱数アルゴリズムにxorshiftを実装しており、 random-stateの内部状態に128bitの整数を保有しています。
本機能はその内部状態をそのまま整数で出力します。
出力した内部状態は、makewriteで復元できます。

実行例を示します。

* (setq *print-base* 16)
* (setq x (make-random-state t))
#<RANDOM-STATE #xF3F85807E6E2837033526396D518DAD1>
* (sysctl 'random-state 'integer x)
F3F85807E6E2837033526396D518DAD1
T

sysctl: random-state, make

指定した引数を内部状態に設定したrandom-stateを生成します。

引数はldbで128bit取得しますので、負の値も設定できます。

* (setq *print-base* 16)
* (setq x (sysctl 'random-state 'make #xABCD))
#<RANDOM-STATE #xABCD>
T
* (sysctl 'random-state 'integer x)
ABCD
T

sysctl: random-state, write

random-stateオブジェクトの内部状態を指定します。

引数はldbで128bit取得しますので、負の値も設定できます。

* (setq *random-state* (make-random-state t))
#<RANDOM-STATE #x14F392860E2329DE919C083F0B764EC5>
* (setq y (sysctl 'random-state 'integer *random-state*))
27849259905073490890992780948155027141
T
* (random 10)
3
* (random 10)
6
* (random 10)
7
* (sysctl 'random-state 'write *random-state* y)
#<RANDOM-STATE #x14F392860E2329DE919C083F0B764EC5>
T
* (random 10)
3
* (random 10)
6
* (random 10)
7