明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
12
返回列表 发新帖
楼主: wujiguang

[经验] set和setq的区别和使用中的疑问

[复制链接]
发表于 2020-3-25 11:40:49 | 显示全部楼层
crtrccrt 发表于 2018-7-21 06:47
个人认为:LISP的精髓表现在SET和EVAL两个函数。其他编程语言没有类似的概念及功能。

高手
我学了好久以后才意识到
发表于 2020-3-25 14:55:15 | 显示全部楼层
LISP的精髓表现在SET和EVAL两个函数。

要体会到这一条,先要精通了apply和mapcar及lambda与function四个函数,特别是apply和mapcar这两个函数.建议尽量不要用
(set 'A 5)
(set (qoute A) 5)
这两种写法,虽然正确.原因:大量数据运算时,效率不同.
发表于 2020-5-15 23:26:06 | 显示全部楼层
还真没发现这个问题,受教了
发表于 2020-5-17 09:57:51 | 显示全部楼层
再补充
set可以批量交换变量而setq不行

;举例1
(setq a 1 b 2 c 3)
(mapcar 'set '(a b c) '(1 2 3)) ; 表
;返回值都一样是 1 2 3

;举例2
(setq l1 '(a b c) z1 '(1 2 3)
        l2 '(x y z) z2 '(7 8 9))

(mapcar 'set l1 z2 ) ; 变量l1(a b c)值z2(7 8 9)
(mapcar 'set l2 (mapcar 'eval l1)) ;拷贝l1(值z2)去变量l2(x y z)值='(7 8 9)
(mapcar 'set l1 z1 ) ;变量l1(a b c)值z1(1 2 3) 变量l1值='(1 2 3)

;举例3
(mapcar 'set l1 (reverse z1) ) ;也可以反转值

;举例4
;批量清理全局变量(a b c)
(mapcar '(lambda (x)(set x nil)) l1 )
;(NIL NIL NIL)

;清除(x y z)因为(a b c)已nil
(mapcar '(lambda (i j)(set i (eval j))) l2 l1 )
;x y z = nil nil nil


您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-5-18 03:55 , Processed in 0.169396 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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