找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 959|回复: 8

[求助] [求助]:set和setq的区别在哪里?

[复制链接]
发表于 2004-10-17 22:11:11 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×
请高手指点,在下面的语句里面为什么不可以使用set函数呢?

已知m

(setq n m)正常

(set n m)不正常
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 488个

财富等级: 日进斗金

发表于 2004-10-17 22:52:19 | 显示全部楼层
(set 'n m)


--------------------------------
命令: (setq b 'c)
C

命令: (setq a 100)
100

命令: (set b a)
100

命令: !c
100

命令: !b
C

符号,还是变量??? set只给符合赋值
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-10-17 23:48:13 | 显示全部楼层
摘录一段(自vlisp函数说明):

set 函数
语法
    (set sym expr)
功能及参数
     此函数可将 sym 中的值设定给 expr(其中 sym 是一个单引号的符号名称), 同时此函数将返回此表达式的新值。
范例
(set 'a 5.0)                   返回    5.0          并且设定符号    A
(set (quote b) 'a)             返回    A            并且设定符号    B
    如果 set 与无单引号的名称合用, 那么它将间接指派一个新的值给另一个名称。续上例:
    (set b 640)                返回    640
    同时指定 640 的值给符号 A(因为这是符号 B 所包含的值)。
---------------------------------------------------------------------------------------------------------
setq 函数
语法
    (setq sym1 expr1 [sym2 expr2]...)
功能及参数
    此函数会将 expr 的值设定给 sym1。expr2 值设定给 sym2, 其余的依此类推。这是 AutoLISP 中最基本的设定函数。此函数将返回最后一个 expr 的值。
范例
(setq a 5.0)                  返回                     5.0
    这代表 5.0 被设定给符号 A, 当 A 被判别时, 它将判别其为实型数 5.0。其他范例如:
    (setq b 123 c 4.7)            返回                     4.7
    (setq s "it")                 返回                     "it"
    (setq z '(a b))               返回                     (A B)
    setq或set 直接指定给一个符号的字符串其最大长度为 100字符, 但是您可以使用下列方式来建立更长的字符串:先用strcat函数将许多字符串连接在一起, 然后将结果指定给一个符号。   
    setq 与 set 函数相类似, 不同的是这个符号名称并没有加引号。换言之, set 会计算第一个参数, 但 setq 不会。下面的范例将显示这两个函数的相似性:
    (setq a 5.0)  相当于  (set (quote a) 5.0)
    除非是在 defun 内设定函数参数的值, 或设定 defun 内已声明为区域性符号的值, 否则由 set 及 setq 建立或修改者皆为整体值符号 。例如:
    (setq glo1 123)                   ; (建立一个整型数体性符号)
    (defun demo (arg1 arg2 / loc1 loc2)
    (setq arg1 234)                   ; (分派一新值给区域性符号)
    (setq loc1 345)                   ; (分派一新值给区域性符号)      
    (setq glo1 456)                   ; (分派一新值给整体性符号)
    (setq glo2 567)                   ; (建立一新值的整体性符号)
    )      
    整体性符号可让任何函数来修改、存取或用于任何表达式中。区域性符号及函数参数只有在定义它们的函数被使用 (及函数被此函数调用) 时才有意义。函数参数可视为区域性符号, 该函数可改变它们的值, 但如此的改变会在离开函数时被放弃, 也就是说此时的函数参数将又回到它原来的值。
    【注意】符号和函数名称, set 和 setq 都能够设定新值给 AutoLISP 的内置符号和函数名称。因此, 请放弃原来的定义或用户无法存取的这些符号和名称。有些用户若曾经使用过下列的指令, 即会遭受不幸的苦果:
    (setq angle (...))              (错误! )
    (setq length (...))             (错误! )
    (setq max (...))                (错误! )
    (setq t (...))                  (错误! )
    (setq pi 3.0)                   (错误! ! ! )
    为了避免种种不同的错误, 请小心地选用函数名称。绝不要使用内置的符号或函数名称来当做自己的符号! 如果您不确定符号名称是否已存在, 则您可以使用下述方式查询(假设您要查询符号 mysyn):
    Command:(atom-family 0 '("mysyn"))
    如果此符号从未定义过, 则将返回:(nil)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-10-18 09:41:44 | 显示全部楼层
已知m

(setq n m)正常

(set n m)不正常
set 会对第一个参数求值.
只有求值结果是符号的时候,才对其赋值
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2004-10-18 20:07:48 | 显示全部楼层
谢谢各位的帮助,知道了,就是对第一个参数的求值与否,这个问题问的太低级了,不好意思。其实我是在学vl,还以为vl里面有多神秘呢,于是就产生了这个问题,后来自己都觉得可笑了。再次谢谢了!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-10-18 21:17:45 | 显示全部楼层
谢谢!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-10-18 22:50:58 | 显示全部楼层
最初由 urljit 发布
[B]谢谢各位的帮助,知道了,就是对第一个参数的求值与否,这个问题问的太低级了,不好意思。其实我是在学vl,还以为vl里面有多神秘呢,于是就产生了这个问题,后来自己都觉得可笑了。再次谢谢了! [/B]


别这么说,懂得用set的人不是很多呢
另外,建议你也试试eval.和set一样,是平时用的不多,不起眼却很强大的函数,
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 6530个

财富等级: 富甲天下

发表于 2004-10-19 08:31:57 | 显示全部楼层
最初由 urljit 发布
[B]谢谢各位的帮助,知道了,就是对第一个参数的求值与否,这个问题问的太低级了,不好意思。其实我是在学vl,还以为vl里面有多神秘呢,于是就产生了这个问题,后来自己都觉得可笑了。再次谢谢了! [/B]


其实这决不是一个低级问题,适当使用set函数有时会是的一些问题变得很简单,如果使用不当也会带来意想不到的结果。
set函数对第一个参数求值,往往被用来“传递”,如:
  1. _$ (setq i 1)
  2. 1
  3. _$ (set (read (strcat "P" (itoa i))) 300.0)
  4. 300.0
  5. _$ p1
  6. 300.0

此时p1被赋值为300.0。
再如:
  1. _$ (setq a 5.0)
  2. 5.0
  3. _$ (set 'b 'a)
  4. A
  5. _$ b
  6. A
  7. _$ (set b 640.0)
  8. 640.0
  9. _$ b
  10. A
  11. _$ a
  12. 640.0

此时,变量a被赋值为640,而b却不是,这也许是不想要的结果(?)。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2004-10-19 10:02:31 | 显示全部楼层
其实也不难理解,b里面放的a变量的名字,而a里面才是数值,即所谓指针:b→a→640,我这样理解对么?ll_j长老?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-12-23 10:18 , Processed in 0.475470 second(s), 47 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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