関数
このページはクイックリファレンスの表です。表中の各関数名はそれぞれのページにリンクしています。各ページには、より詳しい説明と、ブラウザで評価できる実行可能な例があります。横断的なトピックには専用の場所があります。make-array/aref
とハッシュテーブル演算子は、データ型ページの
配列 と ハッシュテーブル
で説明されており、各関数のCommon Lispからの逸脱はそれぞれのページに記載されています。
cl パッケージの関数
標準の Common Lisp 関数で、cl パッケージに属します (cl-user が使用するため、
通常のプログラムでは修飾なしで利用できます)。各関数名はそれぞれのページにリンクして
います。
| 関数 | 例 | 結果 |
|---|---|---|
+ | (+ 1 2 3), (+ 1.5 2.5) | 6, 4.0 |
- | (- 10 3), (- 3.5 1.5) | 7, 2.0 |
* | (* 3 4), (* 2.0 3.0) | 12, 6.0 |
/ | (/ 1 2), (/ 10 2), (/ 7.0 2.0) | 1/2(正確なratio)、5, 3.5 |
mod | (mod 10 3), (mod -13 4) | 1, 3(結果は除数の符号を取ります) |
rem | (rem 13 4), (rem -13 4) | 1, -1(結果は被除数の符号を取ります) |
= | (= 1 1), (= 3 3 3) | t(可変長引数) |
eq | (eq 'foo 'foo), (eq 1.5 1.5) | t, nil(オブジェクトの同一性: シンボルと小さい整数は等しく比較されますが、浮動小数点とratioは別々のオブジェクトなので決して eq になりません。consセルは参照同一性です) |
eql | (eql 1.5 1.5), (eql 3 3.0) | t, nil(eq と同様ですが、同じ型かつ同じ値の数値は等しくなります — 例: 浮動小数点やratio) |
equal | (equal '(1 2 (3)) '(1 2 (3))), (equal "abc" "abc") | t, t(構造的等価性: consセルはcarとcdrで再帰的に比較され、それ以外は eql と同様) |
equalp | (equalp "ABC" "abc") | t(equal と同様だが文字列・文字は大小文字を区別せず数値は値で比較。配列・ハッシュテーブルは eql にフォールバック) |
< | (< 1 2), (< 1 2 3) | t(可変長引数。狭義単調増加のとき真) |
> | (> 2 1), (> 3 2 1) | t(可変長引数) |
<= | (<= 1 1) | t(可変長引数) |
>= | (>= 2 1) | t(可変長引数) |
print | (print 42) | 42 を改行付きで印字します |
prin1 | (prin1 42) | print と同様ですが改行なし |
princ | (princ "hello") | 引用符なし・改行なしで印字します |
terpri | (terpri) | 改行のみを印字します |
fresh-line | (fresh-line) | 標準出力がまだ行頭にない場合のみ改行を印字します。nilを返します |
princ-to-string | (princ-to-string '(1 "x")) | "(1 x)" -- princ が印字する文字列 |
prin1-to-string | (prin1-to-string "abc") | "\"abc\"" -- prin1 が印字する文字列(読み戻し可能な形式) |
concatenate | (concatenate 'string "foo" "bar") | "foobar"(サポートされるのは 'string 結果型のみ。コンパイラはリテラルの 'string を要求します) |
string-upcase | (string-upcase "abc") | "ABC"(WASMバックエンドでは大小文字変換はASCII限定です) |
string-downcase | (string-downcase "ABC") | "abc" |
string-capitalize | (string-capitalize "hello world") | "Hello World"(各単語の最初の文字) |
subseq | (subseq "hello" 1 3) | "el"(文字列とリストで機能します。例: (subseq '(1 2 3 4) 1 3) => (2 3)。end 引数は省略可能) |
make-string | (make-string 3 :initial-element #\x) | "xxx" -- :initial-element(デフォルトは空白)を n 個並べた新しい文字列。:element-type は受け付けるが無視 |
replace | (replace (make-string 5 :initial-element #\a) "XY" :start1 1) | "aXYaa" -- sequence-2 を sequence-1 にコピー(:start1/:end1/:start2/:end2)。文字列対応で、新しい文字列を返す(文字列は不変) |
string= | (string= "abc" "abc") | t(大小文字を区別する文字列等価) |
string< | (string< "abc" "abd") | 2(大小文字を区別する辞書順の less-than: 不一致のインデックス、なければ nil) |
string-equal | (string-equal "ABC" "abc") | t(大小文字を区別しない、ASCII) |
string-trim | (string-trim " " " hi ") | "hi"(指定した文字集合の文字を両端から取り除きます) |
string-left-trim | (string-left-trim "x" "xxhi") | "hi" |
string-right-trim | (string-right-trim "x" "hixx") | "hi" |
read-line | (read-line), (read-line stream) | 標準入力(または入力ストリーム)から1行読み込み、文字列として返します。EOFでは nil |
open | (open "f.txt"), (open "f.txt" :output), (open "f.bin" :input '(unsigned-byte 8)) | ファイルを開いてストリームを返します。方向はリテラルの :input(デフォルト、読み込み)または :output(作成/切り詰め、書き込み)でなければなりません。省略可能な要素型はリテラルの 'character(デフォルト、テキスト)または '(unsigned-byte 8)(バイナリ)でなければなりません |
close | (close stream) | open で開いたストリームを閉じます。t を返します |
write-line | (write-line "hi" stream), (write-line "hi") | 文字列と改行を出力ストリーム(または標準出力)に書き込みます。文字列を返します |
read-byte | (read-byte stream), (read-byte stream nil -1) | バイナリ入力ストリームから 1 バイト(0-255)を読み込みます。EOF ではエラーを通知し、eof-error-p が nil の場合は eof-value を返します |
write-byte | (write-byte 255 stream) | バイナリ出力ストリームに生の 1 バイト(0-255)を書き込みます。バイトを返します |
read-sequence | (read-sequence buf stream), (read-sequence buf stream :start 2 :end 4) | バイナリ入力ストリームのバイトでベクタを埋めます。充填位置を返します。:start/:end はリテラルのキーワードでなければなりません |
write-sequence | (write-sequence "abcd" s :start 1 :end 3), (write-sequence buf stream) | シーケンスをストリームに書き込み、それを返します。文字列は(write-string と同様に)文字として書き込まれ、バイト(0-255)のベクタはバイナリ出力ストリームに書き込まれます。:start/:end はリテラルのキーワードでなければなりません |
read | (read), (read stream) | 標準入力(または open/with-open-file で開いた入力ストリーム)からS式を1つ読み込みます(3つのバックエンドすべて)。EOFでは nil |
read-from-string | (read-from-string "(+ 1 2)") | 文字列からデータを1つパースします(3つのバックエンドすべて)。省略可能な eof-error-p/eof-value および :start/:end 引数はサポートされません |
parse-integer | (parse-integer "42"), (parse-integer "ff" :radix 16), (parse-integer "12x" :junk-allowed t) | 文字列から整数をパースします。すべてのバックエンドで :start/:end/:radix/:junk-allowed をサポートします。パース停止位置が 2 番目の値になり、multiple-value-bind で観測できます。:junk-allowed がない場合、末尾の非空白文字はエラーです |
char schar | (char "hello" 1) | #\e -- 0始まりの文字列インデックスの文字 |
char-code | (char-code #\A) | 65 -- 文字のコードポイント |
code-char | (code-char 66) | #\B -- 指定したコードポイントの文字 |
char= char< char<= | (char< #\a #\b #\c) | t(コードポイントによる可変長引数比較) |
char-upcase char-downcase | (char-upcase #\a) | #\A(WASMバックエンドではASCII大小文字変換) |
characterp | (characterp #\a) | t |
alpha-char-p | (alpha-char-p #\x), (alpha-char-p #\5) | t, nil(WASMバックエンドではASCII文字) |
lower-case-p upper-case-p | (lower-case-p #\a), (upper-case-p #\A) | t, t -- 大文字化・小文字化で文字が変化するとき真(Unicode ケース表に従う) |
digit-char-p | (digit-char-p #\7), (digit-char-p #\f 16) | 7, 15 -- 指定した基数(デフォルト10)での桁の重み、またはnil |
eval | (eval '(+ 1 2)) | 式を評価します(3つのバックエンドすべて)。結果を返します |
load | (load "bar.lisp") | ファイル内のすべてのトップレベルフォームをグローバル環境で読み込んで評価します(3つのバックエンドすべて)。t を返します |
require | (require :util), (require :util "lib/util.lisp") | モジュールのファイル(require するファイルの隣の <name>.lisp、または明示パス)を、まだ provide されていなければロードします。モジュール名を返します。コンパイルパスではリテラルなトップレベルフォームである必要があります |
provide | (provide :util) | モジュールをロード済みとして登録し、以後の require を no-op にします。モジュール名を返します。コンパイルパスではリテラルなトップレベルフォームである必要があります |
gensym | (gensym), (gensym "tmp") | #:g1, #:tmp2 -- マクロの一時変数のための新しいシンボル(カウンタはプログラム全体で共有) |
make-symbol | (make-symbol "temp") | #:temp -- 新しいアンインターンドシンボル(gensym の #: 規約、カウンタなし) |
intern | (intern "foo") | シンボル foo(名前はそのまま使用。カレントパッケージは無視され、パッケージ引数はエラー) |
find-symbol | (find-symbol "car") | 名前が既知(cl シンボル・キーワード・ユーザー定義)なら car、なければ nil(コンパイラ: リテラル文字列のみ) |
symbol-name | (symbol-name 'foo) | "foo" -- 格納された名前そのまま(ケース保存。CL のように大文字化されない) |
symbol-value | (symbol-value '*level*) | グローバル変数の値。未束縛の名前はエラー(レキシカルな束縛は見えない) |
boundp | (boundp '*level*) | シンボルが束縛されたグローバル変数を指すとき t(t/nil/キーワードは自己束縛) |
fboundp | (fboundp 'car) | 関数・マクロ・特殊形式に対して t(コンパイラ: 計算された引数は関数のみ判定) |
macroexpand-1 | (macroexpand-1 '(unless c x)) | (if c nil x) -- トップレベルのフォームを 1 段階だけ展開します(ユーザーマクロと組み込みマクロ) |
macroexpand | (macroexpand '(outer 41)) | 完全な展開結果: macroexpand-1 を変化しなくなるまで繰り返します |
null | (null nil) | t |
not | (not nil) | t(null と同一) |
atom | (atom 1) | t |
numberp | (numberp 42) | t |
integerp | (integerp 42) | t |
floatp | (floatp 3.14) | t |
rationalp | (rationalp 1/2) | t(整数とratio) |
numerator | (numerator 3/4) | 3(整数自身がその分子) |
denominator | (denominator 3/4) | 4(整数では 1) |
symbolp | (symbolp 'foo) | t |
stringp | (stringp "hello") | t |
listp | (listp '(1 2)) | t |
consp | (consp '(1 2)) | t |
keywordp | (keywordp :foo) | t |
constantp | (constantp 5), (constantp 'x) | t, nil -- 自己評価オブジェクト(数値、文字列、文字、キーワード、t/nil)と (quote x) 形式で真(lite) |
streamp | (streamp s) | s がストリームなら t、そうでなければ nil(lite: ストリームは整数ハンドルなので integerp に相当。stream 型指定子の裏付けでもある) |
cons | (cons 1 2) | (1 . 2) |
car | (car (cons 1 2)) | 1((car nil) は nil) |
cdr | (cdr (cons 1 2)) | 2((cdr nil) は nil) |
caar..cddddr | (cadr '(1 2 3)) | 2(car/cdr の合成、2~4段) |
first | (first '(1 2 3)) | 1(car と同じ) |
rest | (rest '(1 2 3)) | (2 3)(cdr と同じ) |
nth | (nth 1 '(1 2 3)) | 2(0始まりのインデックス) |
second third fourth | (second '(1 2 3)) | 2 |
list | (list 1 2 3) | (1 2 3) |
nthcdr | (nthcdr 2 '(1 2 3)) | (3)(先頭のn要素をスキップ) |
length | (length '(1 2 3)), (length "abc"), (length #(1 2 3)) | 3, 3, 3(リスト、文字列、ベクタ。nilでは 0) |
reverse | (reverse '(1 2 3)) | (3 2 1) |
member | (member 2 '(1 2 3)) | (2 3)(carが要素と eql になる末尾、またはnil。省略可能な :test/:key キーワードを取ります。例: (member '(a d) '((a b) (a d)) :test 'equal) -> ((a d))) |
find | (find 2 '(1 2 3)) | 2(要素と eql になる最初の要素、またはnil。省略可能な :test/:key キーワードを取ります) |
find-if | (find-if #'evenp '(1 3 6 7)) | 6(述語を満たす最初の要素、またはnil) |
find-if-not | (find-if-not #'evenp '(2 4 5 6)) | 5(述語を満たさない最初の要素、またはnil) |
member-if | (member-if #'oddp '(2 4 5 6)) | (5 6)(述語を満たす最初の要素から始まる末尾、またはnil) |
position | (position 3 '(1 2 3)) | 2(要素と eql になる最初の要素の0始まりインデックス、またはnil。省略可能な :test/:key キーワードを取ります) |
position-if | (position-if #'evenp '(1 3 6 7)) | 2(述語を満たす最初の要素の0始まりインデックス、またはnil) |
count | (count 2 '(1 2 3 2 2)) | 3(要素と eql になる要素の数。省略可能な :test/:key キーワードを取ります) |
count-if | (count-if #'evenp '(1 2 3 4)) | 2(述語を満たす要素の数) |
assoc | (assoc 'b '((a . 1) (b . 2))) | (b . 2)(carがキーに一致する最初のペア、またはnil。既定では eql で比較し、省略可能な :test/:key キーワードを取ります。例: (assoc "b" '(("a" . 1) ("b" . 2)) :test #'equal)) |
assoc-if | (assoc-if #'oddp '((2 a) (3 b))) | (3 b)(carが述語を満たす最初のペア、またはnil) |
getf | (getf '(:a 1 :b 2) :b) | 2(プロパティリスト中で指標に続く値、またはnil。remf の相棒。引数は2つのみで &optional default はありません) |
last | (last '(1 2 3)) | (3)(最後のconsセル、空リストではnil) |
butlast | (butlast '(1 2 3)) | (1 2)(最後の要素を除いたコピー。空または単一要素のリストではnil) |
remove | (remove 2 '(1 2 3 2)) | (1 3)(指定した要素と eql になる要素を除いた新しいリスト。省略可能な :test/:key キーワードを取ります) |
remove-if | (remove-if #'evenp '(1 2 3 4)) | (1 3)(述語を満たす要素を除いた新しいリスト) |
remove-if-not | (remove-if-not #'evenp '(1 2 3 4)) | (2 4)(述語を満たす要素のみを残した新しいリスト) |
remove-duplicates | (remove-duplicates '(1 2 1 3)) | (2 1 3)(重複要素を除き、最後の出現を残したコピー。既定では eql 比較で、省略可能な :test/:key キーワードを取ります) |
delete | (delete 2 '(1 2 3 2)) | (1 3)(破壊的な remove。マッチするセルをその場で切り出します。省略可能な :test/:key キーワードを取ります。先頭が変わる場合があるので戻り値を使ってください) |
delete-if | (delete-if #'evenp '(1 2 3 4)) | (1 3)(破壊的な remove-if) |
delete-if-not | (delete-if-not #'evenp '(1 2 3 4)) | (2 4)(破壊的な remove-if-not) |
substitute | (substitute 0 2 '(1 2 3 2)) | (1 0 3 0)(旧要素と eql になるすべての要素を新要素に置き換えたコピー。省略可能な :test/:key キーワードを取ります) |
nsubstitute | (nsubstitute 0 2 '(1 2 3 2)) | (1 0 3 0)(破壊的な substitute。マッチするcarをその場で書き換えます。省略可能な :test/:key キーワードを取ります) |
nconc | (nconc (list 1 2) (list 3 4) (list 5)) | (1 2 3 4 5)(任意個数のリストを破壊的に連結し、最初の非 nil 引数を返します) |
copy-list | (copy-list '(1 2 3)) | (1 2 3)(リストの浅いコピー) |
nreverse | (nreverse '(1 2 3)) | (3 2 1)(各 cdr を繋ぎ替えてリストを破壊的に反転します。戻り値を使ってください) |
make-list | (make-list 3) | (nil nil nil)(n個のnil要素のリスト。:initial-element なし) |
union | (union '(1 2 3) '(2 3 4)) | (4 1 2 3)(集合の和。既定では eql 比較で、省略可能な :test/:key キーワードを取ります。結果順序は未規定) |
intersection | (intersection '(1 2 3) '(2 3 4)) | (3 2)(集合の積。既定では eql 比較で、省略可能な :test/:key キーワードを取ります。結果順序は未規定) |
set-difference | (set-difference '(1 2 3) '(2)) | (3 1)(第1リストにあって第2リストにない要素。既定では eql 比較で、省略可能な :test/:key キーワードを取ります。結果順序は未規定) |
adjoin | (adjoin 1 '(2 3)) | (1 2 3)(すでにメンバーでない限り要素を先頭に追加します。既定では eql 比較で、省略可能な :test/:key キーワードを取ります) |
list* | (list* 1 2 '(3 4)), (list* 1 2 3) | (1 2 3 4), (1 2 . 3)(先頭の引数を最後の引数の末尾にconsします) |
acons | (acons 'a 1 nil) | ((a . 1))((key . value) ペアを連想リストの先頭に追加します) |
endp | (endp nil), (endp '(1)) | t, nil(リスト終端テスト。null の同義語で、不正リストのエラーは緩和されています) |
elt | (elt '(a b c) 1) | b(0始まりの要素アクセス。リストのみで文字列インデックスはありません) |
rassoc | (rassoc 2 '((a . 1) (b . 2))) | (b . 2)(cdrが値に一致する最初のペア、またはnil。既定では eql で比較し、省略可能な :test/:key キーワードを取ります) |
pairlis | (pairlis '(a b) '(1 2)) | ((a . 1) (b . 2))(キーのリストと値のリストを組にして連想リストを作ります。省略可能な第3引数は末尾に連結されます) |
copy-alist | (copy-alist '((a . 1))) | ((a . 1))(連想リストの背骨と各ペアセルをコピーします。キーと値自体は共有されます) |
revappend | (revappend '(1 2 3) '(4 5)) | (3 2 1 4 5)(第1リストを反転して第2リストを追加します) |
nreconc | (nreconc '(1 2 3) '(4 5)) | (3 2 1 4 5)(破壊的な revappend。(nconc (nreverse x) y) に展開され、第1リストのconsセルを再利用します) |
maplist | (maplist #'identity '(1 2 3)) | ((1 2 3) (2 3) (3))(連続する末尾に適用し、結果を集めます。単一リスト形式) |
mapcon | (mapcon (lambda (x) (list (car x))) '(1 2 3)) | (1 2 3)(連続する末尾に適用し、結果リストを連結します。単一リスト形式) |
mapl | (mapl #'identity '(1 2 3)) | (1 2 3)(連続する末尾に副作用のため適用し、元のリストを返します。単一リスト形式) |
sort | (sort '(3 1 2) #'<) | (1 2 3)(比較述語でリストを破壊的にソートします。安定ではありません) |
rplaca | (rplaca x val) | consセルのcarを破壊的に置き換え、そのセルを返します |
rplacd | (rplacd x val) | consセルのcdrを破壊的に置き換え、そのセルを返します |
1+ | (1+ 41) | 42((+ x 1) と同じ) |
1- | (1- 43) | 42((- x 1) と同じ) |
zerop | (zerop 0) | t |
plusp | (plusp 3) | t |
minusp | (minusp -3) | t |
evenp | (evenp 4) | t |
oddp | (oddp 3) | t |
abs | (abs -5), (abs -3.14) | 5, 3.14 |
min | (min 3 5), (min 5 2 8 1) | 3, 1(可変長引数) |
max | (max 3 5), (max 5 2 8 1) | 5, 8(可変長引数) |
float | (float 42) | 42.0(doubleに変換) |
truncate | (truncate 3.7), (truncate -7 2) | 3, -3(ゼロ方向。除数を与えると除算の商になり、剰余は multiple-value-bind で観測できます) |
floor | (floor 3.7), (floor 7 2) | 3, 3(負の無限大方向。除数を与えると除算の商になり、剰余は multiple-value-bind で観測できます) |
ceiling | (ceiling 3.2), (ceiling 7 2) | 4, 4(正の無限大方向。除数を与えると除算の商になります) |
round | (round 3.5), (round 2.5) | 4, 2(銀行家の丸め。オプションの除数を与えると除算の商を丸めます) |
sqrt | (sqrt 16), (sqrt 2) | 4.0, 1.4142135623730951(常に浮動小数点) |
isqrt | (isqrt 17) | 4(整数平方根、実数根の床) |
expt | (expt 2 10), (expt 2.0 3) | 1024, 8.0 |
random | (random 100), (random 1.0) | [0, 100) / [0.0, 1.0) の範囲の値(結果型は上限に従います。(random 1) は常に 0)。インタプリタとJVMは Math.random から取得します。WASMはPreview 1モードではWASIの random_get ホスト関数から、--component モードでは wasi:random@0.3.0 から実際のエントロピーを取得するため、列は実行ごとに異なります |
get-universal-time | (get-universal-time) | 1900-01-01 GMTからの秒数。インタプリタとJVMは整数を返します。WASMはクロック(Preview 1では実際のホストクロック、--component モードでは wasi:clocks@0.3.0)を読み、31ビット整数では値を保持できないため 浮動小数点 を返します(そのため生の値を印字するのではなく比較/差分で使ってください) |
get-internal-real-time | (get-internal-real-time) | 経過実時間(ミリ秒)(インタプリタ/JVMでは整数、WASMでは浮動小数点) |
get-internal-run-time | (get-internal-run-time) | 消費した実行時間(ミリ秒)(インタプリタ/JVMでは整数、WASMでは浮動小数点) |
getenv | (getenv "PATH") | 環境変数の値を文字列として、未設定の場合は nil を返します。3つのバックエンドすべて。WASMはPreview 1では実際のホスト環境を、--component モードでは wasi:cli/environment@0.3.0 を読みます(wasmtimeに --env/-S inherit-env を渡してください) |
exp | (exp 0) | 1.0(インタプリタ/JVMは Math.exp を使用。WASMはソフトウェア近似を使用) |
log | (log 1) | 0.0(自然対数。インタプリタ/JVM は Math.log、WASM はソフトウェア近似) |
sin cos tan | (sin 0), (cos 0) | 0.0, 1.0(インタプリタ/JVM は Math.sin/cos/tan、WASM はソフトウェア近似) |
asin acos atan | (atan 0) | 0.0(全バックエンド -- WASM はソフトウェア近似) |
sinh cosh tanh | (tanh 0) | 0.0(全バックエンド -- WASM は 3 つともソフトウェア exp から導出) |
gcd | (gcd 12 18), (gcd 24 36 60) | 6, 12(可変長引数。最大公約数、(gcd) は 0) |
lcm | (lcm 4 6), (lcm 2 3 4) | 12, 12(可変長引数。最小公倍数。いずれかの引数が 0 なら 0、(lcm) は 1) |
signum | (signum -5), (signum 3.5) | -1, 1.0(符号。整数/浮動小数点の型を保ちます) |
logand | (logand 12 10), (logand 12 10 6) | 8, 0(可変長引数のビット単位AND。(logand) は -1) |
logior | (logior 12 10), (logior 1 2 4 8) | 14, 15(可変長引数のビット単位OR。(logior) は 0) |
logxor | (logxor 12 10) | 6(可変長引数のビット単位XOR。(logxor) は 0) |
lognot | (lognot 5) | -6(ビット単位NOT、すなわち1の補数) |
ash | (ash 1 4), (ash 255 -4) | 16, 15(算術シフト。非負のカウントなら左、それ以外は右) |
funcall | (funcall #'+ 3 4) | 関数を引数に適用します。関数値(#'f、ラムダ)または関数を指すシンボル((funcall 'car ...))を受け付けます |
mapcar | (mapcar #'car '((1 2) (3 4))) | 各要素に関数を適用し、新しいリストを返します |
map | (map 'list #'+ '(1 2 3) '(10 20 30)) | (11 22 33)(シーケンス(リスト/文字列)を最短のものまでマッピングし、'list/'string の結果を構築、または副作用のため nil を返す) |
mapc | (mapc #'print '(1 2 3)) | 副作用のために各要素に関数を適用し、元のリストを返します |
mapcan | (mapcan (lambda (x) (list x x)) '(1 2)) | (1 1 2 2)(関数を適用し結果リストを連結します。非破壊的な append を使用) |
apply | (apply #'+ 1 2 '(3 4)) | 10(先頭の引数と展開された最終リストに関数を適用します) |
values | (values 1 2 3), (multiple-value-list (values 1 2 3)) | 1, (1 2 3) -- 通常の文脈では主値だけが残ります。multiple-value-bind/-list/-call/nth-value はリテラルの (values ...) 呼び出し、多値の組み込み関数(floor ファミリ、gethash、parse-integer、values-list)、(values ...) を返すユーザ関数の全ての値を受け取ります |
reduce | (reduce #'+ '(1 2 3) :initial-value 0) | 左畳み込み: (f (f (f init a) b) c)。素の形式 (reduce f list) は最初の要素を初期値に使います。:initial-value キーワード(リテラル)は明示的な初期値を与えます |
every | (every #'evenp '(2 4 6)) | すべての要素で述語が非nilなら t、そうでなければ nil(単一リスト形式) |
some | (some #'oddp '(2 4 5)) | 最初の非nilな述語結果、すべての要素が失敗すれば nil(単一リスト形式) |
notany | (notany #'evenp '(1 3 5)) | すべての要素で述語がnilなら t、そうでなければ nil(some の補) |
notevery | (notevery #'evenp '(2 4 5)) | いずれかの要素で述語がnilなら t、そうでなければ nil(every の補) |
symbol-function | (symbol-function 'car) | シンボルが指す関数を返します(コンパイラ: 引数は引用されたシンボルリテラルでなければなりません) |
identity | (identity 42) | 42(引数をそのまま返します) |
make-hash-table | (make-hash-table), (make-hash-table :test 'equal) | 空のハッシュテーブルを作成します。:test は受け付けられますが情報的なものです(下記の注記を参照)。:size などの他のキーワードは無視されます |
gethash | (gethash key table), (gethash key table default) | key に格納された値、なければ default(省略時はnil)を返します |
(setf (gethash key table) v) | (setf (gethash "a" h) 1) | key の下に v を格納します。placeに対する incf/decf/push と組み合わせて使えます |
remhash | (remhash key table) | key のエントリを削除します。削除されたら t、そうでなければ nil を返します |
clrhash | (clrhash table) | すべてのエントリを削除します。テーブルを返します |
hash-table-count | (hash-table-count table) | エントリ数 |
hash-table-p | (hash-table-p x) | x がハッシュテーブルなら t、そうでなければ nil |
maphash | (maphash (lambda (k v) ...) table) | 副作用のために各キー/値ペアに関数を呼びます。nilを返します |
make-array | (make-array 5 :initial-element 0), (make-array (list 2 3)) | 任意の階数の配列を作成します。:initial-element はすべてのセルを設定します(省略時はnil) |
aref | (aref a i), (aref a i j) | 指定した添字の要素を返します |
(setf (aref a i j) v) | (setf (aref a 0 0) 1) | 添字の位置に v を格納します。placeに対する incf/decf/push と組み合わせて使えます |
vector | (vector 1 2 3) | #(1 2 3)(引数からなる新しい階数1の配列) |
svref | (svref (vector 10 20 30) 1) | 20(ベクタの要素アクセス。setf のplaceとしても使えます) |
array-dimensions | (array-dimensions (make-array (list 2 3))) | (2 3)(各次元のサイズのリスト) |
array-dimension | (array-dimension (make-array (list 2 3)) 1) | 3(指定した軸のサイズ。0始まり) |
array-rank | (array-rank (vector 1 2)) | 1(階数2の配列では 2、以降も同様) |
array-total-size | (array-total-size (make-array (list 2 3))) | 6(要素の総数) |
row-major-aref | (row-major-aref (make-array (list 2 3)) 4) | フラットな行優先インデックスの要素。階数に依存せず、setf の場所としても使えます |
array-row-major-index | (array-row-major-index (make-array (list 2 3)) 1 1) | 4(添字のフラットな行優先インデックス) |
coerce | (coerce '(1 2 3) 'vector), (coerce "ab" 'list) | #(1 2 3)、(#\a #\b)(結果型はリテラルの 'list/'vector/'string のみ) |
fill-pointer | (fill-pointer v) | :fill-pointer ベクタのフィルポインタ(実効長)。setf 可能な場所でもある |
array-has-fill-pointer-p | (array-has-fill-pointer-p a) | 配列がフィルポインタを持てば t、そうでなければ nil |
adjustable-array-p | (adjustable-array-p a) | 配列が :adjustable で作成されていれば t、そうでなければ nil |
array-element-type | (array-element-type a) | 常に t(要素型は追跡されない) |
vector-push | (vector-push x v) | フィルポインタの位置に x を格納しインデックスを返す。満杯なら nil |
vector-pop | (vector-pop v) | フィルポインタをデクリメントし、通過した要素を返す |
vector-push-extend | (vector-push-extend x v &optional ext) | vector-push と同様だが満杯時にベクタを拡張する |
rontolisp パッケージの関数
rontolisp パッケージは Common Lispの一部ではない
実装固有の関数を提供します。rontolisp: 修飾子で参照する(または (in-package rontolisp)
の後に修飾なしで)使用してください。パッケージシステムについては
パッケージ を参照してください。以下の各名前はそれぞれのページにリンクしています。
| Function | Example | Result |
|---|---|---|
rontolisp:version | (rontolisp:version) | ビルド情報のプロパティリスト(:version, :build-timestamp, :git-commit, :git-branch) |
rontolisp:list-functions | (rontolisp:list-functions :cl) | パッケージの関数シンボルをソートしたもの(デフォルトは :cl) |
rontolisp:list-macros | (rontolisp:list-macros) | パッケージのマクロシンボルをソートしたもの |
rontolisp:list-special-forms | (rontolisp:list-special-forms) | パッケージの特殊形式シンボルをソートしたもの |
rontolisp:fetch | (rontolisp:fetch "http://example.com/") | HTTPリクエストを非同期に開始します。プロミスを返します |
rontolisp:await | (rontolisp:await p) | プロミスを解決します (ブロッキング)。プロミス以外はそのまま返します |
rontolisp:then | (rontolisp:then p (lambda (r) (getf r :status))) | 確定値にコールバックを適用する新しいプロミスを導出します |
rontolisp:promisep | (rontolisp:promisep p) | 値がプロミスなら t |
rontolisp:http-handler | (rontolisp:http-handler 'handle 8080) | ハンドラ関数でHTTPリクエストを処理します(ブロッキングサーバ。--component では wasi:http コンポーネント) |
rontolisp:json-parse | (rontolisp:json-parse "{\"n\": 1}") | JSON文字列をパースします: オブジェクトはキーワードのplist(:hash-table 指定でハッシュテーブル)になります |
rontolisp:json-stringify | (rontolisp:json-stringify (list :n 1)) | 値(plistとハッシュテーブルはオブジェクト)をJSON文字列にシリアライズします |
rontolisp:tcp-connect | (rontolisp:tcp-connect "127.0.0.1" 7777) | ブロッキングTCP接続を開きます。双方向ストリームハンドルを返します |
rontolisp:tcp-listen | (rontolisp:tcp-listen 7777), (rontolisp:tcp-listen 0 "127.0.0.1") | リスニングTCPソケットをバインドしてリスナーハンドルを返します。ポート 0 は空きエフェメラルポートを選びます |
rontolisp:tcp-accept | (rontolisp:tcp-accept listener) | クライアント接続を待ちます (ブロッキング)。双方向ストリームハンドルを返します |
rontolisp:tcp-local-port | (rontolisp:tcp-local-port listener) | リスナーまたはソケットが実際にバインドされているローカルポート |
rontolisp:tcp-local-address | (rontolisp:tcp-local-address listener) | リスナーまたはソケットがバインドされているローカルIPアドレス(文字列) |
rontolisp:tcp-peer-address | (rontolisp:tcp-peer-address sock) | 接続済みソケットのリモートIPアドレス(文字列) |
rontolisp:tcp-peer-port | (rontolisp:tcp-peer-port sock) | 接続済みソケットのリモートポート |
rontolisp:tls-connect | (rontolisp:tls-connect "example.com" 443) | 暗号化(TLS)クライアント接続を開きます。tcp-connect と同じ種類のストリームハンドルを返します |
rontolisp:tls-listen | (rontolisp:tls-listen "server.p12" "changeit" 8443) | PKCS12キーストアから暗号化リスニングソケットをバインドします。tcp-accept で受け付けます |
rontolisp:tls-listen-pem | (rontolisp:tls-listen-pem "cert.pem" "key.pem" 8443) | PEMの証明書/鍵ファイルから暗号化リスニングソケットをバインドします |
rontolisp:wasm-export | (rontolisp:wasm-export 'fact :params '(:int) :returns :int) | WASMコアモジュールへのコンパイル時に defun をホストから呼び出し可能にします |
rontolisp:wasm-import | (rontolisp:wasm-import 'add :from "host" :params '(:int :int) :returns :int) | WASMコアモジュールへのコンパイル時に、ホスト関数をLispから呼び出し可能として宣言します |
イントロスペクション関数(list-functions / list-macros /
list-special-forms)については
パッケージのイントロスペクション
で詳しく説明しています。rontolisp:fetch
は外向きのHTTPリクエストを開始してプロミスを返し、汎用のプロミス操作 rontolisp:await / rontolisp:then / rontolisp:promisep がそれを解決します。全体像は
HTTPリクエストガイドを、オプション、結果plist、バックエンドのサポート、制限については
fetch、
await、
then、
promisep のリファレンスページを参照してください。rontolisp:http-handler は fetch の受信側で、同じリクエスト/レスポンスのプロパティリストを使ってハンドラ関数でHTTPリクエストを処理します。各バックエンドでの実例は
HTTPサーバガイドを、バックエンドのサポートと制限は
http-handler のリファレンスページを参照してください。rontolisp:json-parse と rontolisp:json-stringify はJSONドキュメントとLispの値を相互変換します(JavaScriptの JSON.parse/JSON.stringify 相当。fetchレスポンスボディのパースなどに使えます)。値の対応と制限については
json-parse と
json-stringify のリファレンスページを参照してください。tcp関数(rontolisp:tcp-connect / tcp-listen / tcp-accept / tcp-local-port およびアドレスアクセサ)は素のTCPソケットを開き、そのハンドルには標準のストリーム関数(read-line / write-line / read-byte / write-byte / close)がそのまま使えます。echoサーバーの実例は
TCPソケットガイドを、バックエンドのサポートと制限は
tcp-connect、
tcp-listen、
tcp-accept、
tcp-local-port のリファレンスページを参照してください。既存のCommon Lispコードとの互換のために、これらの上にusocket互換シムが用意されています。TLS版(rontolisp:tls-connect / tls-listen / tls-listen-pem)は同じストリームハンドルをTLSで包みます。
tls-connect、
tls-listen、
tls-listen-pem のリファレンスページを参照してください。rontolisp:wasm-export と rontolisp:wasm-import
はWASMバックエンド向けのコンパイル時ディレクティブです。
wasm-export と
wasm-import のリファレンスページ、および
WebAssemblyへのコンパイル ガイドを参照してください。
linalg パッケージの関数
linalg パッケージは、組み込みの配列に対する numpy
スタイルのベクトル・行列演算を提供します(要素ごとの演算とリダクションは任意の階数で動作します)。Common Lispの一部ではありません。
関数は linalg: 修飾子で参照してください(このパッケージは cl を使用しないため、
通常は cl-user に留まり修飾名で呼び出します)。パッケージはLispソースで一度だけ
実装されており、すべてのバックエンドで同一に動作します。コンストラクタは packed
double-float 配列を作るため浮動小数点で計算します(det・inv・solve は numpy と同様です)。
以下の各名前はそれぞれのページにリンクしています。概要と実例は
ベクトルと行列ガイドを参照してください。
| Function | Example | Result |
|---|---|---|
linalg:zeros | (linalg:zeros 3), (linalg:zeros '(2 2)) | #d(0.0 0.0 0.0)、#d((0.0 0.0) (0.0 0.0))(shapeは整数または (rows cols) のリスト) |
linalg:ones | (linalg:ones '(2 2)) | #d((1.0 1.0) (1.0 1.0)) |
linalg:full | (linalg:full '(2 2) 7) | #d((7.0 7.0) (7.0 7.0)) |
linalg:zeros-like | (linalg:zeros-like #2A((1 2) (3 4))) | #d((0.0 0.0) (0.0 0.0))(入力と同じ形状・同じ要素幅のゼロ配列) |
linalg:eye | (linalg:eye 2) | #d((1.0 0.0) (0.0 1.0))(単位行列) |
linalg:arange | (linalg:arange 5), (linalg:arange 2 10 2) | #d(0.0 1.0 2.0 3.0 4.0)、#d(2.0 4.0 6.0 8.0)(stopは含まない。stepは負も可) |
linalg:linspace | (linalg:linspace 0 1 5) | #d(0.0 0.25 0.5 0.75 1.0)(両端を含むn等分の値) |
linalg:from-list | (linalg:from-list '((1 2) (3 4))) | #d((1.0 2.0) (3.0 4.0))(フラットなリストからはベクタ) |
linalg:to-list | (linalg:to-list (linalg:eye 2)) | ((1.0 0.0) (0.0 1.0)) |
linalg:shape | (linalg:shape #2A((1 2 3) (4 5 6))) | (2 3) |
linalg:ndim | (linalg:ndim #2A((1 2) (3 4))) | 2(次元数。数値なら 0) |
linalg:size | (linalg:size (linalg:eye 3)) | 9(要素の総数) |
linalg:reshape | (linalg:reshape (linalg:arange 6) '(2 3)) | #d((0.0 1.0 2.0) (3.0 4.0 5.0))(行優先。extent 1 つに -1 可、要素数から推論) |
linalg:flatten | (linalg:flatten (linalg:eye 2)) | #d(1.0 0.0 0.0 1.0) |
linalg:transpose | (linalg:transpose #2A((1 2 3) (4 5 6))) | #d((1.0 4.0) (2.0 5.0) (3.0 6.0))(ベクタはそのまま返します) |
linalg:add | (linalg:add #(1 2 3) 10) | #d(11.0 12.0 13.0)(要素ごと。スカラーのオペランドはブロードキャスト) |
linalg:sub | (linalg:sub #(5 5) 1) | #d(4.0 4.0) |
linalg:mul | (linalg:mul m1 m2) | アダマール積(要素ごとの積)。行列積ではありません |
linalg:div | (linalg:div #(1 2 3) 2) | #d(0.5 1.0 1.5)(packed double-float 配列) |
linalg:emap | (linalg:emap (lambda (x) (* x x)) (linalg:arange 4)) | #d(0.0 1.0 4.0 9.0)(全要素に関数を適用) |
linalg:exp | (linalg:exp (linalg:zeros 3)) | #d(1.0 1.0 1.0)(要素ごとの e^x) |
linalg:log | (linalg:log #(1 1 1)) | #d(0.0 0.0 0.0)(要素ごとの自然対数) |
linalg:tanh | (linalg:tanh (linalg:zeros 3)) | #d(0.0 0.0 0.0)(要素ごとの双曲線正接) |
linalg:sin | (linalg:sin (linalg:zeros 3)) | #d(0.0 0.0 0.0)(要素ごとの正弦) |
linalg:cos | (linalg:cos (linalg:zeros 3)) | #d(1.0 1.0 1.0)(要素ごとの余弦) |
linalg:tan | (linalg:tan (linalg:zeros 3)) | #d(0.0 0.0 0.0)(要素ごとの正接) |
linalg:asin | (linalg:asin (linalg:zeros 3)) | #d(0.0 0.0 0.0)(要素ごとの逆正弦) |
linalg:acos | (linalg:acos (linalg:ones 3)) | #d(0.0 0.0 0.0)(要素ごとの逆余弦) |
linalg:atan | (linalg:atan (linalg:zeros 3)) | #d(0.0 0.0 0.0)(要素ごとの逆正接) |
linalg:sinh | (linalg:sinh (linalg:zeros 3)) | #d(0.0 0.0 0.0)(要素ごとの双曲線正弦) |
linalg:cosh | (linalg:cosh (linalg:zeros 3)) | #d(1.0 1.0 1.0)(要素ごとの双曲線余弦) |
linalg:sqrt | (linalg:sqrt #(4 9 16)) | #d(2.0 3.0 4.0)(要素ごとの平方根) |
linalg:abs | (linalg:abs #(-3 2 -1)) | #d(3.0 2.0 1.0)(要素ごとの絶対値) |
linalg:square | (linalg:square #(1 2 3)) | #d(1.0 4.0 9.0)(要素ごとの x * x) |
linalg:negative | (linalg:negative #(1 -2 3)) | #d(-1.0 2.0 -3.0)(要素ごとの符号反転) |
linalg:sign | (linalg:sign #(-5 0 7)) | #d(-1.0 0.0 1.0)(要素ごとの符号) |
linalg:reciprocal | (linalg:reciprocal #(2 4 8)) | #d(0.5 0.25 0.125)(要素ごとの 1 / x、float で計算) |
linalg:maximum | (linalg:maximum #(1 5 3) #(4 2 3)) | #d(4.0 5.0 3.0)(要素ごとに大きい方。どちらかの被演算子はスカラー可) |
linalg:minimum | (linalg:minimum #(1 5 3) 4) | #d(1.0 4.0 3.0)(要素ごとに小さい方。どちらかの被演算子はスカラー可) |
linalg:clip | (linalg:clip #(-2 0 3) -1.0 1.0) | #d(-1.0 0.0 1.0)(要素ごとの min(max(x, lo), hi)) |
linalg:relu | (linalg:relu #(-2 0 3)) | #d(0.0 0.0 3.0)(要素ごとの max(x, 0.0)) |
linalg:dot | (linalg:dot v1 v2) | numpyスタイルのディスパッチ: ベクタ.ベクタはスカラー、行列.ベクタ / ベクタ.行列はベクタ、行列.行列は行列積 |
linalg:matmul | (linalg:matmul #2A((1 2) (3 4)) #2A((5 6) (7 8))) | #d((19.0 22.0) (43.0 50.0))(行列積) |
linalg:outer | (linalg:outer #(1 2) #(3 4 5)) | #d((3.0 4.0 5.0) (6.0 8.0 10.0))(外積) |
linalg:sum | (linalg:sum #2A((1 2) (3 4))) | 10(リダクションは要素の型に従う。省略可能な axis / keepdims で軸ごとの還元) |
linalg:mean | (linalg:mean #(1 2 3 4)) | 5/2(リダクションは要素の型に従う。省略可能な axis / keepdims) |
linalg:amax | (linalg:amax #2A((1 9) (3 4))) | 9(最大の要素。省略可能な axis / keepdims) |
linalg:amin | (linalg:amin #(5 2 8)) | 2(最小の要素。省略可能な axis / keepdims) |
linalg:argmax | (linalg:argmax #(1 9 3)) | 1(同値の場合は最初のインデックス。省略可能な axis で軸ごとのインデックス) |
linalg:argmin | (linalg:argmin #(5 2 8)) | 1(省略可能な axis) |
linalg:norm | (linalg:norm #(3 4)) | 5.0(ユークリッド / フロベニウスノルム) |
linalg:trace | (linalg:trace #2A((1 2) (3 4))) | 5(正方行列のみ) |
linalg:diff | (linalg:diff #(1 2 4 7 0)) | #d(1.0 2.0 3.0 -7.0)(最後の軸に沿った n 階の離散差分。省略可能な階数、デフォルト 1) |
linalg:gradient | (linalg:gradient #(0 1 4 9 16)) | #d(1.0 2.0 4.0 6.0 7.0)(中心差分。入力と同じ長さ。省略可能なスカラー間隔または座標ベクタ) |
linalg:det | (linalg:det #2A((1 2) (3 4))) | -2.0(浮動小数点。特異行列は微小値になることがある) |
linalg:inv | (linalg:inv #2A((4 0) (2 4))) | #d((0.25 0.0) (-0.125 0.25))(特異行列ではエラーを通知します) |
linalg:solve | (linalg:solve a b) | a . x = b の解(b はベクタまたは行列) |
linalg:array-equal | (linalg:array-equal (linalg:eye 2) #2A((1 0) (0 1))) | t(同じ形状かつ数値的に等しい要素。配列自体は eq でしか比較できません) |
linalg:equal | (linalg:equal #(1 5 3) #(2 5 1)) | #d(0.0 1.0 0.0)(要素ごとの数値等値を 0.0/1.0 マスクで。スカラー可) |
linalg:greater | (linalg:greater #(1 5 3) 2) | #d(0.0 1.0 1.0)(要素ごとの a > b マスク。スカラー可) |
linalg:greater-equal | (linalg:greater-equal #(1 5 3) #(2 5 1)) | #d(0.0 1.0 1.0)(要素ごとの a >= b マスク) |
linalg:less | (linalg:less #(1 5 3) #(2 5 1)) | #d(1.0 0.0 0.0)(要素ごとの a < b マスク) |
linalg:less-equal | (linalg:less-equal #(1 5 3) #(2 5 1)) | #d(1.0 1.0 0.0)(要素ごとの a <= b マスク) |
linalg:take-rows | (linalg:take-rows #2A((10 11 12) (20 21 22) (30 31 32)) #(2 0)) | #d((30.0 31.0 32.0) (10.0 11.0 12.0))(インデックスベクタで選んだ axis-0 スライス) |
linalg:gather | (linalg:gather #2A((10 11 12) (20 21 22)) #(2 0)) | #d(12.0 20.0)(行ごとの a[i, idx[i]]) |
linalg:one-hot | (linalg:one-hot #(1 0 2) 3) | #d((0.0 1.0 0.0) (1.0 0.0 0.0) (0.0 0.0 1.0))(one-hot 行列) |
linalg:seed | (linalg:seed 42) | 42(共有乱数生成器を決定的に初期化。シード済み列は全バックエンドで bit-identical) |
linalg:rand | (linalg:rand 4) | 一様 [0, 1) の乱数配列(shape は linalg:zeros と同じ指定) |
linalg:randn | (linalg:randn 4) | 標準正規の乱数配列(Irwin-Hall。裾は ±6σ でクリップ) |
linalg:uniform | (linalg:uniform -2.0 2.0 4) | [lo, hi) の一様乱数配列 |
linalg:choice | (linalg:choice 60000 4) | [0, n) の一様インデックスを size 個(復元抽出。ミニバッチ抽出向け) |
linalg:permutation | (linalg:permutation 10) | 0..n-1 のシャッフル(Fisher-Yates) |
java パッケージの関数
java パッケージはリフレクションで任意の Java API を操作します。JVM 専用であり、インタプリタ (java -jar rontolisp.jar) と JVM コンパイル済みクラス (コンパイラがリフレクションブリッジを生成 .class に埋め込みます) で動作します (WASM バックエンドでは動作せず、GraalVM ネイティブバイナリはリフレクションメタデータを持たないためインタプリタ実行もできません)。また Common Lisp の一部ではありません。関数は java: 修飾子付きで参照します。各名前は個別のページにリンクしています。マーシャリング、オーバーロード解決、制限については Java 連携ガイドを参照してください。
| 関数 | 例 | 結果 |
|---|---|---|
java:new | (java:new "java.lang.StringBuilder" "ab") | ホストオブジェクト (#<java ...>) |
java:call | (java:call obj "size") | マーシャリングされたインスタンスメソッドの結果 |
java:static | (java:static "java.lang.Math" "max" 3 7) | マーシャリングされた静的メソッドの結果 |
java:field | (java:field "java.lang.Integer" "MAX_VALUE") | マーシャリングされたフィールド値 |
java:proxy | (java:proxy "java.lang.Runnable" (lambda (m) ...)) | callable を背後に持つインターフェースのインスタンス |
asdf パッケージの関数
asdf パッケージは、.asd 定義から複数ファイルのシステムをロードするための、ASDF の
限定的な API 互換サブセットです。Common Lisp の一部ではありません。シンボルは
asdf: 修飾子付きで参照します。各名前は個別のページにリンクしています。プロジェクトの
全体像と探索パスの詳細は システムガイドを参照してください。
| 関数 | 例 | 結果 |
|---|---|---|
asdf:defsystem | (asdf:defsystem :my-lib :components ((:file "main"))) | システムを定義する (名前・:depends-on・:serial・:components)。後続の load-system 用 |
asdf:load-system | (asdf:load-system :my-lib) | システムをロードする: まず依存システム、次にコンポーネントファイルを順に (コンパイルパスではリテラルかつトップレベルのフォーム) |
ql パッケージの関数
ql パッケージは Quicklisp の限定的な API 互換サブセットです。quickload は本物の
Quicklisp ディストリビューションからシステムをローカルキャッシュにダウンロードし、
asdf サブセットを経由してロードします (quicklisp は組み込みのニックネーム)。
Common Lisp の一部ではありません。シンボルは ql: 修飾子付きで参照します。
下記の名前は個別のページにリンクしています。キャッシュのレイアウトと制約については
システムガイドを参照してください。
| 関数 | 例 | 結果 |
|---|---|---|
ql:quickload | (ql:quickload "split-sequence") | Quicklisp からシステム (とその依存) をダウンロードし、~/.rontolisp/quicklisp にキャッシュしてロードする。ロードしたシステム名のリストを返す |
usocket パッケージの関数
usocket パッケージは、usocket API を
rontolisp:tcp-* 組み込みの上で再現する互換シムです。Postmodern の
cl-postgres ソケット層のような既存の Common Lisp ネットワークコードが、
より少ない変更で動きます。Common Lisp の一部ではありません。シンボルは
usocket: 修飾子付きで参照します。このシムではソケットはストリームハンドル
そのものなので、socket-stream は恒等関数で、標準のストリーム関数が
ソケットにそのまま使えます。パッケージは最初の使用時にロードされ、組み込み
ASDF システム "usocket" でもあります(asdf:load-system、ql:quickload、
:depends-on ("usocket") をダウンロードなしで充足)。対応は TCP のみ --
UDP(socket-send / socket-receive)、wait-for-input、socket-server、
コンディション階層(handler-case での usocket:socket-error)は
非対応です。変数 usocket:*wildcard-host*("0.0.0.0")と
usocket:*auto-port*(0)が提供されます。全体像と制限の一覧は
TCPソケットガイドを参照して
ください。
| 関数 | 例 | 結果 |
|---|---|---|
usocket:socket-connect | (usocket:socket-connect "localhost" 5432 :element-type '(unsigned-byte 8)) | ブロッキングTCP接続を開く。:protocol :datagram はエラー、他のオプションは受理して無視 |
usocket:socket-listen | (usocket:socket-listen usocket:*wildcard-host* usocket:*auto-port*) | リスニングTCPソケットをバインド(usocket流にホストが先) |
usocket:socket-accept | (usocket:socket-accept listener) | クライアント接続を待つ(ブロッキング) |
usocket:socket-stream | (read-line (usocket:socket-stream sock)) | ソケットのストリーム(このシムでは恒等関数) |
usocket:socket-close | (usocket:socket-close sock) | ソケットまたはリスナーを閉じる |
usocket:get-local-port | (usocket:get-local-port listener) | ローカルにバインドされたポート(エフェメラルポートの読み戻し) |
usocket:get-local-address | (usocket:get-local-address listener) | ローカルにバインドされたIPアドレス(文字列) |
usocket:get-peer-address | (usocket:get-peer-address sock) | 接続済みソケットのリモートIPアドレス |
usocket:get-peer-port | (usocket:get-peer-port sock) | 接続済みソケットのリモートポート |
usocket:get-local-name | (usocket:get-local-name sock) | ローカルのアドレスとポートを (values address port) で返す |
usocket:get-peer-name | (usocket:get-peer-name sock) | リモートのアドレスとポートを (values address port) で返す |
with-* 便利マクロ(usocket:with-client-socket / with-connected-socket /
with-server-socket / with-socket-listener)は
マクロページに一覧があり、
リファレンスページで説明しています。
インタープリタと JVM ではあらゆる脱出時にソケットを閉じます
(unwind-protect に展開されます)。
WASM コンポーネントバックエンドでは正常終了時のみ閉じます。