曾在网络上的文章中看到,说lisp能够提供较为完美的函数式编程体验。我还不是很熟悉什么叫做函数式编程,难道是所有的语言元素都能够理解为函数还是?或许我理解的片面也不对,但是从现在学习到的很多东西中能够看得出这一点。比如,之前学习的if分支,其实if在emacs lisp就是作为一个函数来处理的。当然,很多函数在我读common lisp的时候被表述为宏,两者究竟有什么差异呢?或许,我得需要很长的时间才能够弄明白。

         继续看之前学习的配置文件:

204_emacs lisp与或非操作_c语言

         还是这一段,但是这次我们关注not。

         接下来,学习小结一下emacs lisp中的取反操作。前面学习了if,这个操作在C语言中算是一个较为简单的语言元素,称之为操作符。但是在emacs lisp中,这个行为看上去是一个函数。而帮助查找的方式,也是可以通过查找函数帮助的方式来找到相应的帮助信息。Emacs lisp中取反功能为not,行为跟if的使用还是很相似的,看上去都是像一个函数的调用。但是,从函数的帮助中却搜索不到。于是,我查看了一下elisp的官方文档,找到了信息如下:

204_emacs lisp与或非操作_emacs_02

         从官方手册中得知,这几个操作被称为“意向?”,或许跟函数或者宏还是有一点点差异。继续往下看的话,这三个操作还是有所不同的,其中not可以认为是一个函数,另外两个则是语言中的特殊形式。

         接下来,做一部分测试:

204_emacs lisp与或非操作_github_03

204_emacs lisp与或非操作_c语言_04

204_emacs lisp与或非操作_emacs_05

         这个是需要注意的,不同意C语言时候的经验,看起来0不代表false。

204_emacs lisp与或非操作_github_06

         至于为什么有这样的结果,官方的文档中写的还是很明确的。

204_emacs lisp与或非操作_c语言_07

         只有传入的参数是nil的时候,返回t,其他时候全都是返回nil。

         接下来测试and:

204_emacs lisp与或非操作_emacs_08

204_emacs lisp与或非操作_c语言_09

204_emacs lisp与或非操作_github_10

204_emacs lisp与或非操作_emacs_11

204_emacs lisp与或非操作_github_12

         看上去,结果似乎也有点出人意料。看一下文档就可以知道:进行and操作的时候,将会逐个元素检查,如果其中的一个为nil则返回nil,后面的不再进行检查;如果全都不是nil,则最后的数值会作为返回值。这么看的话,似乎这个功能可以理解为:查找后面的元素中是否不包含nil。

         关于or的测试:

204_emacs lisp与或非操作_c语言_13

204_emacs lisp与或非操作_c语言_13

204_emacs lisp与或非操作_emacs_15

204_emacs lisp与或非操作_github_16

204_emacs lisp与或非操作_c语言_07

         测试完了and,再看这个功能就不会觉得有什么意外了。Or的功能应该是逐个检查元素是否为nil,全都不是的时候返回t,否则返回第一个非nil的数值并且停止继续检查。

         功能理解清楚还是很容易的,但是这部分表达能够在后期的代码构建中运用熟练或许还是需要花点时间练习一下的。