Lisp関数仕様 - システム関数

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

Lisp関数仕様

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関数から制御が戻ります。

ただし、引数inputexitの内容によっては、 コアファイルを出力した後にLispに復帰します。
引数inputが指定された場合は、 コアファイル生成後にinputのコアファイルを読み込みます。
また、引数inputが指定されておらず、かつexitnilの場合は、 コアファイル生成後に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

exitquitは同じです。

本関数はLispを終了させますので、式の返却値はありません。
引数の終了コードは、通常はプロセスの終了コードに設定されます。
モジュールとして使用している場合は、C言語のlisp_argv_run関数から制御が戻ります。
返却値はlisp_result変数で確認できます。

exit/quitexit conditionを実行してLispを終了させます。
途中でhandlerを捕捉することができます。

exitquitsymbolは、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-typetのオブジェクトの場合に限り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-typet以外の場合は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型であるにもかかわらず、 1020と言った小さな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/1ratioオブジェクトで存在する場合があります。
本関数は上記の差異を調査するためのものです。

実行例

* 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オブジェクトを生成することです。
通常であれば、例えば102000と言った整数は、 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とは違い、型が排他的かどうかも調査できます。
返却値は下記の通りです。

関数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-streamopen関数の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つのパラメーターが存在します。

:inputmemory-streamの初期値です。
必ず(unsigned-byte 8)sequenceでなければなりません。

:sizememory-sequenceが内部に保有するバッファのサイズです。
省略時はコンパイル時にLISP_DEBUGが指定された場合は64byte、 それ以外の場合は4096byteです。
指定した数のバッファがmemory-stream内部でいくつも生成されることになります。

:arrayは最初に保有する内部バッファの配列数です。
省略時はコンパイル時にLISP_DEBUGが指定された場合は4個、 それ以外の場合は8個です。
例えば、4096byte×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は内部バッファのサイズであり、初期値は4096byteです。
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は内部バッファのサイズであり、初期値は4096byteです。
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は内部バッファのサイズであり、初期値は4096byteです。
arrayは初期のバッファ保有数であり、初期値は8です。
cacheは開発用です。

マクロwith-input-from-memory

マクロwith-input-from-stringmemory-stream版です。

(defmacro with-input-from-memory
  ((stream vector &key size array) declaration* form*) ...)
  -> result

string-streamとは違い、引数indexがありません。

マクロwith-output-to-memory

マクロwith-output-to-stringmemory-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)のソートを行います。

■Paperオブジェクト

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と バイト形式のバッファをあわせもつオブジェクトです。
arraynil0の場合は、body形式で生成されます。
bodynil0の場合は、array形式で生成されます。
arraybodyが1以上の場合は、array-body形式で生成されます。
array-body形式の場合、arraybodyはともに#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

symboltypeのときは、User値の取得と設定を行います。
secondが指定されていなかった場合は取得です。
secondが指定された場合は設定です。

symbollistのときは、arrayかbodyの内容をlistで返却します。
secondが指定されないかnilの場合は、全てのarrayが返却されます。
secondnilではない場合は、全てのbodyが返却されます。

symbolvectorのときは、arrayかbodyの内容をvectorで返却します。
secondが指定されないかnilの場合は、全てのarrayが返却されます。
secondnilではない場合は、全てのbodyが返却されます。
bodyのときは、(unsigned-byte 8)形式のspecialized arrayで返却されます。

symbollengthのときは、arrayかbodyの長さを返却します。
secondが指定されないかnilの場合は、arrayの長さが返却されます。
secondnilではない場合は、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

packageexportリストを取得します。

(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です。
引数cardinalnilで序数になります。

実行例

* (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で失敗の場合を扱うことができます。
標準ではerrorptのため、delete-fileと同じです。
errorpnilの場合は、削除に成功するとtを返却し、失敗したらnilを返却します。

関数remove-directory

ディレクトリを削除します。

(defun remove-directory (pathname &optional (error t)) ...) -> boolean

入力: pathname
入力: errorp
出力: boolean

errorptのときは、削除に失敗したときにerrorが発生します。
errorpnilのときは、削除に成功すると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が無限大のとき、typenpt-system::fp-infiniteです。
floatが非数のとき、typenpt-system::fp-nanです。
floatが通常の数のとき、typenpt-system::fp-normalです。
floatがデノーマル数のとき、typenpt-system::fp-subnormalです。
floatがゼロのとき、typenpt-system::fp-zeroです。
floatの符号が正のとき、sign1です。
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を指定することになると思います。
errortのときは、該当するカテゴリが無かったらエラーが発生します。
正常終了時には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