![cover image](https://wikiwandv2-19431.kxcdn.com/_next/image?url=https://upload.wikimedia.org/wikipedia/commons/thumb/6/6c/Corrected_S-expression_tree_2.svg/langja-640px-Corrected_S-expression_tree_2.svg.png&w=640&q=50)
S式
ウィキペディア フリーな encyclopedia
コンピュータプログラミングにおいて、S式[注 1](S-expression)はネストしたリスト(木構造)のデータである。
![]() |
![](http://upload.wikimedia.org/wikipedia/commons/thumb/6/6c/Corrected_S-expression_tree_2.svg/640px-Corrected_S-expression_tree_2.svg.png)
(* 2 (+ 3 4))
S式は、プログラミング言語Lispのために考案され、普及した。Lispでは、データだけでなく、ソースコードにもS式を使用する。
Lispの括弧書き文法では、S式は典型的には次のように定義される。
- アトム
- xとyがS式であるとき
(x . y)
という形式の式
この定義は、Lispがリストを一連の「セル」として表現していることを反映したもので、それぞれが順序付けられたペアになっている。一般的なリストでは、yは次のセル(もしあれば)を指し、リストを形成する。定義の再帰は、この表現とS式記法の両方が、任意の二分木を表現できることを意味する。
最近のほとんどのsexpr記法では、より一般的な引用文字列(例えば、句読点や完全なUnicodeを含む)を許容しており、おおまかには次のように定義される。
- アトムや、データオブジェクトのリテラルはS式である
- 空リストを表す
nil
(Common Lisp)または()
もS式である(Schemeでは空リストはnil
で表さない) - xとyがS式のとき
(x . y)
のように、ドットで区切られたペアもS式である - それぞれがs式であるx, y, zの連結リストの形をした
(x . (y . (z . ())))
を(x y z)
のように、また(x . ())
を(x)
のように、省略した記法もS式である - その他の糖衣構文。たとえば
(quote foo)
を'foo
など
アトムの定義は文脈によって異なるが、ジョン・マッカーシーによるオリジナルの定義[1]では、「区別可能なアトミックなシンボルの無限の集合」が存在すると仮定されており、「1つの空白が埋め込まれた大文字のラテン文字と数字の文字列」として表されていた(文字列と数値リテラルの部分集合)。
Lisp系のプログラミング言語では、ソースコードとデータの両方を表現するためにS式が使われている。S式は他にもDSSSLなどのLisp由来の言語や、IMAPやジョン・マッカーシーのCBCLなどの通信プロトコルのマークアップとしても使われている。また、WebAssemblyのテキスト表現としても使われている。構文の詳細やサポートしているデータ型は言語によって異なるが、これらの言語に共通する特徴は、S式と前置記法を使っていることである。