簡單的 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)
))