199_emacs lisp之defconst-常量定义

白昼怎懂夜的黑 提交于 2020-02-03 21:59:28

         完整的common lisp的学习集合整理如下:

         https://github.com/GreyZhang/g_lisp

         继续分析我现在使用的emacs配置实现,今天的小结涉及到2个语句。用到了同一个函数:defconst。

         源代码如下:

         接下来,查一下用到的这个函数(很可能是一个宏)的相关帮助文档:

         这个功能的实现也是通过C代码来实现的,这个确实是很有意思。我现在最初接触的几个功能的实现都是使用了C代码而不是lisp,这从一方面让我想到了这个功能是效率攸关的功能或者使用机器频繁的功能,从另一方面倒也让我对C语言赞叹有加。似乎,很多语言最初的构建都是基于C语言,emacs lisp虽说不是百分之百,但是最起码从我这一开始接触就看到了这样的影子。

         从形式以及功能设计上看,这个函数的功能行为与setq比较类似,相关的描述可以参考如下链接:

         https://blog.csdn.net/grey_csdn/article/details/104158807

         形式上不同的是,这个定义可以增加一个描述信息。

         Defconst定义的是一个常量,读了一下上面的说明,我想到了《C专家编程》的一句话“C语言中的const其实理解为read only或许更加贴切”。我个人觉得,兴许这个描述也适用于这里。只不过,这里的修改发生在全局以及局部重叠的时候,这里有一个我理解不透的地方,那就是全局量以及局部量在定义上有什么样的区分?至于是否可以存在前面提到的“重叠”关于我的这部分理解,接下来我会尝试做一下测试验证。

         这样,上面我截取出来的两居源代码的理解就很容易了。这是两个常量定义,每个常量其实都是一个字符串。针对每个字符串常量,都增加了一段描述便于软件的维护。

         测试:看是否存在重复修改数据的可能,也就是前面提到的重叠问题。

         我在spacemacs的用户配置部分,对spacemacs的版本号进行二次定义如下:

         接下来,重启emacs之后,查看这个量的信息如下:

         很明显可以看得出,这个数值被覆盖掉了,也在一定程度上验证了之前的理解。

         接下来,看看是否我这里是重新定义局部量成功。我觉得很简单的验证方式是修改一下描述信息,之后可以看得出。测试结果如下:

         从上面的结果可以看得出,其实,这个定义定义出来的就是可以理解为非局部量了。为什么呢?因为从相应的信息提示看,这里提示了用作局部量可能会有风险性,而提示信息也明确说了这个量的定义位置。如何测试它的常量属性呢?我觉得可以从两个方面进行测试:1,重复定义;2,使用setq进行赋值。

         常量重复定义测试:

         重启emacs,加载没有任何错误提示:

         看起来,这个覆盖似乎随时可以。接下来,查看常量信息:

         数值被覆盖掉了。

         接下来,再试试setq进行赋值操作:

         结果:

         还是没出现相应的警告,看起来,这个其实就是一个另类的变量定义?查看此时的变量信息:

         数值居然是被成功改掉了的,看起来,这才是文档中说的emacs lisp没有对此做强制的真正意思了。

         其他的lisp相关的学习笔记汇总,可以参考如下链接:

         https://github.com/GreyZhang/g_lisp

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!