在計算機程式設計領域,S-表達式(或稱為符號表達式)是一種用於嵌套列表(樹狀結構)數據的表達方式。S-表達式在Lisp程式語言中被發明並流行起來,該語言同時將S-表達式用作源代碼和數據的表示形式。
「S-表達式既可以表示數據,又可以表示程式碼,這使得Lisp的表達能力非常靈活。」
S-表達式的通常語法是用括號來構建,定義為類似於「x」的原子,或是「(x . y)」的形式,其中x和y都是S-表達式。這個定義反映了Lisp將列表表示為一系列“單元”的方式,每個單元是一個有序對。
這樣的結構使得S-表達式能夠表示任意二叉樹。儘管如此,S-表達式也可以允許循環引用,在這種情況下,這個結構就不再是樹,而是一個循環圖。在許多現代的Lisp方言中,如Common Lisp和Scheme,都提供了相應的語法來標記這些循環結構。
根據John McCarthy的原始定義,原子可以被視為一組可識別的符號。隨著時間的推移,現代的S-表達式標記法開始允許更廣泛的引號字符串,並且可以用簡短的符號表示多於兩個成員的列表。
「在Lisp語言家族中,S-表達式被用來表示源代碼和數據,這使得它們成為程式設計革命的核心。」
源於Lisp的語言繁多,各自支持不同格式的S-表達式語法,但它們共同的一個特徵是使用S-表達式和前綴表示法。當表示Lisp中的源代碼時,S-表達式的第一個元素通常是操作符或函數名,其餘的元素則被視為參數。
權威的前綴表示法利用的便是這一點,許多程式員以此進行了大量的代碼書寫。例如,在C語言中的布爾表達式「4 == (2 + 2)」在Lisp中的表示為「(= 4 (+ 2 2))」。
在具體的數據類型和語法方面,S-表達式格式有許多變種,支持不同數據類型的不同語法,包括列表和對、符號和字符串,甚至浮點數和整數。
「Lisp的自同構性意味著,程式的主要表示也正是語言自身的一種數據結構。」
解析S-表達式時,常常會將其與XML進行比較。不過,S-表達式只有一種容器形式,即點對,而XML標籤可以包含簡單屬性、其他標籤或CDATA,且使用不同的語法來實現。
雖然S-表達式對於簡單用例來說比XML要簡單,但在更高級的用例中,XML擁有像XPath那樣的查詢語言以及眾多工具和第三方庫來簡化數據處理。
隨著Lisp及其衍生語言的普及,標準化也隨之而來。諸如Common Lisp和Scheme的幾個方言都有其S-表達式語法的規範。Ron Rivest曾於1997年提出一份互聯網草案,意在基於Lisp S-表達式定義一般用途數據存儲與交換的語法。
雖然該草案最終未被批准為RFC,但其內容已被多個RFC以及其他出版物所引用並應用。這些標準的形成顯示了S-表達式在計算機科學中的重要性。
在當今的編程環境中,S-表達式已廣泛用於不同的應用領域,包括數據序列化標準等。值得注意的是,倫敦大學和邁阿密大學的趨勢分析指出,越來越多的開發者開始探索S-表達式的潛力,以增強其程式設計的靈活性與表達能力。
S-表達式不僅僅是一種表示法,它是Lisp語言的核心,代表了計算機編程中一種極具創新意義的結構。這樣的表示法,對於程式碼和數據所帶來的共通性應該給我們的未來帶來怎樣的啟示呢?