表示式應該優於語句:這才是程式語言設計的更簡單方式!
- 有些程式語言(如 Lisp 和 OCaml)只有返回值的表示式,
- 而其他程式語言(如 Java 和 Python)既有表示式,也有不帶返回值的語句。
這種區分帶來了問題:
- 不能自由地在需要表示式的地方使用語句,反之亦然
- 需要不斷進行上下文切換和語法改變。(上下文切換類似讓你開不同型別的會議,類似讓CPU做執行緒上下文切換)
表示式和語句之間的區別使事情變得更加複雜:
- 因為你不能隨意在需要表示式的地方使用語句,反之亦然。
- 在重構程式碼時需要進行上下文切換和語法修改。這也就是說:重構比重寫更危險,重構不如重寫,因為你以為你瞭解了上下文,你以為你你瞭解了大象,其實你摸的是耳朵,然後,你就在耳朵這個上下文裡重構大象,雙倍複雜。
兩種語句的問題:
- 函式則帶來了更多的複雜性,因為其主體是語句而不是表示式,從而破壞了參照的透明度。
- 使用 try/catch 進行異常處理也有問題,因為它通常只能作為語句而非表示式使用。
總之,表示式和語句之間的區別以及對語言結構的不一致處理,使程式設計變得更加困難和容易出錯。
語言設計者的認知偏見:
- 繫結和迭代等語言構造常常被語言設計者任意指定為語句或表示式,這是基於實現的方便性而非語言設計原則。
好的語言設計應該:
- 讓所有語言結構都成為返回值的表示式,就像在 Lisp 和 OCaml 中那樣,避免表示式/語句之分帶來的複雜性。