247_emacs lisp函数设计小结2
完整的common lisp的学习集合整理如下:
https://github.com/GreyZhang/g_lisp
继续学习emacs,继续学习lisp,继续学习emacs lisp。之前的函数设计小结是在学习common lisp的时候学到的,这一次在emacs lisp的环境中重新学习一下。把之前并没有掌握的这个技能熟悉一下。
这一次的学习,我将会使用eilmde的环境。
上面定义了一个函数,做一个简单的加法。右边是ielm的环境,看得出这个环境的便捷性。同时,又弄清楚了一个ielm的功能,向上的箭头可以快速输入历史输入信息。接下来,再做几个测试:
从上面的测试看,过多或者过少的参数都会导致函数执行失败。
重新尝试设计一个函数,并测试,具体如下:
从上面的结果看,test-1可以接受1个参数,也可以接受两个参数。这样的话,这个函数的通用性就更好了。不过,这种优化在有的情况下并不奏效。比如,我们的设计修改如下,并增加测试:
为什么呢?因为没有传入的参数y的绑定为nil,这样进行加法运算的时候就会失败。如何做一个改进呢?那就是给y一个默认值。
我查了一下emacs lisp的手册,没有找到类似common lisp或者python可以直接在参数列表实现默认值的方法,但是通过简单的判断设计我们也能够很容易实现一个默认值的功能。
不过,这样的函数只能够首先接收有限数目的参数。接下来,我们尝试设计一个可以接收任意数目参数的函数。设计以及测试如下:
必要的参数以及&REST其实也是可以组合使用的,接下来做编码以及测试如下:
第一个错误是我故意制造的,就是为了验证必要参数的必要性。第二个是我输入错了,看起来对于基础知识的熟练程度还是有必要再提升下。从一些网络教程中看到一个编码的信条:尽管&optional以及&rest是允许一起使用的,但是在软件的设计的过程中千万不要这么做!
除了上面的几种常见函数形式,还有一个是带有键值对特性的函数。这个在python中也是见得到的,不过这个似乎只是存在于common lisp中,在elisp的文档中我搜索了相应的关键词没有找到。看起来,elisp在工作的复杂度上或许是没有common lisp那么庞大的。
完整的common lisp的学习集合整理如下: