Lisp中函数内调用fmakunbound时为何无需给符号加引号?
Lisp中符号引号的使用逻辑
核心原因在于Lisp的求值规则:默认情况下,代码里的符号会被Lisp解释器求值为它当前绑定的值;而加单引号'是告诉解释器「不要求值这个符号,直接返回它本身」。
分两种场景看:
直接调用
fmakunbound时:
比如(fmakunbound 'func-name),fmakunbound需要的是符号本身(要移除的是这个符号对应的函数绑定)。如果不加引号,func-name会被解释器求值——如果这个符号之前没绑定过值,会直接报错;就算绑定过,传进去的也是它的值,不是符号本身,不符合fmakunbound的要求。所以必须加引号阻止求值,把func-name符号直接传进去。在自定义函数
remove-func内部:
函数定义里的symbol是参数,当你调用(remove-func 'func-name)时,'func-name已经把func-name符号作为实参传给了symbol。此时在函数内部使用symbol,解释器求值后得到的就是func-name这个符号本身,正好是fmakunbound需要的参数。如果这里给symbol加引号,传进去的就变成了symbol这个符号本身,而不是你传入的目标符号,逻辑就错了。
举个实际调用的例子更清楚:
当你执行(remove-func 'my-func),函数内部的symbol就绑定了my-func符号,执行(fmakunbound symbol)等价于直接执行(fmakunbound 'my-func),效果完全一致。
内容的提问来源于stack exchange,提问作者Vinn
相关产品推荐
相关产品推荐

