コンピュータ プログラミングにおいて、S 式 (またはシンボリック式) は、ネストされたリスト (ツリー構造) データを表現する方法です。 S 式は Lisp プログラミング言語で発明され、普及しました。Lisp プログラミング言語では、S 式がソース コードとデータ表現形式の両方として使用されます。
「S 式はデータとコードの両方を表現できるため、Lisp の表現は非常に柔軟になります。」
S 式の一般的な構文は括弧を使用して構築され、「x」のようなアトムとして定義されるか、「(x.y)」の形式で定義されます。ここで、x と y は両方とも S 式です。この定義は、Lisp がリストを一連の「セル」として表現する方法を反映しており、各セルは順序付けられたペアです。
この構造により、S 式で任意のバイナリ ツリーを表すことができます。ただし、S 式では循環参照も許可されます。その場合、構造はツリーではなく循環グラフになります。 Common Lisp や Scheme などの多くの最新の Lisp 方言では、これらのループ構造をマークするための構文が提供されています。
ジョン・マッカーシーのオリジナルの定義によれば、原子は認識可能な記号の集まりと考えることができます。時間の経過とともに、現代の S 式表記法では、引用符で囲まれた文字列の範囲が広くなり、2 つ以上のメンバーのリストをより短い表記法で表せるようになりました。
「Lisp 言語ファミリーでは、S 式はソース コードとデータを表すために使用され、プログラミング革命の中心となっています。」
Lisp から派生した言語は数多くあり、それぞれ異なる形式の S 式構文をサポートしていますが、それらすべてに共通する特徴の 1 つは、S 式とプレフィックス表記の使用です。 Lisp でソース コードを表す場合、S 式の最初の要素は通常、演算子または関数名であり、残りの要素は引数と見なされます。
標準的なプレフィックス表記法はこれを活用し、多くのプログラマーがこの方法で多くのコードを記述します。たとえば、C のブール式「4 == (2 + 2)」は、Lisp では「(= 4 (+ 2 2))」と表現されます。
特定のデータ型と構文に関しては、S 式形式には多くのバリエーションがあり、リストやペア、シンボルや文字列、さらには浮動小数点数や整数など、さまざまなデータ型に対して異なる構文をサポートしています。
「Lisp の自己同型性とは、プログラムの主な表現が言語自体のデータ構造であることを意味します。」
S 式を解析する場合、多くの場合 XML と比較されます。ただし、S 式にはドット ペアという 1 つのコンテナー形式しかありませんが、XML タグには単純な属性、他のタグ、または CDATA を含めることができ、そのためにはさまざまな構文を使用します。
単純なユースケースでは S 式は XML よりもシンプルですが、XML には XPath などのクエリ言語や、より高度なユースケースでのデータ処理を簡素化する多数のツールやサードパーティ ライブラリがあります。
Lisp とその派生言語の人気が高まるにつれて、標準化も進みました。 Common Lisp や Scheme などのいくつかの方言には、S 式の構文の仕様があります。 Ron Rivest は 1997 年に、Lisp S 式に基づいた汎用データ保存および交換の構文を定義するインターネット ドラフトを提案しました。
このドラフトは最終的に RFC として承認されませんでしたが、その内容は複数の RFC やその他の出版物で参照され、適用されています。これらの標準の形成は、コンピュータ サイエンスにおける S 式の重要性を示しています。
今日のプログラミング環境では、S 式はデータシリアル化標準を含むさまざまなアプリケーション領域で広く使用されています。ロンドン大学とマイアミ大学による傾向分析によると、ますます多くの開発者がプログラミングの柔軟性と表現力を高めるために S 式の可能性を探求し始めていることが示されています。
要約すると、S 式は単なる表記法ではなく、Lisp 言語の中核であり、コンピュータ プログラミングにおける非常に革新的な構造を表しています。コードとデータの共通性により、このような表現は私たちの将来にどのような啓蒙をもたらすのでしょうか?