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

发布了891 篇原创文章 · 获赞 170 · 访问量 176万+

猜你喜欢

转载自blog.csdn.net/grey_csdn/article/details/104487185