baitang36 发表于 2021-12-22 12:56:32

一个有趣的试验,抹掉全局变量

本帖最后由 baitang36 于 2021-12-22 13:07 编辑

做一个tt2.lsp
源码如下:
(defun c:tt2 ()
(setq aaaa 8848)
(princ aaaa)
(princ)
)
加载后,在命令行输入tt2回车,显示8848,正常。
然后加载 syz-wipe-sym.fas,它定义了一个函数syz-wipe-sym,作用是抹掉内存中某个符号的名字。用法:(syz-wipe-sym ‘symbol)
执行:(syz-wipe-sym’aaaa);抹掉符号 aaaa
输入tt2回车,仍然显示 8848
!aaaa,显示nil,说明这个全局变量已经被抹掉了。但不影响c:tt2这个函数的运行。
(setq aaaa 7777)
!aaaa 显示7777
tt2还是显示8848,说明给aaaa赋值不影响c:tt2这个函数。aaaa这个全局变量已经和c:tt2这个函数无关了。
就像是c:tt2中的aaaa成了内部变量了,与外部的变量没有关系。
这是为什么呢?
程序加载到内存后,变量都是用序号来访问的,不管它的名字了。把变量名字抹掉,并不影响函数功能。
外部的变量必须用名字,程序之间的调用只能通过变量名,抹掉后就不能用了。

试验过程如下:
命令: (LOAD "D:/08/tt2.lsp") C:TT2
命令: tt2
8848
命令: (LOAD "D:/08/syz-wipe-sym.fas") nil
命令: (syz-wipe-sym 'aaaa)
命令: !aaaa
nil
命令: tt2
8848
命令: (setq aaaa 7777)
7777
命令: !aaaa
7777
命令: tt2
8848
命令: !aaaa
7777


tryhi 发表于 2021-12-23 00:53:16

本帖最后由 tryhi 于 2021-12-23 00:58 编辑

这个作用很大,相当于可以申明一个仅对本程序有效的变量(或函数),感觉有点像python的闭包?申明的全局变量完全不用怕跟别人的重复导致出现冲突了(至少自己的程序不会被别人的全局变量搞到异常),真是一个牛13的函数
比如程序A.lsp
(syz-wipe-sym 'a)
(setq a 1)
(defun c:tt1 ()
      (setq a(1+ a))
      (princ a)
)
跟程序B.lsp
(syz-wipe-sym 'a)
(setq a 1)
(defun c:tt2 ()
      (setq a(1+ a))
      (princ a)
)


两个分开两个文件加载,两个命令都用了同一个全局变量a,但是这两个居然完全不冲突,各干各的,太优秀了

taoyi0727 发表于 2021-12-22 13:42:34

(defun c:tt1 ()
        (defun test ()
                (setq aaa "0123")
        )
        (test)
        (setq bbb nil)
        (setq bbb aaa)
        (print bbb)
        (princ)
)
(syz-wipe-sym 'aaa)
(defun c:tt2 ()
        (c:tt1)
        (setq ccc nil)
        (setq ccc aaa)
        (print ccc)
        (princ)
)
;一次性依次加载
;tt1 tt2 都能正常执行,可以看出程序全局变量aaa在程序过程中没有被清空,程序完成后才清空的

;先加载 tt1 (syz-wipe-sym 'aaa)
;再单独加载tt2
;tt1不受影响,全局变量aaa被清空
;tt2输出nil,当tt1完成后全局变量aaa就会被清空

taoyi0727 发表于 2021-12-22 13:31:53


(defun c:tt2 ()
        (setq aaa "111")
        (setq bbb aaa)
        (princ bbb)
        (princ)
)
(defun c:tt3 ()
        (setq aaa "789")
        (setq bbb aaa)
        (princ bbb)
        (princ)
)
(syz-wipe-sym 'aaa)
(defun c:tt4 ()
        (setq aaa "000")
        (setq bbb aaa)
        (princ bbb)
        (princ)
)
;一次性依次加载
;tt2 tt3 tt4的aaa全局变量都无效

;先加载 tt2 tt3 (syz-wipe-sym 'aaa)
;再单独加载tt4,tt4不受影响

yanshengjiang 发表于 2021-12-22 20:01:37

还没搞懂用途

baitang36 发表于 2021-12-22 21:57:30

yanshengjiang 发表于 2021-12-22 20:01
还没搞懂用途

用途是想用来解决注册函数容易被替换的问题的,你把注册函数名抹掉了,你自己还照样可以用,但破解者怎么也用不了。

yanshengjiang 发表于 2021-12-22 22:13:27

哦哦    我以为破解只能fas2lsp呢 呵呵

baitang36 发表于 2021-12-22 23:03:42

yanshengjiang 发表于 2021-12-22 22:13
哦哦    我以为破解只能fas2lsp呢 呵呵

变成lsp后再去修改,这不叫破解。这是抄袭别人程序来做自己的源码。
破解是直接对fas进行修改,跳过它的检查,让它不用注册就能正常运行。

crtrccrt 发表于 2021-12-23 07:35:04

本帖最后由 crtrccrt 于 2021-12-23 07:37 编辑

日益精进日益精进
日益精进

尘缘一生 发表于 2021-12-23 21:33:25

MAKE 待后研究,,,,,,,,,,,,,,
页: [1] 2 3
查看完整版本: 一个有趣的试验,抹掉全局变量