S式


S-expression
コンピュータプログラミング、S-発現(又はシンボリック表現と略記、sexpr又はS式)のネストされたために同じような名前の表記法で表現であるリスト(ツリー-structured)データ。S式はプログラミング言語Lispのために発明され、普及しました。Lispは、S式をデータだけでなくソースコードにも使用します。
S式を表す
ツリーデータ構造(* 2 (+ 3 4))
通常の括弧内の構文のLispの、S-発現は、古典的に定義されているとして
原子、または
表現形のX及びYがS式です。(x . y)
この定義は、LISPによるリストの一連の「セル」としての表現を反映しており、それぞれが順序対になっています。プレーンリストでは、yは次のセル(存在する場合)を指し、リストを形成します。定義の再帰句は、この表現とS式表記の両方が任意の二分木を表すことができることを意味します。ただし、表現は原則として循環参照を許可できます。この場合、構造はツリーではなく循環グラフであり、相互参照の規則が追加されない限り、S式表記で表現することはできません(SQLに 類似)外部キー、XML IDREFなど)。
アトムの定義はコンテキストごとに異なります。John McCarthyによる元の定義では、「単一の空白が埋め込まれた大文字のラテン文字と数字の文字列」(文字列と数値リテラルのサブセット)として表される「識別可能な原子記号の無限のセット」が存在すると想定されていました。)。
最新のsexpr表記では、より一般的な引用符で囲まれた文字列(句読点や完全なUnicodeを含む)が許可され、省略表記を使用して3つ以上のメンバーを持つリストを表します。(x y z)
を意味する(x . (y . (z . NIL)))
NILは特別なリストの終わりのオブジェクトです(または()、Scheme で唯一の表現であると書かれています)。
プログラミング言語のLispファミリでは、S式はソースコードとデータの両方を表すために使用されます。S式の他の用途は、以下のようなLispの由来言語であるDSSSL、およびなどのマークアップでの通信プロトコルなどのIMAPとジョン・マッカーシーさんCBCL。WebAssemblyのテキスト表現としても使用されます。構文の詳細とサポートされているデータ型は言語によって異なりますが、これらの言語で最も一般的な機能は、S式とプレフィックス表記の使用です。

コンテンツ
1 データ型と構文
2 Lispでの使用
2.1 データのS式の例 2.2 ソースコードのS式の例
3 構文解析
4 標準化
4.1 リベストの変種
5 も参照してください
6 参考文献
7 外部リンク

データ型と構文
S式形式には多くのバリエーションがあり、さまざまなデータ型に対してさまざまな異なる構文をサポートしています。最も広くサポートされているのは次のとおりです。
リストとペア:(1 () (2 . 3) (4))
記号:with-hyphen ?@!$ a symbol with spaces
文字列:”Hello, world!”
整数:-9876543210
浮動小数点数:-0.0 6.28318 6.022e23
文字#は#x10、16進整数や#C文字など、構文の拡張子の前に付けるためによく使用されます。

Lispでの使用
Lispでソースコードを表す場合、S式の最初の要素は通常、演算子または関数名であり、残りの要素は引数として扱われます。これは「接頭辞表記」または「ポーランド記法」と呼ばれます。一例として、ブール書かれた表現4 == (2 + 2)でCは、として表される(= 4 (+ 2 2))LispのS-exprのベースプレフィックス表記です。
上記のように、「アトム」の正確な定義は、LISPのような言語によって異なります。引用符で囲まれた文字列には通常、引用符以外のものを含めることができますが、引用符で囲まれていない識別子アトムには、通常、引用符、空白文字、括弧、角かっこ、中括弧、円記号、セミコロン以外のものを含めることができます。いずれの場合も、禁止されている文字は通常、前に円記号を付けてエスケープすることで含めることができます。Unicodeのサポートはさまざまです。
s-expr定義の再帰的なケースは、従来、consセルを使用して実装されていました。
S式はもともとM式によって操作されるデータのみを対象としていましたが、Lispの最初の実装はM式のS式エンコーディングのインタープリターであり、Lispプログラマーはすぐに両方のコードにS式を使用することに慣れました。およびデータ。これは、Lispが同像性であることを意味します。つまり、プログラムの主要な表現は、言語自体のプリミティブ型のデータ構造でも

データのS式の例
ネストされたリストはS式として記述できます。((milk juice) (honey marmalade))は2要素のS式であり、その要素は2要素のS式でもLisp(および)で使用されている空白で区切られた表記法が一般的です。改行(改行文字)は通常、区切り文字としての資格が
これは、S式(Gazdar / Melish、Lispでの自然言語処理)として記述された英語の小さなサブセットの単純な文脈自由文法です。ここで、S =文、NP =名詞句、VP =動詞句、V =動詞です。 :(((S ) (NP VP )) ((VP ) (V )) ((VP ) (V NP )) ((V ) 死亡) ((V ) 雇用) ((NP ) 看護師) ((NP ) 患者) ((NP ) Medicenter ) ((NP ) “Dr Chan” ))

ソースコードのS式の例
プログラムコードは、通常はプレフィックス表記を使用してS式で記述できます。
Common Lispの例:(関数定義 階乗 (X ) (もし (zerop X ) 1 (* X (階乗 (- X 1 )))))
S式は関数READを使用してLispで読み取ることができます。READは、S式のテキスト表現を読み取り、Lispデータを返します。関数PRINTを使用して、S式を出力できます。印刷されたすべてのデータオブジェクトが読み取り可能な表現を持っている場合、出力は関数READで読み取ることができます。Lispには、数値、文字列、記号、リスト、およびその他の多くのデータ型の読み取り可能な表現がプログラムコードは、関数PPRINT使用かなりプリントS式としてフォーマットすることができる(注:つのPSと、略してかなり-print)。
Lispプログラムは有効なS式ですが、すべてのS式が有効なLispプログラムであるとは限りません。(1.0 + 3.1)は有効なS式ですが、有効なLispプログラムではありません。これは、Lispがプレフィックス表記を使用し、浮動小数点数(ここでは1.0)が演算(式の最初の要素)として無効であるためです。
のように’x、前に単一引用符が付いたS式は、引用符で囲まれたS式の構文糖衣構文です(この場合は)。(quote x)

構文解析
S式はXMLと比較されることがよく主な違いは、S式には1つの形式の包含、点線のペアしかないのに対し、XMLタグには、それぞれ異なる構文を使用する単純な属性、他のタグ、またはCDATAを含めることができることです。単純なユースケースの場合、S式はXMLよりも単純ですが、より高度なユースケースの場合、XMLには、XPathと呼ばれるクエリ言語、多くのツール、およびXMLデータの処理を簡素化するサードパーティライブラリが

標準化
一部のLisp派生プログラミング言語の標準には、S式構文の仕様が含まれています。これらには、Common Lisp(ANSI標準文書ANSI INCITS 226-1994(R2004))、Scheme(R5RSおよびR6RS )、およびISLISPが含まれます。

リベストの変種
参照:
正規のS式
1997年5月、Ron Rivestは、RFCとしての公開を検討するためのインターネットドラフトを提出しました。ドラフトでは、Lisp S式に基づいて構文を定義しましたが、特にプログラミングではなく、汎用のデータの保存と交換(XMLと同様)を目的としています。RFCとして承認されることはありませんでしたが、その後、他のRFC(RFC 2693など)や他のいくつかの出版物で引用され、使用されています。元々はSPKIでの使用を目的としていました。
リベストの形式では、S式をオクテット文字列(一連のバイト)または他のS式の有限リストとして定義しています。この構造を表現するための3つの交換形式について説明します。1つは「高度なトランスポート」です。これはフォーマットに関して非常に柔軟性があり、構文的にはLispスタイルの式に似ていますが、同一ではありません。たとえば、高度なトランスポートを使用すると、オクテット文字列を逐語的に表すことができ(文字列の長さにコロンと生の文字列全体が続く)、エスケープ文字、16進数、Base64を許可する引用形式、または「トークン」として直接配置することができます。特定の条件を満たす。(RivestのトークンはLispトークンとは異なり、前者は利便性と美学のためだけであり、他の文字列とまったく同じように扱われますが、後者は特定の構文上の意味を持っています。)
リベストの草案は、「デジタル署名の目的で」標準的な表現を定義しています。これは、コンパクトで、解析が容易で、抽象的なS式に対して一意であることを目的としています。逐語的な文字列のみを許可し、文字列の外側のフォーマットとして空白を禁止します。最後に、「基本的なトランスポート表現」がこれは、標準形式またはBase64と同じようにエンコードされ、中括弧で囲まれています。後者は、間隔が変更される可能性のあるシステム(電子メールなど)で正規にエンコードされたS式を安全に転送することを目的としています。 80文字幅の行があり、それより長い行をラップするシステム)。
この形式は、SPKIの外部での使用に広く適合されていません(一部のユーザーはGnuPG、libgcrypt、Nettle、およびGNU lshです)。RivestのS式Webページは、パーサーとジェネレーター(MITライセンスの下で利用可能)のCソースコードを提供します。これらは、他のプログラムに適合させて埋め込むことができます。さらに、フォーマットを独立して実装することに制限はありません。

も参照してください
短所CARとCDR Fexpr
ラムダ計算 M式 正規のS式
データシリアル化形式の比較

参考文献
^ ジョンマッカーシー(1960/2006)。シンボリック式の再帰関数 WaybackMachineで2004-02-02にアーカイブされました。もともとはCommunicationsof theACMで公開されました。
^ 「アルゴリズム言語スキームに関する改訂^ 5レポート」。schemars.org。
^ Sperber、Michael; Dybvig、R。ケント; Flatt、Matthew; Van Straaten、アントン; ファインドラー、ロビー; マシューズ、ジェイコブ(2009年8月12日)。「アルゴリズム言語スキームに関するRevised6レポート」。機能プログラミングジャーナル。19(S1):1–301。CiteSeerX 10.1.1.372.373。土井:10.1017 / S0956796809990074。   ^ S式、ネットワークワーキンググループ、インターネットドラフト、1997年11月4日まで有効-R。Rivest、1997年5月4日draft-rivest-sexp-00.txt、Ronald L. Rivest、CSAILMITウェブサイト ^ rivest sexp、Google Scholar(検索)
^ 「SEXP(S式)」。people.csail.mit.edu。

外部リンク
sfsexpGitHub上のC / C ++用の小さくて高速なS式ライブラリ
minilisp、レオン・ボトゥー作。
RosettacodeのS式には、多くの言語でのリーダーとライターの実装が