完整的emacs and lisp的學習集合整理如下:
https://github.com/GreyZhang/g_lisp
繼續學習lisp,接下來看一下一個列表的拆分宏destructuring-bind。
上面的函數中,成功拆分了一個列表並且計算出來了列表元素的和。
如果把中間的信息打印出來,或許能夠看得更明確一點。
傳入參數nil,提示不符合lambda列表參數。
傳入參數比較多的時候,也出現了錯誤提示,提示有額外的參數,不符合lambda list。
做一下修改,增加可選參數。但是,此時如果不傳入參數依然會報錯。
傳入空列表肯定也是錯誤的,因爲解構的過程中其實要求至少有一個參數。
不過,此時如果傳入一個參數,是沒有問題的。剩下的一個可選的參數,默認爲nil。
如果傳入的是3個參數,也是沒有問題的。第一個參數被拆分賦值爲a,剩下的一個list綁定到了b。
從上面的例子看,解構拆分其實能夠很強大,但是解構傳入的參數格式必須是與設計相同的。
如果出現可能的類型不統一會發生什麼情況呢?那麼可能會出現有些元素的拆分不徹底,類似上面,我們打算拆分出來一個獨立的元素,但是卻按照傳入的格式得到了列表。中間,少了一個拆分獲取的過程。
回到原來的設計,再次做一個測試。遇到了一個似乎很熟悉的問題,參數太多了。其實,換一個思維模型,完全是可以理解爲類型不匹配。如何做一下修改增加兼容性呢?
其實,還是前面學到的lambda列表的一個小技巧。
如果不做忽略,直接把d的信息打印出來,可以看得出d是一個list。這種情況下,在b所在的列表增加更多的元素也不會破壞這個匹配模式。
完整的emacs and lisp的學習集合整理如下: