Common Lisp

enは、コンピュータ・プログラミング言語 Lispの標準であり、Lisp方言のひとつでもある。Common Lispの略称はCL。規格はANSIによる ANSI INCITS 226-1994 。仕様を指すこともあれば、実装を指すこともある。いくつかの、フリーソフトウェアの定義に合致したライセンスによりライセンスされている実装や、オープンソースの定義に合致したライセンスによりライセンスされている実装や、プロプライエタリなライセンスによりライセンスされている実装がある。

Lispの基本的な特徴の他、いくつかのプログラミングパラダイムのLispへの取り込みについて標準を提供しているという、マルチパラダイムプログラミング言語という面がある。

関数型だけでなく、手続き型的な言語要素に関しても標準化している。
関数単位の細かで反復的なコンパイルにより、効率的な実行を可能にすると同時にREPLによる動的で迅速な開発をサポートする。
関数オブジェクト、複素数、有理数、多倍長整数などを一級オブジェクトとして持つ。
すべてはオブジェクト。マルチメソッド機能をサポートした強力な動的オブジェクトシステムCommon Lisp Object Systemを備える。
assert関数による基本的なテスト駆動開発が可能。
「例外/ハンドラ」の処理をさらに一段階分離した「Condition/Restart/Handler」による例外処理。
マクロやリーダーマクロといった標準機能により言語を拡張可能。

1. 構文
-----

一般的なLispと同様のS式による構文である。

2. 意味
-----

2.1. 評価順
--------

評価順は、非常に単純な「左から右」、「内側から外側」モデルである。

 のようなS式で、Fが関数ならば、その引数 A1、A2 を左から右へ順番に評価し、最後にFにその引数を渡す。Fがマクロならば、まずマクロを展開する。

; 2 と 2 を足す → 4

; 与えられた数を二乗する関数を定義 )

; 関数を実行 → 9<WtXmlEndTag />

2.2. 静的スコープ
-----------

以前のLispでは動的スコープのものも多かったが、Common Lispでは静的スコープが標準化された。

3. データ型
-------

Common Lispの型システムは階層的である。型はdeftypeを用いて定義され、typeは//supertype//,//subtype//という概念を持つ。すべての //type// は //supertype// として //t// をもつ。従って、全てのオブジェクトは型//t//のインスタンスである。一方、型//nil//は、どのオブジェクトもそのインスタンスにならない型である。

型には//built-in//な型とそうでないものがある。//built-in//な型は、[1]といったプリミティブな型に、配列やストリームなど組み込みの型を合わせたものである。//built-in//でない型には、構造体、クラスなどがある。このように、型システムはクラスおよびオブジェクトシステムと連続的に融合されている。

型は //type specifier//という記述方式で参照され、これはよく//typespec//と省略される。//typespec//を用いて議論する上で、//built-in//とは直交する概念として、//Atomic Type// 対 //Compound Type//という概念がある。[2] は、大雑把には、引数を取ることのことができる型である。例えば、)は、データ内容がすべて整数型で、サイズが次元ごとに「5,可変長,7」である配列を示している。

//Compound Type//では、本来の型に合わせて、特定の一変数関数を型判定に用いることもできる。例えば、型 //mod3// を以下のように定義できる。

  0))

 `))

<WtXmlEndTag />

しかし、Common LispにはHaskellにおけるような型変数の概念はない。上の//array//の例における引数は、変数ではなく定数として処理されるためである。

3.1. アトム ATOM
-------------

Common Lispにおけるアトムとは、誤解を恐れず簡単に言うとlispにおいて「括弧によって囲まれないアトム」すべてを指す。数値はアトムである。シンボル、文字列、文字もアトムである。ANSI CLでは、Compound type  として定義されている。

3.1.1. 数値 
---------------------------

様々な型がある。

NUMBER
COMPLEX
REAL
FLOAT
SINGLE-FLOAT
DOUBLE-FLOAT
RATIONAL
INTEGER
SIGNED-BYTE
UNSIGNED-BYTE
FIXNUM
BIGNUM
RATIOen は数値表現に 多倍長整数 を用いて任意のサイズと精度を実現している。有理数型が分数として正確に表現されるという点は、他の言語にあまり見られない特徴である。en は自動的にそれぞれの数値型を適切に変換する。

3.1.2. 文字
---------

en の文字型は、en文字の範囲に限定されない。これは en が en 以前からあった事を考えれば驚くようなことではない。いくつかの最近の処理系は en 文字をサポートしている文字列は、下で述べるシーケンスのsubtypeである。

3.1.3. シンボル
-----------

シンボル型は en 言語にとっては普通だが、その他の言語ではあまり知られていない型である。シンボルとはユニークで、いくつかのスロットを備えた名付きのデータオブジェクトである。シンボルの備えるスロットのなかでは値セルと関数セルが最も重要なものである。シンボルは、変数の値を保持するための、他の言語でいう識別子として使われる事が多いが、それ以外の用法が多数存在する。通常、シンボルを評価するとその値が返る。いくつかのシンボルは評価するとそのシンボル自身が返る。例えば、キーワードパッケージ中のシンボルはすべて自己評価シンボルである。en における真偽値は、自己評価シンボル t と nil によって表現される。en はパッケージと呼ばれるシンボルのための名前空間を備えている。

3.2. データ構造
----------

3.2.1. シーケンス
------------

en におけるシーケンス型は、リスト、ベクタ、ビットベクタ、文字列からなる。mapやreduceなどの多くの操作は、任意のシーケンス型に対して動作する。

他の en系の言語と同様、en のリストはコンスで構成される。コンスセルはcarとcdrの二つのスロットを備えたデータ構造である。リストはコンスセルを繋ぎ合わせたものである。それぞれのコンスセルの car スロットはリストの要素を参照し、cdr スロットは次のコンスセルを参照する。ただし、最後のコンスセルの cdr だけは nil を参照する。コンスセルによって、簡単に木構造やその他の複雑なデータ構造を実現できるが、大抵他のデータ構造を使うか、クラスのインスタンスを使うほうが推奨される。

3.2.2. 配列
---------

en は多次元の 配列をサポートしており、また必要に応じて配列を動的にリサイズする事も可能である。多次元配列は行列演算に利用される。ベクタは一次元の配列である。配列は任意の型を要素として持つことができるが、それに加えて、整数のベクタのように要素を特定の型に特定化することも可能である。多くの実装では、型指定された配列を使う場合には、配列操作の最適化が可能である。型指定された配列のなかで二種類が標準で定義されている。文字列は文字を要素としたベクタであり、ビットのベクタはビットベクタである。

ビットベクタとベクタはシーケンスのsubtypeでもある。

3.2.3. その他
----------

ハッシュテーブルはデータオブジェクト間の関連を保持する。任意のオブジェクトがキーもしくは値として使用可能である。ハッシュテーブルは配列のように必要に応じて動的にリサイズされる。パッケージはシンボルの集合であり、主にプログラムの一部を 名前空間 で分割するために使用される。パッケージはいくつかのシンボルをエクスポートすることで、インターフェースを公開する。構造体 は C言語の構造体や fr のレコードに似た、複数の型と値のフィールドで構成される複合的なデータ構造である。クラスのインスタンスは構造体に似ているが、これはオブジェクトシステム en によって作られるものである。

3.3. 関数
-------

en では、関数 もデータ型の一つである。たとえば、これは他の関数を引数として取る関数を書く事を可能としたり、関数を返すような関数を書く事を可能とする。これにより、非常に汎用化された操作を記述できるようになる。このため、en のライブラリは、多くの部分が高階関数の上に成りたっている。たとえば、sort 関数は、引数として 比較オペレータ を取る。これは、比較関数が任意の型のデータを整列できるだけでなく、キーによって任意のデータ構造を整列することも可能にする。

;「 > 関数」を比較オペレータとして用い、リストを整列する #'>) → 

; リスト内のサブリスト中の最初の要素  に沿ってリストを整列する ' ')   ))) →   )<WtXmlEndTag />

3.3.1. 関数定義
-----------

defun マクロは関数を定義する。関数定義は名前と、引数の名前、そして関数本体で構成される。

 )

関数定義は、コンパイラに最適化設定や引数のデータ型を指定に関するヒントを与えるための 宣言や、en システムに対話的なドキュメンテーションを与えるためのドキュメンテーション文字列を含むことがある。

 "Calculates the square of the number x."    )) )

無名関数は lambda 式を用いて定義される。en 的なプログラミングスタイルでは、高階関数の引数として無名関数を使う場合が多い。

関数の定義や操作に関する多くのオペレータが存在する。たとえば、関数は compile によって再コンパイルされる場合がある。

3.3.2. 総称関数とメソッドの定義
-------------------

defgenericマクロは、総称関数を定義する。defmethodマクロはメソッドを定義する。総称関数はメソッドの集合である。メソッドはそのパラメータとして渡されたクラスやオブジェクトによって特定化される。総称関数が呼び出されると、マルチメソッドディスパッチにより、実際に使用されるメソッドが決定される。

)  ) )  ) )

 → "ZippyPinhead"

 → 5<WtXmlEndTag />

総称関数もファーストクラスのデータ型である。 総称関数やメソッドには上に記載したよりも、もっと豊富な機能が存在する。

3.3.3. 関数名前空間
-------------

関数名のための名前空間は、データ変数のための名前空間とは分離されている。これは en と en における主要な違いである。defun、flet そして labels のようなオペレータは関数名前空間へ名前を定義する。

他の関数への引数として関数名を渡す場合には、function スペシャルオペレータを使う必要がある。最初の sort 引数では、関数名前空間にシンボル > で定義された関数名を #'> というコードで参照している。

en の評価モデルはより単純で、単一の名前空間のみが存在し、引数部分だけでなくあらゆる位置で、評価順序を問わずフォームは評価される。この事が en と en のどちらかの方言で書かれたコードは、ときどき他方の経験を持つプログラマーを混乱させることになる。たとえば、en プログラマーの多くは list あるいは string といった説明的な変数名を使用する事を好むが、これらの名称は en ではローカルに関数名を上書きしてしまうという問題を起こすことになる。ただし、これには一長一短がある。名前空間が分かれているために、高階関数などに渡す関数の名前は、そのままではなく、関数の名前であることを明示する必要が発生してしまっている。

関数に独立した名前空間を持つ事が利点かどうかは、en コミュニティにおける論争の源となっている。この論争は一般に「en の議論」と言われる。この用語は リチャード・ガブリエル と ケント・ピットマン らによる二つの手法を広範囲にわたって比較した 1988 年の論文で作られた。

3.4. その他の型
----------

en が備えている他の型は以下の通り:

パス名 は ファイルシステム におけるファイルやディレクトリを表現する。en のパス名機能は、ほとんどのオペレーティングシステムのファイル命名規則より一般的なものであり、プログラムが様々なシステムを通してポータブルにファイルにアクセスする事を可能としている。
入出力ストリームは、端末や開かれているファイルのような、バイナリデータ、テキストデータの入力元と出力先を表現する。
en は組込みの 擬似乱数生成器を備えている。ランダムな状態オブジェクトは擬似乱数のソースとして再利用可能であり、ユーザーが乱数の種を与える事や、同じ数列を再生する事を許可している。
コンディションはエラーや例外、その他のプログラムが反応する可能性がある有意なイベントを表現するための型である。
クラスは第一級のオブジェクトである。そして、それ自身がメタクラスと呼ばれるクラスのインスタンスである。

4. スコープ
-------

他のプログラミング言語におけるプログラムと同様に、en のプログラムも変数や関数、その他の要素を参照するために名前を用いる。名前が参照するものは、スコープによって決定されている。

名前と、それが参照する実体との関係を束縛と呼ばれている。

5. マクロ
------

en系言語におけるマクロは、表面上は関数と同じように使われる。しかし、それは評価される式を表すというよりプログラムのソースコードの変形を表現している。

マクロはプログラマーに言語内に新しい構文フォームを作る事を可能とする。たとえば、このマクロは Perl のような言語で馴染みのある until ループのためのフォームを実現する。

 `  ,@body))

; 利用例 0) )

; 定義したuntilのマクロ展開 0) )) →   0)) ) T<WtXmlEndTag />

すべてのマクロは、内に含むソースコードが評価、あるいはコンパイルされるよりも前に必ず展開される。マクロは抽象構文木を受けとり、それを変更して返す関数だと考えることができる。これらの関数は、最終的なソースコードを生成するために評価器やコンパイラよりも前に呼び出される。マクロは通常の en で記述され、任意の en オペレータを使うことができる。 上の例で使用されているバッククォート記法は一般的なコードテンプレートへの代入を単純化するために　en によって提供されているものである。

6. en
-----

en は オブジェクト指向プログラミング のための道具として、enを備えている。これは、現在利用可能な言語の中で、もっとも強力なオブジェクトシステムの一つである。1984年当初のCommon Lispには含まれていなかったが、後にen の en 標準規格の一部となった。en や en のような静的な言語のオブジェクト指向機能とは根本的に異なった動的オブジェクトシステムである。

7. 他の LISP 系言語との比較
------------------

en と最も頻繁に比較対照されるのが en である — これら二つは最も有名な en系言語だからだ。en は en よりも古く、同じ en の伝統から生みだされただけでなく、同じエンジニアのガイ・スティール・ジュニアが en 委員会の議長を務めた。

以前の多くのLispの方言や実装とは異なり、Common Lisp は Scheme と同様な、スコープは静的スコープのみを基本とする仕様である。

Lisp Machine Lisp や MACLISP といった Common Lisp の設計に寄与した実装の多くは、インタプリタでは動的スコープを、コンパイラでは静的スコープ、という挙動になっていた。Schemeはそういったものとは異なり、静的スコープのみであった。Common Lisp は動的スコープをもサポートしているが、明示的な special 宣言が必要である。ANSI Common Lisp のインタプリタとコンパイラの間にはスコープに関しての相異点は全く存在しない。

時々、en は「en」、en は「en」と呼ばれることがある。これは en が関数名と変数名にそれぞれ独立した名前を備えている事に起因した名前である。しかし、実際には en は go タグやブロック名、loop キーワードなど多くの名前空間を持っているし、マクロをうまく使えば、構文的に名前空間を追加することも出来る。複数の名前空間に関するトレードオフについて、en と en のそれぞれを支持する論争が長いあいだ行われている。en では変数名と関数名の衝突を避ける必要があるため、en の関数はよく lis や lst、lyst といった関数名と衝突しないような引数名を取ることになる。一方 en では引数として使う場合に、明示的に関数の名前空間を参照する必要がある。これは上にでてきた sort のサンプルのように一般的なことである。

en はまた、真偽値の扱いが en とは異なっている。en は真と偽の表現として #t と #f という特別な値を用いている。en は、より古い en系言語の伝統に従ってシンボルの t と nilを使っている。en においては、if のような条件式において任意の nil でない値が真として扱われる。このことは、いくつかのオペレータが述語として働くと同時に、後の計算に使うための有意な値を返すものとして動作する事を可能としている。

en の標準規格は 末尾再帰の最適化 を要求しているが、en の規格はしていない。ほとんどの en 実装は末尾再帰の最適化を提供するが、それでもプログラマーが最適化宣言を使った場合のみである場合が多い。それにも関わらず、一般的な en のコーディングスタイルは en スタイルで好まれるようなあらゆる場合に再帰を使うというやり方とは異なっている。en プログラマが末尾再帰で表現するものを、en プログラマーは do、dolist、loop等の反復構文で表現する。

8. 実装
-----

en は、唯一の実装により規定されるものではなく、en やC言語のように仕様によって規定されている。

実装は、標準規格でカバーされていない機能を提供するライブラリとともに配布される傾向がある。そのような追加機能をポータブルに利用可能とする フリーソフトウェア ライブラリが作成されている。最も顕著なものが、[3] や [4] プロジェクトである。

en の評価器は式を評価する前にコンパイルする所謂インクリメンタルなコンパイラとして実装が可能なように設計されている。関数のインライン展開のような最適化コンパイルのための標準的な宣言も言語規格内で規定されており、多くの en 実装は関数を機械語へとコンパイルする。また、性能では劣るが、バイトコードへとコンパイルする処理系も存在する。また、コンパイル済みのコードとコンパイルされていないコードを混交させても動作に差異がないように言語が設計されているためインタプリタを搭載する処理系でもコンパイラのみ搭載の処理系と動作に違いがない。

en のような、en 上で動くいくつかの実装は、システムが en やenシェルインタプリタを透過的に呼び出すのと同様に スクリプトのインタプリタとして使うことができる。

8.1. 処理系
--------

8.1.1. 再配布可能な実装の一覧
------------------

en 後述のCMUCL から分岐して保守性を大幅に強化した処理系であり、現在通常のx86コンピュータで最も使用されている実装の一つ。SBCL は、REPLから入力された評価式であっても、インタプリタを介さず全てネイティブコードにコンパイルしてから実行する。CMUCL譲りのコンパイラにより非常に強力な最適化を行うことが出来、生成するコードはC言語のコードを上回ることもある。SBCL は、CMUCL が動作するプラットフォームに加えて、en、en、en 上でも動作する。ただし、HP-UX 上では動作しない。en フリー の処理系であり、SBCLと並んで使用されている実装。祖先はMacintoshをプラットフォームとするMacintosh Common Lispという商用の処理系であったが、他のOSプラットフォームへオープンソースとしてフォークされるようになり混同を避けるためClozure CLと改名した。その歴史のため、Mac OS の Cocoa API との連携に強みをもつほか、ファイルの遅延ローディング、デバッグメッセージのわかりやすさなどの特色を持つ。現在は en、en、enen に移植されている。en 後述のGCLから派生した、C言語で作成されたプログラムに組み込むために設計された処理系である。lispコードはCのコードに変換された上でコンパイル実行されるので、最低限のCコンパイラしか提供されていない組み込み機器などの環境でも、クロスコンパイルにより利用することが出来る。また、C言語の高速性も受け継いでいる。en en仮想マシン上で動作する実装である。同マシンのJavaバイトコードへのコンパイラを備えており、en プログラムから en のライブラリにアクセスする事が可能。この処理系は en のコンポーネントであるが、単独で利用する事もできる。近年もアクティブに開発されている。en カーネギーメロン大学 で開発された実装を起源とする。現在はボランティアグループによりメンテナンスされる。Pythonと呼ばれる高速なネイティブコードコンパイラの起源となった実装である。en x86 上の en や BSD、en 上の
en、en、en、HP-UX、enを含むenなどで動作する。バイトコードコンパイラを備えた実装である。移植性に富み、多くの en や、en などの enに類似したシステム、および en、その他のオペレーティングシステムで動作する。en en から発展したGNUプロジェクトの製品である。完全な en 準拠ではないが、数学ツールの en や en、en などを含むいくつかの大規模なプロジェクトで採用されている。この処理系は 11 の異なるアーキテクチャ上の en で動作し、en や en、en でも動作する。en デジタルツール社製の処理系である。MCL 5.2 からオープンソース化され、後に上記Clozure CLとなった。en 上の en で動作する。x86 アーキテクチャ用の処理系であり、オペレーティングシステムに依存しない。en を備えたバージョンが存在する。en は en と en、en を備えており、複数の言語を混在させたプログラミングが可能である。また、全ての言語が逐次的にコンパイルされる。コンパイラと通信する en に類似のエディタが統合されている。en の大半をサブセットとして実装した en のライブラリである。Windows用の統合開発環境。コーマン・テクノロジーズによる商用処理系だったが、2015年にオープンソース化

8.1.2. 商用の実装
------------

Franzによる処理系。LispWorksによる処理系。Scineneerによる処理系。

9. 著名なアプリケーション
--------------

9.1. 政府機関、非営利団体での利用
-------------------

ハッブル宇宙望遠鏡 運用管理のためのプランニング・スケジューリングシステム。 角度変更や、指定地点の撮影などのさまざまな指令を、燃料や希望時間帯など多様かつ複雑な制約のもとで、最適にスケジューリングする。en NASA Deep Space 1 に搭載された、自己修復・監視用人工知能。NASA Ames Research Center および NASA JPLによって開発された。人間の監視なしで探索機を航行させるための自律エージェント。多数のコンポーネントからなるが、その主要な3つは、EUROPA、EXEC、Livingstoneである。1999年度の en ソフトウェア・オブ・ジ・イアー賞を受賞した。

9.2. 商用
-------

Yahoo! ストア:en:Viawebにより作成され、後にYahoo!に買収された。誰でも簡単に使えるウェブストア作成サービスを提供し、顧客の作ったウェブサイトで他のユーザが買い物をするという、史上初めてのアプリケーションサービスプロバイダである。後に C++ と Perl で書き直された。ポール・グレアムによればその実態は「C++でLispインタプリタを書いた」というようなものだった、という。ジャック×ダクスター,クラッシュ・バンディクー等ノーティードッグによるPlayStation、PlayStation 2 用のビデオゲーム。クラッシュ・バンディクーはGOOL、ジャック×ダクスターはGOOLを機能的に拡張した全く別の言語Game Oriented Assembly Lispによって実装されている。これらは、プレイステーションらの特殊なプロセッサ事情に合わせた自作コンパイラを含んでいる。D-Wave 1 量子計算機D-Wave Systems による量子計算機。ホストOSがCommon Lispで作成されている。ただし、利用者向けのインターフェースはPython APIである。求人ページにおいても、Common Lispのプログラミング経験を求人要件としてあげている。Orbitz:en:ITA Softwareによって開発された、有名な旅行予約サイト。ITA Software は2011年に Google に買収され、一部門となっている。旅行予約には、莫大な数の可能な経路の中から高速に最短・最安の路線を選択する知的探索アルゴリズムが必要であり、そのためにLispが用いられている。Miraiイズウェア社の製品で、統合された 2D/3D コンピュータグラフィックス作成環境である。ポリゴンモデラー、先進的な IK/FK ノンリニアアニメーションシステム、2D/3D ペインティングなどを備えていた。動画やビデオゲーム、軍事シミュレーションの世界では有名である。Piano飛行機のスケジュール設計や競合との比較のためのシステム。Xanalys警察によって使われている世界的なセキュリティや詐欺防止サービスのための原因調査用ソフトウェア。ICAD
ナレッジ・テクノロジーズ・インターナショナル社製の機械設計ソフトウェア。General-purpose Declarative Languageジェンワークス・インターナショナル社の製品。ウェブベースのエンジニアリング、デザイン、ビジネスアプリケーション作成用開発ツールであるIgor Engraver音楽記譜用プログラム。

9.3. オープンソース
------------

代数的数式処理エキスパートシステム。GPL で公開されており、自由に入手することができる。微分方程式や不定積分のように解が式であるものは、人間が解くのと同じように、式の形で解を返すことができる。Richard Fateman教授によって作成されたMacsymaの、Common Lisp 上の再実装である。ACL2定理証明用のシステム複雑な音楽構造を自然なやり方で表現する事を可能とした言語。Lisa知的エージェント作成のためのルールベースのプロダクションシステム。

10. 注釈
------

11. 出典
------

12. 参考文献
--------

[5]
『en 原書第3版 I』 著者：P.H. ウィンストン、B.K.P. ホーン 訳：白井 良明、井田 昌之、安部 憲広 - ISBN 4563014648
『en 原書第3版 II』 著者：P.H. ウィンストン、B.K.P. ホーン 訳：白井 良明、井田 昌之、安部 憲広 - ISBN 4563014656
『en 入門』 著者：湯浅 太一、萩谷 昌己 - ISBN 978-4000076852
『COMMON LISP - COMMON LISP 言語仕様書』 著者：Guy L. Steele Jr. 共立出版 - COMMON LISP の第1版 - ISBN 4320022718
『en 第2版』 著者：ガイ・スティール・ジュニア、井田 昌之 共立出版 - en 以前の en 規格書 CLtL2 - ISBN 4320025881
『en』 著者：ポール・グレアム、訳：久野 雅樹,須賀 哲夫 - en を使ったプログラミングの解説書。付録Cに Common Lisp 第1版、第2版とそれ以降の変更点が掲載されている。 - ISBN 4894714337
『入門 en — 関数型4つの特徴とλ計算』 著者：新納 浩幸 - ISBN 4839920818
『en』
『en』 著者：ポール・グレアム、訳：野田 開 - ISBN 978-4274066375
『実践 en』 ペーター・ザイベル著、佐野匡俊・水丸淳・園城雅之・金子祐介 共訳 - ISBN 978-4274067211

13. 外部リンク
---------

name=Welcome to Common-Lisp.net!}} 公式ウェブサイト
[6] — en に関するフリーソフトウェアについての掲示板
[7]
[8] — en に関するすべての情報のリポジトリ
[9] ダウンロード可能な en の本の一覧
[10]
[11] — 有用なプログラミング手法のコレクション
[12] — XML との比較によるエッセイ
[13] — en に関する興味深いリソースを多数含んでいる
[14] — 和訳版が訳者により公開されている。

13.1. 入門書
---------

[15] — コリン・アレンとマネーシ・ダーガトによる解説
[16] — 初心者向け、オンラインで利用可能
[17] — en の導入向け漫画