273_common lisp列表拆分

完整的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的學習集合整理如下:

https://github.com/GreyZhang/g_lisp

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章