Lisp语言:变量以及变量的作用范围
到现在才讨论变量似乎有点迟,在过去的文章中我们已经很多次使用变量。
之所以到现在才讨论变量是因为不想各位因为复杂的变量使用规定感到困惑。如果只是基本使用,理解变量确实可以很简单。就像在之前的几篇文章中,我们使用了很多变量,我们不用进行复杂的讨论也可以理解这些变量。变量的简单使用也就是如何赋值,如何取值。
前面的文章我们使用setq函数对变量赋值,使用时直接通过变量名代表对应的值。如下面这样的代码:
当一个函数有定义参数时情况会变得复杂一点。
首先有一点是比较明确的,函数的参数只在函数内有效。比如我们定义了函数var-test,带有参数var-f,那么var-f可以作为一个变量在函数var-test中使用。不过,一旦离开函数var-test,var-f就不能使用了。
问题就是如果一个函数的参数和一个全局变量同名会出现什么情况。
如下面的代码,函数function2有一个参数var-j,而函数function2外定义了一个全局变量var-j。
在这种情况下,var-j在function2函数内可以被当做一个临时变量,function2中对var-j的任何修改都不会影响function2以外var-j的值。
另外一种定义临时变量的方法是使用let函数,let函数的使用例子如下:
以上简单讲了变量的作用范围,希望可以给你一些参考。
简单的总结是:
1. setq, setf可以用于定义全局变量。
2. 函数的参数是临时变量,作用范围只在函数内。
3. let函数定义的变量是临时变量,在let函数内有效。
4. 对临时变量执行setq和setf操作不对全局变量产生影响。
其实,有关变量的作用范围还有很多需要讨论的,因为篇幅的关系,这里暂时就不展开了。
最后要留意的是Common Lisp中有包的概念,引入包的概念以后对于变量的使用会更复杂一点。本篇文章的讨论没有考虑包的情况。