明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 1577|回复: 5

[经验] set和setq的区别

[复制链接]
发表于 2020-3-25 11:30:23 | 显示全部楼层 |阅读模式
先看源码:
(defun aa nil
(setq a 88)
(set 'a 88)
(princ (read "bb"))
(set (read "bb") 88)

经过试验,(setq a 88)和(set 'a 88)是为完全等效的。setq就是set quote的意思。

编译成fas后,代码是这样的:
14 00 00 00 00                                                   20号指令,函数开始
32 58  06 05 00                                                  (setq a 88)
09 05 00 32 58 35 02 04 00 03 0A                        (set 'a 88)
09 03 00 35 01 02 00 03 35 01  01 00 03 0A          (princ (read "bb"))  
09 03 00 35 01 02 00 03 32 58 35 02  04 00 03      (set (read "bb") 88)
16                                                                      22号指令,函数结束  

用到的字符串:
05 / A
04 / SET
03 / "bb"
02 / READ
01 / PRINC
可以看出, (setq a 88)被编译成了一句指令,直接用6号指令就完成了功能
(set 'a 88) 被编译成了调用SET这个函数,它有两个参数,一个是05号符号 A,另一个是88
结论,setq不需要调用函数,速度更快,编译后的代码长度也小,更简洁。

"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2020-3-25 11:43:00 | 显示全部楼层
我一般很少用set,除非是局部代码里面需要释放上层变量值,才会用set
发表于 2020-3-25 18:12:22 | 显示全部楼层
谢谢分享宝贵的经验、、、、
发表于 2020-3-26 21:53:59 | 显示全部楼层
感谢分享,学习了。
发表于 2020-4-14 19:45:41 | 显示全部楼层
学习一下,谢谢分享
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-5-18 05:46 , Processed in 0.167140 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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