本帖最后由 baitang36 于 2025-12-29 22:48 编辑
先来做个试验:
命令: (setq aa princ bb 1234)
1234
命令: (setq princ bb)
1234
命令: (setq princ aa)
#<SUBR @1100d30c PRINC>
一切正常,结果符合预期。
进入vlide,然后退出。
命令: (setq princ bb)
出现弹窗提示,问题:分配给保护的符号:princ 是否进入中断循环?
如果选择是,princ没有被赋值;选择否,princ将会被赋值1234
; 用户警告: 给保护符号赋值: PRINC <- 1234
由此可见,符号的保护是因为进入过vlide被激活的。
问题来了,怎么绕过这个符号保护,在任意情况下对任意符号进行赋值呢?
经过研究,发现一个内部保留函数,_symbol-flags<- 可以解决这个问题。
在赋值之前,先改一下符号的flags,再执行(setq princ bb)就不会出现警告提示了。
(load "c:/trf_9")
(tranf '_symbol-flags<-)
(_symbol-flags<- 'princ 0)
(setq princ bb)
结论:进入vlide,会激活系统符号的保护。用_symbol-flags<-可以修改符号的flags,绕过符号保护。
网友答: 大侠又出高作。
厉害。网友答: 原来如此。我用小菜选择易报这种错误直接卡死,好像就是出现在打开vlide的时候。网友答: princ函数不能做为变量 直接卡死网友答: 那岂不是可以魔改系统函数了?网友答:
改后风险自担网友答: (tranf '_symbol-flags<-)
(_symbol-flags<- 'quote 0)
(setq quote function)
以后可以用'代替function了
先来做个试验:
命令: (setq aa princ bb 1234)
1234
命令: (setq princ bb)
1234
命令: (setq princ aa)
#<SUBR @1100d30c PRINC>
一切正常,结果符合预期。
进入vlide,然后退出。
命令: (setq princ bb)
出现弹窗提示,问题:分配给保护的符号:princ 是否进入中断循环?
如果选择是,princ没有被赋值;选择否,princ将会被赋值1234
; 用户警告: 给保护符号赋值: PRINC <- 1234
由此可见,符号的保护是因为进入过vlide被激活的。
问题来了,怎么绕过这个符号保护,在任意情况下对任意符号进行赋值呢?
经过研究,发现一个内部保留函数,_symbol-flags<- 可以解决这个问题。
在赋值之前,先改一下符号的flags,再执行(setq princ bb)就不会出现警告提示了。
(load "c:/trf_9")
(tranf '_symbol-flags<-)
(_symbol-flags<- 'princ 0)
(setq princ bb)
结论:进入vlide,会激活系统符号的保护。用_symbol-flags<-可以修改符号的flags,绕过符号保护。
网友答: 大侠又出高作。
厉害。网友答: 原来如此。我用小菜选择易报这种错误直接卡死,好像就是出现在打开vlide的时候。网友答: princ函数不能做为变量 直接卡死网友答: 那岂不是可以魔改系统函数了?网友答:
陨落 发表于 2025-12-31 11:53
那岂不是可以魔改系统函数了?
改后风险自担网友答: (tranf '_symbol-flags<-)
(_symbol-flags<- 'quote 0)
(setq quote function)
以后可以用'代替function了