複製鏈接
請複製以下鏈接發送給好友

S-表達式

鎖定
S-表達式在Lisp中既用作代碼,也用作數據(見McCarthy Recursive Functions of Symbolic Expressions )。S-表達式原本被用於將被M-表達式處理的數據,但Lisp的首個實現是一個S-表達式的解釋器,以S-表達式編碼M-表達式,而Lisp程序員很快習慣於對代碼和數據都使用S-表達式。
中文名
S-表達式
外文名
s-expression
適用領域
數據、計算機程序
所屬學科
計算機科學

目錄

S-表達式概念

所謂“S-表達式/運算式”或“sexp”(其中“S”代表“符號的”),是指一種以人類可讀的文本形式表達半結構化數據的約定。S-表達式可能以其在Lisp家族的編程語言中的使用而為人所知。其他應用則見於由Lisp衍生的語言,如DSSSL,以及如IMAP之類通信協議中作為標記出現和約翰·麥卡錫的CBCL。語法細節和所支持的數據類型雖因語言而異,但這些語言間最通用的特性則是使用S-表達式作為括號化的前綴表示法(有時亦作劍橋波蘭表示法)。
S-表達式可以是如數字這樣的單個對象,包括特殊原子nil和t在內的LISP 原子,或寫作 (x . y)的cons pair。更長的列表則由嵌套的cons pair組成,例如(1 . (2 . (3 . nil)))(,亦可寫作更易理解的(1 2 3))。
使用前綴表示法,程序代碼可寫作S-表達式。書寫Lisp程序中額外的語法糖則是,一般的表達式(quote x)可以省略為'x。
Common Lisp範例:
(defun factorial (x)
(if (zerop x) 1
(* x (factorial (- x 1)))))
Scheme範例:
(define (factorial x)
(if (zero? x) 1
(* x (factorial (- x 1)))))

S-表達式標準化

1997年5月,Ron Rivest 提交了一份 Internet-草案 ,擬作為RFC出版。該草案定義了基於Lisp S-表達式的語法,但旨在用於一般目的的數據存儲及交換(類似XML)而非僅限於編程。儘管未被批准為RFC,但此草案已被其他RFC(如RFC2693)和數種出版物[3]引用。最原始的用途則是在SPKI中。
Rivest的格式定義了S-表達式為一個八位元組-串(一系列字節)或其他S-表達式的有限列表。此定義描述了三種表達這種結構的互換格式。一種為“advanced transport”——以格式而言具有很大彈性,且語法上近似於Lisp-風格表達式,但並不等同。例如,advanced transport允許八位元組-串逐字表示(串的長度後跟隨一分號及整個原始的串),引號形式允許轉義字符,十六進制,Base64,或者在滿足一定條件時直接作為“token”。(Rivest的token與Lisp token不同之處在於前者僅僅為了方便與審美,像其他字符串一樣對待,而後者有特別的語法意義。)為了更為緊密,更便於語法分析,獨立於任何抽象的S-表達式,另一種交換格式“canonical presentation”僅允許逐字表示的字符串,格式上禁止字符串以外的空白。