297_common lisp defvar defparameter defconstant使用

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

https://github.com/GreyZhang/g_lisp

    继续common lisp的学习,这一次来对比一下三种常用的全局变量的引入方式。

定义如上变量。其中,前面两个创建的是动态的变量,第三个创建的是const。看上去有很多相似之处,其实绑定的内容不是很一样。

上面是编译运行的效果。

如果修改了+baz+的数值,再次编译,会出现上面的报错。

相比之下,前面两种方式重新编译不会出现问题。

然而,这时候在REPL中求值,却可以看得出defvar的数值没有立即改变,这是他们之间的差异。

如果尝试进行赋值,则两个都是可以起到作用的。上面的操作中用到了一个新的函数setf,这个跟之前用过的setq有什么差异呢?Setq是用于设置symbol的数值,但是setf可以设置任何对象的数值。

与其他的语言相比,lisp的这些变量定义有什么差异呢?其实,这个很多时候的行为会让C程序员觉得有点奇怪。

这个还是好理解的,把一个变量进行了输出。之所以输出4,是因为前面进行了赋值。重新做一下编译,再看看。

如果再做一层封装,做一下测试。

到这里还是很符合预期的。

但是,到了这里,或许就有一点让人觉得有点不好理解了。Let继续引入变量,可以引入多次。而看似局部变量的信息又在函数之外的函数中发挥了作用。这种功能,或许是lisp灵活度高的很大原因,但是的确是有点让人摸不到头脑。

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

https://github.com/GreyZhang/g_lisp

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

猜你喜欢

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