语言副作用的理解与疑惑


#1

经常在某些lisp或scheme的群里,听到有人讨论干净的宏,或有没有副作用。

谁帮解释一下,这是什么概念?

副作用是指,函数除了有返回值之外,还有IO操作的意思吗?干净的宏又是什么意思呢?


#2

副作用:影响到函数外界的作用称为副作用。严格意义上,改了外界变量,改了数据库,IO 操作,都算副作用。

清洁宏:宏不会影响到上下文中的“变量”。比如你定义了一个a = 1,然后宏里面也定义了 a = 2,结果宏展开之后把外面的 a 覆盖了。因为你不知到调用宏的地方会用什么变量名。和命名空间的问题差不多,但是宏这玩意儿你又不能整个命名空间。所以想了个办法,在宏展开的地方取上下文环境,然后把宏里自己用的变量替换成一个绝对不会和上下文变量重名的名字。比如你在宏里定义 a = 2,如果使用清洁宏,举个例子,编译器可能就会给你替换成 dshfkdhsnpgfpds@a = 2,这样就不会重名了。


#3

也就是说,清洁宏和哪个lisp变种无关,而是和具体的解释器有关呗。

解释器在宏展开时,把展开的代码都嵌入到一个let里,内部变量移到let中定义应该也能解决问题吧?


#4

具体实现我也不知道。。。:rofl:


#5

非常感谢!以前没找到清洁宏的具体说明,今天算是解惑了。:grinning: