% Lisp関数仕様 - sysctl
nptのドキュメントです。
参照元:ANSI Common Lisp npt
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は次の内容を指定できます。
memory-streamclosrecoverystructurerandom-statesysctl: memory-streammemory-streamオブジェクトから情報を取得します。
実行は次のようにして行います。
* (setq x (make-memory-io-stream ...))
* (sysctl x ...)
続けて次の引数を受け付けます。
sizearraycachesysctl: memory-stream, sizememory-streamのsizeを取得します。
sizeは内部バッファのbyte数です。
実行例を下記に示します。
* (setq x (make-memory-io-stream :size 10))
* (sysctl x 'size)
10
T
sysctl: memory-stream, arraymemory-streamのarrayを取得します。
arrayは内部バッファの保有数です。
実行例を下記に示します。
* (setq x (make-memory-io-stream :array 20))
* (sysctl x 'array)
20
T
sysctl: memory-stream, cachememory-streamのcacheを取得します。
cacheはopen関数がキャッシュを利用するかどうかの可否です。
実行例を下記に示します。
* (setq x (make-memory-io-stream :cache t))
* (sysctl x 'cache)
T
T
sysctl: closclosオブジェクトから情報を取得します。
closオブジェクトとはmake-instanceで生成されるものすべてであり、
structure-object, structure-objectのインスタンスのことです。
standard-class, structure-class, built-in-classのインスタンスも含まれます。
ただし、built-in-classのクラスのインスタンスに対応するものは
Lispオブジェクトのため含まれません。
実行は次のようにして行います。
* (setq x (make-instance ...))
* (sysctl x ...)
続けて次の引数を受け付けます。
slotssysctl: 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: recoveryrecoveryは指定した内容を初期状態に戻します。
実行は次のようにして行います。
* (sysctl 'recovery ...)
引数'recoveryはstringとして扱われ、equalpで判定されます。
続けて次の引数を受け付けます。
no-applicable-methodno-next-methodsysctl: 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: structurestructureは構造体の操作を行います。
実行は次のようにして行います。
* (sysctl 'structure ...)
引数'structureはstringとして扱われ、equalpで判定されます。
続けて次の引数を受け付けます。
checkdeletetypesysctl: structure, check指定した名前の、structure-classではない
構造体が存在するかどうかを調査します。
構造体を定義するとき、通常であればstructure-classに属するクラスが生成されます。
しかしdefstructの:type引数にlistかvectorを指定した場合は、
クラスシステムとは別の構造体が生成されるため、
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指定した名前の構造体の型を返却します。
返却値は次のようになります。
classlistvector実行例を下記に示します。
* (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-staterandom-stateオブジェクトの操作を行います。
実行は次のようにして行います。
* (sysctl 'random-state ...)
引数'random-stateはstringとして扱われ、equalpで判定されます。
続けて次の引数を受け付けます。
integermakewritesysctl: random-state, integerrandom-stateの内部状態を整数で出力します。
nptは乱数アルゴリズムにxorshiftを実装しており、
random-stateの内部状態に128bitの整数を保有しています。
本機能はその内部状態をそのまま整数で出力します。
出力した内部状態は、makeとwriteで復元できます。
実行例を示します。
* (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, writerandom-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