% Lisp関数仕様 - システム関数
nptのドキュメントです。
参照元:ANSI Common Lisp npt
npt-system
パッケージの下記の関数を説明します。
defun gc
defun savecore
defun loadcore
defun exit
defun quit
defun specialp
defun array-general-p
defun array-specialized-p
defun closp
defun fixnump
defun bignump
defun ratiop
defun short-float-p
defun single-float-p
defun double-float-p
defun long-float-p
defun callnamep
defun make-character
defun make-fixnum
defun make-bignum
defun make-ratio
defun make-complex
defun make-callname
defun subtypep!
defun parse-type
defun type-object
defun make-memory-input-stream
defun make-memory-output-stream
defun make-memory-io-stream
defmacro with-input-from-memory
defmacro with-output-to-memory
defun get-output-stream-memory
defun memory-stream-p
defun (setf memory-stream-p)
defun simple-sort
defun bubble-sort
defun quick-sort
defun merge-sort
defun make-paper
defun info-paper
defun array-paper
defun body-paper
defun package-export-list
defun large-number
defun equal-random-state
defun remove-file
defun remove-directory
defun byte-integer
defun fpclassify
defun eastasian-set
defun eastasian-get
defun eastasian-width
npt-system
パッケージに存在する、システム関数の関数仕様を示します。
defun gc
defun savecore
defun exit
defun quit
gc
ガベージコレクタを起動します。
(defun gc (&key full) ...) -> null
入力: full general-boolean
出力: null nil固定
本関数は、ガベージコレクタの依頼を行います。
関数内でガベージコレクタが実行されるのではなく、
処理系の都合の良いタイミングで実施されます。
現時点では引数:full
は無視されます。
ガベージコレクタの実行はroom
関数で確認できます。
* (room)
・・・
GC count: 1 [times]
・・・
NIL
* (npt-system:gc)
NIL
* (room)
・・・
GC count: 2 [times]
・・・
NIL
*
savecore
Lispを終了させてから、コアファイルを作成します。
(defun savecore (output &key input (exit t)) ...) -> null
入力: output, pathname-designer, 出力コアファイル
入力: input, pathname-designer, 入力コアファイル
入力: exit, T ;; General boolean
出力: null 戻り値無し
コアファイルとは、メモリイメージを出力したファイルです。
npt起動時に--core
引数および--corefile
引数を指定すると、
コアファイルを読み込めます。
savecore
関数はsavecore condition
を実行してLispを終了させます。
途中でhandler
を捕捉することができます。
本関数が正常に動作した場合はLispが終了するので、
通常はプロセス自体が終了します。
モジュールとして使用している場合は、C言語のlisp_argv_run
関数から制御が戻ります。
ただし、引数input
とexit
の内容によっては、
コアファイルを出力した後にLispに復帰します。
引数input
が指定された場合は、
コアファイル生成後にinput
のコアファイルを読み込みます。
また、引数input
が指定されておらず、かつexit
がnil
の場合は、
コアファイル生成後にLispを再起動します。
$ npt
* (defvar *hello* 1234)
*HELLO*
* *hello*
1234
* (npt-system:savecore #p"hello-core-image.core")
Core file: hello-core-image.core
$ ls
hello-core-image.core
$ npt --core --corefile hello-core-image.core
* *hello*
1234
*
loadcore
Lispを終了させてから、コアファイルを作成します。
(defun loadcore (input &key output (exit t)) ...) -> null
入力: input, pathname-designer, 入力コアファイル
入力: output, pathname-designer, 出力コアファイル
入力: exit, T ;; General boolean
出力: null 戻り値無し
loadcore
関数は、savecore
関数とほぼ同じです。
次のような動作をします。
(defun loadcore (input &key output (exit t))
(savecore output :input input :exit exit))
本関数の意味はコアファイルを読み込むことですが、
savecore
と同様必ずLispが終了します。
exit
quit
Lispを終了します。
(defun exit (&optional code) ...) -> なし
(defun quit (&optional code) ...) -> なし
入力: code 終了コード、省略時は0
exit
とquit
は同じです。
本関数はLispを終了させますので、式の返却値はありません。
引数の終了コードは、通常はプロセスの終了コードに設定されます。
モジュールとして使用している場合は、C言語のlisp_argv_run
関数から制御が戻ります。
返却値はlisp_result
変数で確認できます。
exit
/quit
はexit condition
を実行してLispを終了させます。
途中でhandler
を捕捉することができます。
exit
とquit
のsymbol
は、common-lisp-user
パッケージに
import
された状態で始まります。
$ npt
* (quit)
$ echo $?
0
$ npt --eval '(exit 22)'
$ echo $?
22
$
npt-system
パッケージに存在する、オブジェクト確認の関数仕様を示します。
defun specialp
defun array-general-p
defun array-specialized-p
defun closp
defun fixnump
defun bignump
defun ratiop
defun short-float-p
defun single-float-p
defun double-float-p
defun long-float-p
defun callnamep
specialp
グローバル変数がspecialかどうかを調査します。
(defun specialp (symbol) ...) -> boolean
入力: symbol
出力: boolean
レキシカルの状況を考慮せず、変数がspecialかどうかを返却します。
つまり変数がdefvar
, defparameter
, declaim
, proclaim
の実行により
special変数になった場合にt
となります。
* (specialp 'aaa)
NIL
* (defvar bbb)
BBB
* (specialp 'bbb)
T
* (let (ccc) (declare (special ccc)) (specialp 'ccc))
NIL
array-general-p
引数がgeneral arrayかどうかを調べます。
(defun array-general-p (object) ...) -> boolean
入力: object
出力: boolean
入力がarray
オブジェクトであり、かつgeneral arrayの場合はt
を返却します。
typep
とは違い、npt内部のオブジェクト種別によって判定が変わります。
入力がmake-array
によって生成され、
かつelement-type
がt
のオブジェクトの場合に限りt
が返却されます。
例えば#(10 20 30)
は、vector
オブジェクトのため、t
にはなりません。
* (array-general-p (make-array 10))
T
* (array-general-p #(10 20 30))
NIL
* (typep (make-array 10) '(array t))
T
* (typep #(10 20 30) '(array t))
T
array-specialized-p
引数がspecialized arrayかどうかを調べます。
(defun array-specialized-p (object) ...) -> boolean
入力: object
出力: boolean
入力がarray
オブジェクトであり、
かつelement-type
がt
以外の場合はt
が返却されます。
closp
引数がclos
オブジェクトかどうかを調べます。
(defun closp (object) ...) -> boolean
入力: object
出力: boolean
入力がclos
オブジェクトの場合はt
が返却されます。
Common Lispでは、全てのCLOSオブジェクトが
standard-object
に属しているため、
通常であれば次の命令と一致するはずです。
(typep 入力 'standard-object)
fixnump
引数がfixnum
オブジェクトかどうかを調べます。
(defun fixnump (object) ...) -> boolean
入力: object
出力: boolean
入力がfixnum
オブジェクトの場合はt
が返却されます。
通常であれば、fixnum
型に属するinteger
は
全てfixnum
オブジェクトであるはずです。
しかし開発においては、例えばbignum
型であるにもかかわらず、
10
や20
と言った小さなinteger
も作成できます。
本関数は上記の差異を調査するためのものです。
* 10
10
* (fixnump 10)
T
* (make-bignum 20)
20
* (fixnump (make-bignum 20))
NIL
bignump
引数がbignum
オブジェクトかどうかを調べます。
(defun bignump (object) ...) -> boolean
入力: object
出力: boolean
入力がbignum
オブジェクトの場合はt
が返却されます。
* 10
10
* (bignump 10)
NIL
* (make-bignum 20)
20
* (bignump (make-bignum 20))
T
ratiop
引数がratio
オブジェクトかどうかを調べます。
(defun ratiop (object) ...) -> boolean
入力: object
出力: boolean
入力がratio
オブジェクトの場合はt
が返却されます。
通常であれば、分母が1
の分数はinteger
型であるはずです。
しかし開発においては、例えば100/1
がratio
オブジェクトで存在する場合があります。
本関数は上記の差異を調査するためのものです。
* 10/5
2
* (ratiop 10/5)
NIL
* (make-ratio 10 5)
10/5
* (ratiop (make-ratio 10 5))
T
short-float-p
引数がshort-float
オブジェクトかどうかを調べます。
(defun short-float-p (object) ...) -> boolean
入力: object
出力: boolean
現在、nptではshort-float
オブジェクトを生成する方法はありません。
single-float-p
引数がsingle-float
オブジェクトかどうかを調べます。
(defun single-float-p (object) ...) -> boolean
入力: object
出力: boolean
double-float-p
引数がdouble-float
オブジェクトかどうかを調べます。
(defun double-float-p (object) ...) -> boolean
入力: object
出力: boolean
long-float-p
引数がlong-float
オブジェクトかどうかを調べます。
(defun long-float-p (object) ...) -> boolean
入力: object
出力: boolean
callnamep
引数がcallname
オブジェクトかどうかを調べます。
(defun callnamep (object) ...) -> boolean
入力: object
出力: boolean
callname
とは、関数名を表すオブジェクトであり、
通常のcar
と言ったsymbol
と、
setf関数を表す(setf car)
形式をまとめたものです。
Common Lispにおいて、callname
オブジェクトを生成する方法はありません。
npt-system
パッケージに存在する、オブジェクト生成の関数仕様を示します。
defun make-character
defun make-fixnum
defun make-bignum
defun make-ratio
defun make-complex
defun make-callname
make-character
character
オブジェクトを複製します。
(defun make-character (character) ...) -> character
入力: character
出力: character
入力で受け取った文字オブジェクトを複製して返却します。
本関数の目的は、キャッシュを避けて新規オブジェクトを生成することです。
nptでは、文字コードが#x80
未満であれば同一のオブジェクトが返却されます。
よって、eq
は一致します。
* (eq #\A #\A)
T
* (eq #\A (read-from-string "#\\A"))
T
もし違うオブジェクトが必要なときは本関数で複製します。
* (eq #\A (make-character #\A))
NIL
* (eql #\A (make-character #\A))
T
make-fixnum
fixnum
オブジェクトを複製します。
(defun make-fixnum (fixnum) ...) -> fixnum
入力: fixnum
出力: fixnum
入力で受け取ったfixnum
オブジェクトを複製して返却します。
本関数の目的は、キャッシュを避けて新規オブジェクトを生成することです。
nptでは、値が-1024
から+1024
の整数であれば、
同一のオブジェクトが返却されます。
よって、eq
は一致します。
* (eq 11 11)
T
* (eq 11 (read-from-string "11"))
T
もし違うオブジェクトが必要なときは本関数で複製します。
* (eq 11 (make-fixnum 11))
NIL
* (eql 11 (make-fixnum 11))
T
make-bignum
bignum
オブジェクトを生成します。
(defun make-bignum (integer) ...) -> bignum
入力: integer
出力: bignum
入力で受け取った整数値からbignum
オブジェクトを生成します。
本関数の目的は、小さな整数値のbignum
オブジェクトを生成することです。
通常であれば、例えば10
や2000
と言った整数は、
fixnum
オブジェクトが返却されます。
本関数は強制的にbignum
オブジェクトを生成するときに使用します。
★注意
nptでは、本来fixnum
の範囲にある整数が
bignum
オブジェクトで渡されることを想定していません。
本関数を用いて実施した結果については全て未定義です。
* 10
10
* (make-bignum 10)
10
* (fixnump 10)
T
* (bignump 10)
NIL
* (fixnump (make-bignum 10))
NIL
* (bignump (make-bignum 10))
T
make-ratio
ratio
オブジェクトを生成します。
(defun make-ratio (numer denom) ...) -> ratio
入力: numer 分子を表すintegerオブジェクト
入力: denom 分母を表すintegerオブジェクト
出力: ratio
入力で受け取った整数numer
, denom
から、ratio
オブジェクトを生成します。
本関数の目的は、約分を無視してratio
オブジェクトを生成することです。
通常であれば、例えば10/5
と言った分数は、
約分されて2
というfixnum
オブジェクトが返却されます。
本関数は強制的にratio
オブジェクトを生成するときに使用します。
★注意
nptでは、本来integer
となるものがratio
オブジェクトで渡されることを想定していません。
本関数を用いて実施した結果については全て未定義です。
* 10/5
2
* (ratiop 10/5)
NIL
* (make-ratio 10 5)
10/5
* (ratiop (make-ratio 10 5))
T
make-complex
complex
オブジェクトを生成します。
(defun make-complex (real imag) ...) -> complex
入力: real 実数を表すrealオブジェクト
入力: imag 虚数を表すrealオブジェクト
出力: complex
入力で受け取った整数real
, imag
から、complex
オブジェクトを生成します。
本関数の目的は、虚数が0
の整数型complex
オブジェクトを生成することです。
通常であれば、例えば#c(10 0)
と言った数は、
10
というfixnum
オブジェクトが返却されます。
本関数は強制的にcomplex
オブジェクトを生成するときに使用します。
★注意
nptでは、本来integer
となるものがcomplex
オブジェクトで渡されることを想定していません。
本関数を用いて実施した結果については全て未定義です。
* #c(10 0)
10
* (complexp #c(10 0))
NIL
* (make-complex 10 0)
#C(10 0)
* (complexp (make-complex 10 0))
T
make-callname
callname
オブジェクトを生成します。
(defun make-callname (x) ...) -> callname
入力: x function-name
出力: callname
関数名を扱うcallname
オブジェクトを生成します。
入力はsymbol
型か(setf symbol)
型を受け取ります。
npt-system
パッケージに存在する、型確認の関数仕様を示します。
defun subtypep!
defun parse-type
defun type-object
subtypep!
subtypep
の結果をsymbol
で取得します。
(defun subtypep! (left right) ...) -> symbol
入力: left type-specifier
入力: right type-specifier
出力: symbol
通常のsubtypep
とは違い、型が排他的かどうかも調査できます。
返却値は下記の通りです。
npt-system::include
npt-system::exclude
npt-system::false
npt-system::invalid
parse-type
型をパースします。
(defun parse-type (object) ...) -> type
入力: object type-specifier
出力: type
主な目的は型として形が正しいかどうかの調査です。
返却値は型オブジェクトとなりますが、
通常のCommon Lispで型オブジェクトを利用することはありません。
type-object
型オブジェクトからLispオブジェクトを生成します。
(defun type-object (type) ...) -> result
入力: type
出力: result (or cons symbol)
入力の型オブジェクトから、型の名前を生成します。
npt-system
パッケージに存在する、メモリストリームの関数仕様を示します。
defun make-memory-input-stream
defun make-memory-output-stream
defun make-memory-io-stream
defmacro with-input-from-memory
defmacro with-output-to-memory
defun get-output-stream-memory
defun memory-stream-p
defun (setf memory-stream-p)
memory-stream
は、ファイルの代替として用意されたストリームです。
通常のファイルはbyte
をデータの単位としているため、
本ストリームも(unsigned-byte 8)
をデータの基本単位としています。
バイナリストリームであるため、例えばread-char
関数のような
文字列型のストリーム関数は使用できず、
read-byte
関数のようなバイナリ型の操作関数が使用できます。
memory-stream
はopen
関数のfilespec
に使用することができます。
(with-open-stream (file (make-memory-input-stream #(#x48 #x65 #x6C #x6C #x6F)))
(with-open-file (stream file)
(read-line stream)))
-> "Hello", T
ストリームが2つ重複して動作することになりますが、
ファイルポインタはopen
の方が優先され、
memory-stream
の方はopen
関数によって操作されます。
上記の場合、with-open-file
内部で実行された(open file)
の:input
オペレーションが、
file
に格納されているmemory-stream
に対して、
最初に(file-position file :start)
を実行します。
read-line
関数によってデータの読み込みが生じたときは、
stream
のファイルポインタを前進させる処理を行うときに、
memory-stream
のファイルポインタも同時に前進させます。
memory-stream
には下記の4つのパラメーターが存在します。
:input
初期値:size
内部バッファのbyte数:array
内部バッファ数の初期値:cache
キャッシュの有無:input
はmemory-stream
の初期値です。
必ず(unsigned-byte 8)
のsequence
でなければなりません。
:size
はmemory-sequence
が内部に保有するバッファのサイズです。
省略時はコンパイル時にLISP_DEBUG
が指定された場合は64
byte、
それ以外の場合は4096
byteです。
指定した数のバッファがmemory-stream
内部でいくつも生成されることになります。
:array
は最初に保有する内部バッファの配列数です。
省略時はコンパイル時にLISP_DEBUG
が指定された場合は4
個、
それ以外の場合は8
個です。
例えば、4096
byte×8
個以上のデータ数が要求された場合、
配列数8
個から倍の16
個、32
個、64
個、……、と拡張されていきます。
:cache
はキャッシュの有効・無効を選択します。
この引数は開発時にデバッグとして使用するためのものです。
キャッシュとは、memory-stream
には何の影響もありませんが、
open
関数に渡されたとき、生成されたfile-stream
が
キャッシュを使用するかどうかが選択されます。
通常のファイルとは違い、memory-stream
のデータは
全てメモリ上に配置されているため、
キャッシュ機能をON
にする必要はありません。
省略時はコンパイル時にLISP_DEBUG
が指定された場合はT
(有効)、
それ以外の場合はNIL
(無効)です。
memory-stream
は、入力・出力・入出力の3種類存在しますが、
全て同じオブジェクトを使用しているため
いつでも種類を変更することができます。
make-memory-input-stream
入力専用のmemory-stream
を生成します。
(defun make-memory-input-stream (sequence &key size array cache) ...) -> stream
入力: sequence
入力: size (or null (integer 1 *))
入力: array (or null (integer 1 *))
入力: cache t ;; boolean
出力: stream input-memory-stream
sequence
はストリーム内の初期値に使用されます。
size
は内部バッファのサイズであり、初期値は4096
byteです。
array
は初期のバッファ保有数であり、初期値は8
です。
cache
は開発用です。
make-memory-output-stream
出力専用のmemory-stream
を生成します。
(defun make-memroy-output-stream (&key input size array cache) ...) -> stream
入力: input sequence
入力: size (or null (integer 1 *))
入力: array (or null (integer 1 *))
入力: cache t ;; boolean
出力: stream output-memory-stream
input
はストリーム内の初期値に使用されます。
size
は内部バッファのサイズであり、初期値は4096
byteです。
array
は初期のバッファ保有数であり、初期値は8
です。
cache
は開発用です。
make-memory-io-stream
入出力対応のmemory-stream
を生成します。
(defun make-memroy-io-stream (&key input size array cache) ...) -> stream
入力: input sequence
入力: size (or null (integer 1 *))
入力: array (or null (integer 1 *))
入力: cache t ;; boolean
出力: stream io-memory-stream
input
はストリーム内の初期値に使用されます。
size
は内部バッファのサイズであり、初期値は4096
byteです。
array
は初期のバッファ保有数であり、初期値は8
です。
cache
は開発用です。
with-input-from-memory
マクロwith-input-from-string
のmemory-stream
版です。
(defmacro with-input-from-memory
((stream vector &key size array) declaration* form*) ...)
-> result
string-stream
とは違い、引数index
がありません。
with-output-to-memory
マクロwith-output-to-string
のmemory-stream
版です。
(defmacro with-output-to-memory
((var &key input size array) declaration* form*) ...)
-> result
返却値は、get-output-stream-memory
の戻り値が使用されます。
string-stream
とは違い、第2引数のarray
は対応していません。
戻り値は(array (unsigned-byte 8))
の配列になります。
get-output-stream-memory
memory-stream
が保有している全てのデータを配列にして返却します。
(defun get-output-stream-memory (stream) ...) -> vector
入力: stream memory-stream
出力: vector (array (unsigned-byte 8))
引数は出力用のmemory-stream
だけではなく、入力と入出力も受け付けます。
string-stream
とは違い、値を出力した後でも内容は削除されません。
返却値は(array (unsigned-byte 8))
の配列になります。
memory-stream-p
引数がmemory-stream
かどうかを調べます。
(defun memory-stream-p (object) ...) -> result
入力: object
出力: result (member :input :output :io nil)
memory-stream
ではない場合は、nil
を返却します。
input-memory-stream
の場合は、:input
を返却します。
output-memory-stream
の場合は、:output
を返却します。
io-memory-stream
の場合は、:ioを
返却します。
(setf memory-stream-p)
memory-stream
の種類を変更します。
(defun (setf memory-stream-p) (result stream) ...) -> result
入力: stream memory-stream
入力: result (member :input :output :io)
例えば、入力memory-stream
を、入出力memory-stream
に変更できます。
設定値が:input
で入力、:output
で出力、:io
で入出力に変更します。
それぞれのmemory-stream
は全て同一のオブジェクトであり、
種類を変更することによって、stream
の入出力関数
(例えばread-byte
など)の使用可否を変更できます。
* (setq x (make-memory-output-stream))
#<STREAM MEMORY-OUTPUT #x8012801e0>
* (write-sequence '(65 66 67) x)
(65 66 67)
* (file-position x :start)
T
* (with-open-file (s x) (read-line s))
-> ★error
* (memory-stream-p x)
:OUTPUT
* (setf (memory-stream-p x) :input)
:INPUT
* (with-open-file (s x) (read-line s))
"ABC"
T
*
npt-system
パッケージに存在する、ソートの関数仕様を示します。
defun simple-sort
defun bubble-sort
defun quick-sort
defun merge-sort
simple-sort
選択ソートを行います。
(defun simple-sort (sequence call &key key) ...) -> result
入力: sequence
入力: call 関数
入力: key 関数
出力: result sequence
不安定であり、実行コストがO(n^2)
のソートを行います。
bubble-sort
バブルソートを行います。
(defun bubble-sort (sequence call &key key) ...) -> result
入力: sequence
入力: call 関数
入力: key 関数
出力: result sequence
安定であり、実行コストがO(n^2)
のソートを行います。
quick-sort
クイックソートを行います。
(defun quick-sort (sequence call &key key) ...) -> result
入力: sequence
入力: call 関数
入力: key 関数
出力: result sequence
不安定であり、実行コストがO(n log n)
のソートを行います。
merge-sort
マージソートを行います。
(defun merge-sort (sequence call &key key) ...) -> result
入力: sequence
入力: call 関数
入力: key 関数
出力: result sequence
安定であり、実行コストがO(n log n)
のソートを行います。
npt-system
パッケージに存在する、Paperオブジェクトの関数仕様を示します。
defun make-paper
defun info-paper
defun array-paper
defun body-paper
make-paper
Paperオブジェクトを生成します。
(defun make-paper (array body &key fill type) ...) -> result
入力: array サイズ
入力: body サイズ
入力: fill 初期値
入力: type User値
出力: result paper
Paperオブジェクトとは、simple-vector
と
バイト形式のバッファをあわせもつオブジェクトです。
array
がnil
か0
の場合は、body形式で生成されます。
body
がnil
か0
の場合は、array形式で生成されます。
array
とbody
が1以上の場合は、array-body形式で生成されます。
array-body形式の場合、array
とbody
はともに#xFFFF
以下にして下さい。
:fill
は、body形式の初期値を指定します。
nil
か、t
か、0x00
~#xFF
の整数を指定します。
nil
の場合は初期化を行いません。
t
は0と同じです。
:type
は、User値です。
User値とは、形式に関係なく#x00
~#xFF
までの値を保有する1byteの領域の事です。
デフォルト値は0です。
Paperオブジェクトの種類として利用することをお勧めします。
info-paper
Paperオブジェクトに対して、下記の操作を行います。
(defun info-paper (paper symbol &optional second) ...) -> result
入力: paper
入力: symbol, (member list vector type length)
入力: second
出力: result
symbol
がtype
のときは、User値の取得と設定を行います。
second
が指定されていなかった場合は取得です。
second
が指定された場合は設定です。
symbol
がlist
のときは、arrayかbodyの内容をlistで返却します。
second
が指定されないかnil
の場合は、全てのarrayが返却されます。
second
がnil
ではない場合は、全てのbodyが返却されます。
symbol
がvector
のときは、arrayかbodyの内容をvectorで返却します。
second
が指定されないかnil
の場合は、全てのarrayが返却されます。
second
がnil
ではない場合は、全てのbodyが返却されます。
bodyのときは、(unsigned-byte 8)
形式のspecialized arrayで返却されます。
symbol
がlength
のときは、arrayかbodyの長さを返却します。
second
が指定されないかnil
の場合は、arrayの長さが返却されます。
second
がnil
ではない場合は、body長さが返却されます。
array-paper
Paperオブジェクトに対して、arrayの設定と取得を行います。
(defun array-paper (paper index &optional value) ...) -> result
入力: paper
入力: index, (integer 0 *)
入力: value
出力: result
value
が指定されていなかった場合は取得です。
value
が指定された場合は設定です。
body-paper
Paperオブジェクトに対して、bodyの設定と取得を行います。
(defun body-paper (paper index &optional value) ...) -> result
入力: paper
入力: index, (integer 0 *)
入力: value
出力: result
value
が指定されていなかった場合は取得です。
value
が指定された場合は設定です。
npt-system
パッケージに存在する、その他の関数の仕様を示します。
defun package-export-list
defun large-number
defun equal-random-state
defun remove-file
defun remove-directory
defun byte-integer
defun fpclassify
defun eastasian-set
defun eastasian-get
defun eastasian-width
package-export-list
package
のexport
リストを取得します。
(defun package-export-list (package-designator) ...) -> list
入力: package-designator
出力: list
パッケージでexport
されているsymbolの名前のリストを取得します。
large-number
数値を英語で表したときの、3桁区切りのカンマに対応する表記を取得します。
(defun large-number (value &optional (cardinal t)) ...) -> string
入力: value 数値
入力: cardinal boolean
出力: string
数値を3桁区切りにして、右からn-1
番目に対応する文字列を返却します。
下記の数値を考えたとき、
1,000,000
引数0が右のカンマに対応するのでthousand
です。
引数1が右から2番目に対応するのでmillion
です。
引数cardinal
がnil
で序数になります。
* (large-number 0)
"thousand"
* (large-number 1)
"million"
* (large-number 1000)
"millinillion"
* (large-number 5555)
"quintilliquinquinquagintaquingentillion"
* (large-number 5555 nil)
"quintilliquinquinquagintaquingentillionth"
equal-random-state
random-state
が等しいかどうかを調べます。
(defun equal-random-state (a b) ...) -> boolean
入力: a random-state
入力: b random-state
出力: boolean
remove-file
ファイルを削除します。
(defun remove-file (pathname &optional (error t)) ...) -> boolean
入力: pathname
入力: errorp
出力: boolean
標準関数のdelete-file
と違い、引数errorp
で失敗の場合を扱うことができます。
標準ではerrorp
がt
のため、delete-file
と同じです。
errorp
がnil
の場合は、削除に成功するとt
を返却し、失敗したらnil
を返却します。
remove-directory
ディレクトリを削除します。
(defun remove-directory (pathname &optional (error t)) ...) -> boolean
入力: pathname
入力: errorp
出力: boolean
errorp
がt
のときは、削除に失敗したときにerror
が発生します。
errorp
がnil
のときは、削除に成功するとt
を返却し、失敗したらnil
を返却します。
byte-integer
CPUのエンディアンを考慮して、unsigned-byte
の値を連結して整数を返却します。
(defun byte-integer (&rest args) ...) -> result
入力: args (unsigned-byte 8)
出力: result (integer 0 *)
例えば、非符号付き16bit整数uint16_t
を考えたとき、
バイト列#x00 #x01
がいくつになるかを取得するときに使用します。
CPUがbig endianの場合は、上位バイトが#x00
で、下位バイトが#x01
となるため、
返却値は#x01=1
です。
一方、CPUがlittle endianの場合は、返却値が#x0100=256
となります。
fpclassify
浮動小数値の状態と符号を取得します。
(defun fpclassify (float) ...) -> type, sign
入力: float
出力: result symbol
出力: result 1か-1
float
が無限大のとき、type
はnpt-system::fp-infinite
です。
float
が非数のとき、type
はnpt-system::fp-nan
です。
float
が通常の数のとき、type
はnpt-system::fp-normal
です。
float
がデノーマル数のとき、type
はnpt-system::fp-subnormal
です。
float
がゼロのとき、type
はnpt-system::fp-zero
です。
float
の符号が正のとき、sign
は1
です。
float
の符号が負のとき、sign
は-1
です。
本来、Common Lispでは、無限大と非数を扱うことはできず、
発生した時点でarithmetic-error
conditionが発生します。
eastasian-set
East Asian Widthのカテゴリ別に、文字数を設定します。
(defun eastasian-set (string-designator intplus &optional error) ...) -> boolean) */
入力: string-designator
入力: intplus (integer 0 *)
入力: error boolean
出力: boolean
East Asian Widthとは、日本語で言う半角/全角を定義したものです。
入力のstring-designator
は、N
, A
, H
, W
, F
, NA
の6種類指定できます。
それぞれのカテゴリに対して、intplus
で指定した文字数を設定します。
intplus
には、半角1
か全角2
を指定することになると思います。
error
がt
のときは、該当するカテゴリが無かったらエラーが発生します。
正常終了時にはt
が返却されます。
eastasian-get
East Asian Widthのカテゴリに対応する文字数を取得します。
(defun eastasian-get (string-designator) ...) -> (values IntplusNull symbol)
入力: string-designator
出力: intplusNull 文字数かnil
出力: symbol カテゴリのsymbol
East Asian Widthとは、日本語で言う半角/全角を定義したものです。
入力のstring-designator
は、N
, A
, H
, W
, F
, NA
の6種類指定できます。
それぞれのカテゴリに対応した文字数が返却されます。
エラーの場合はNIL
が返却されます。
eastasian-width
East Asian Widthを考慮した長さを返却します。
(defun eastasian-width (var) ...) -> (values IntplusNull boolean)
入力: var (or integer character string)
出力: IntplusNull 文字数かnil
出力: boolean
入力var
には、文字、数値、文字列を指定できます。
数値の場合は文字コードとみなします。
* (eastasian-width #\A)
1
T
* (eastasian-width #\u3042)
2
T
* (eastasian-width #x3044)
2
T
* (eastasian-width "あいうHello")
11
T