簡單的 S 表達式

S 表達式是 LISP 的語法, 無意間發現可以用極簡單的語法, 表現出一般程式語言所有的結構。

把元素用空格隔開,像 print apple banana ; 第一個會被當作函數呼叫,其餘會當作函數的參數。 然後可以用括號改變優先權, print (to-upper-case apple)

再加上一種資料結構 list , 但語法一樣是 (apple banana carrot) , 為了避免被當作函數呼叫, 所以要 quot ,寫成 quot (apple banana carrot) , 或是簡寫成 '(apple banana carrot)

發現了嗎? S 表達式的特性就是 可以是語法,也可以是資料, 結構是一樣的。 這造成了 lisp 極為彈性, 接受的參數也是一個 S 表達式, 可以對他求值或當作列表處理。

所以多數流程控制, 在 lisp 中也都是函數或巨集。 像 if 可以這樣寫: (if yes '(print yes) '(print no)) 。 第一個是判斷式,若為真, 則求值第二個參數, 若為假,則求值第三個參數。

但也因此 lisp 不能用一般的縮排規則。 大部份的作法是直接以程式的流程結構排, 而不要為函數和參數縮排,在閱讀時忽略括號。

(
    if
        yes
        '(print yes)
        '(
            if
                no
                '(print yes)
                '(print no)
         )
)


(if yes
    '(print yes)
'(if no
    '(print yes)
    '(print no)
))