明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2895|回复: 22

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

[复制链接]
发表于 2021-12-22 12:56 | 显示全部楼层 |阅读模式
本帖最后由 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


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

x

评分

参与人数 4明经币 +5 金钱 +50 收起 理由
caoyin + 2 很给力!
MUSIC-DIE + 1 + 50 很给力!
tryhi + 1
zxmmelly + 1

查看全部评分

"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2021-12-23 00:53 | 显示全部楼层
本帖最后由 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,但是这两个居然完全不冲突,各干各的,太优秀了

回复 支持 1 反对 0

使用道具 举报

发表于 2021-12-22 13:42 | 显示全部楼层
(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就会被清空
发表于 2021-12-22 13:31 | 显示全部楼层

(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不受影响
发表于 2021-12-22 20:01 | 显示全部楼层
还没搞懂用途
 楼主| 发表于 2021-12-22 21:57 | 显示全部楼层

用途是想用来解决注册函数容易被替换的问题的,你把注册函数名抹掉了,你自己还照样可以用,但破解者怎么也用不了。
发表于 2021-12-22 22:13 | 显示全部楼层
哦哦    我以为破解只能fas2lsp呢 呵呵
 楼主| 发表于 2021-12-22 23:03 | 显示全部楼层
yanshengjiang 发表于 2021-12-22 22:13
哦哦    我以为破解只能fas2lsp呢 呵呵

变成lsp后再去修改,这不叫破解。这是抄袭别人程序来做自己的源码。
破解是直接对fas进行修改,跳过它的检查,让它不用注册就能正常运行。
发表于 2021-12-23 07:35 | 显示全部楼层
本帖最后由 crtrccrt 于 2021-12-23 07:37 编辑

日益精进日益精进
日益精进
发表于 2021-12-23 21:33 | 显示全部楼层
MAKE 待后研究,,,,,,,,,,,,,,
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-5-29 03:53 , Processed in 0.399486 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表