不传递变量名在函数内重新赋值全局变量的实现方法
解决方案:用宏替代函数实现变量的破坏性修改
你的问题核心在于Common Lisp的函数参数是按值传递的——reassign里的val只是外部变量s的一个副本,修改这个副本完全不会影响原来的s。要实现你想要的「破坏性修改外部变量」的效果,我们需要把reassign改成宏,因为宏操作的是代码本身,而不是传递的值。
修改后的代码
(setq s ()) (defmacro reassign (var) `(setq ,var 10)) ; 使用反引号和逗号拼接符号,直接操作传入的变量 (reassign s) (print s) ; 现在输出:10
为什么这样可行?
宏在编译期会被展开:当你调用(reassign s)时,宏会把这段代码替换成(setq s 10),直接对符号s进行赋值操作,完全绕开了函数传值的限制。而且我们并没有在宏里硬编码s,而是通过参数var接收传入的变量符号,完全符合你的要求。
补充说明:为什么函数做不到?
如果坚持要用函数的话,你只能传递变量的符号(比如调用(reassign 's)),然后在函数里用(set var 10)来修改,但这样调用方式就变了,不符合你希望(reassign s)的调用形式。所以宏是最简单直接的解决方案。
内容的提问来源于stack exchange,提问作者Kisslax
相关产品推荐
相关产品推荐

