找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1019|回复: 10

[求助] [求助]:关于set、setq、quote、eval的疑问

[复制链接]
发表于 2004-7-9 21:14:28 | 显示全部楼层 |阅读模式

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

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

×
大家好,我是LISP的初学者,今日在看书时发现如下问题,书上写quote返回没有计算的〈表达式〉,我不太理解这句话的意思, 何为“没有计算的表达式”,而eval返回〈表达式〉的结果,能否请大侠们以通俗的语言告之。
再一个下列4式是怎么来的:
(setq  a  'b)   返回 b。。。。。。这步不明白什么意思。
(setq  a  2.0)  返回 2.0
command:!a    返回2.0
command:!b   返回2.0
再有对于以下赋值:
(setq  a  123  b  'a)  则有
(eval  4.0)             返回 4.0
(eval  (abs  -10))     返回 10
(eval  a)              返回 123
(eval  b)              返回 123
能否把上述CAD的计算过程详细说明一下。
还有(set  'a  5.0)和(setq  a  5.0)到底有什么计算区别,a和'a到底有什么区别。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2004-7-9 22:22:16 | 显示全部楼层
Quote , 简写为 ' , 意为引用,不计算后面的表达式
(quote a) 与 'a 是一样的, 都返回a
(setq a 'b)是把变量b(只是变量本身)赋予变量a,注意你上面的代码有问题,应该先
(setq  a 'b),然后(setq b 2.0) - 其实也可以倒过来,先给b赋值, 这时!b返回2.0, 但!a却返回b
要知道变量a的值,便要用eval, (eval a)返回2.0
(setq a 123 b 'a)是把(setq a 123)和(setq b 'a)合起来写。
eval是计算 ,abs为绝对值
(eval (abs -10))与(abs -10)均返回10,前者有点多此一举, 但eval在一些特殊情况下很有用,灵活运用可以精简代码。
其实,setq 就是set + quote, 所以(set 'a 5.0)与(setq a 5.0)是完全一样的。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2004-7-10 19:43:57 | 显示全部楼层
太感谢了,我终于明白了。我还想多问一句,为什么不取消set,它还有什么特殊的用途吗。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-7-10 20:39:50 | 显示全部楼层
The set function is similar to setq except that set evaluates both of its arguments whereas setq only evaluates its second argument.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-7-10 20:59:40 | 显示全部楼层
set与setq很相像,但set计算两个参量,而setq只计算后面的那个,所以
你可以(set (read "a") 5.0),但(setq (read "a") 5.0)却是语法错误,因为set把(read "a")运算了,得到符号(变量)a, 才可以赋值。set有时也挺有用,下面一句便把变量a, b, c 和d都赋了值
(mapcar 'set (mapcar 'read '("a" "b" "c" "d")) '(1.2 34 45.3 1.0))
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

发表于 2004-7-10 22:06:09 | 显示全部楼层
任何函数名后面跟着的都是参量,也许叫参数,比如(set (read "a") 5.0)中set为函数名,(read "a")就是第一个参数,5.0是第二个。set与setq不同的是set接受第一个参数可以为表达式的形式,如(read "a"),但setq不能。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 6530个

财富等级: 富甲天下

发表于 2004-7-11 11:05:45 | 显示全部楼层
Lisp的初学者往往会不理解关于“数组”的问题,希望将一些相关的值赋予相关的变量,如当x以一个量递增时以的值分别被赋予y0、y1、y2.... 当然正解是放置在一个表中,至于问题的直接解...
下面举一个类似的例子,将相关的问题及函数的用法简单剖析一下:
  1. ;;;当x以1.2递增时(10次,x0=0),求y的对应值。
  2. ;;;正解
  3. (setq i -1)
  4. (setq xylist nil)
  5. (repeat        10
  6.   (setq        i (1+ i)
  7.         x (* i 1.2)
  8.         y (+ (* x x 2) 3)
  9.   )
  10.   (setq xylist (cons (list x y) xylist))
  11. )
  12. (setq xylist (reverse xylist))    ;构成((x0 y0) (x1 y1)....)点表

  13. ;;;直接解一
  14. (setq i -1)
  15. (repeat        10
  16.   (setq i (1+ i))
  17.   (set [B](read (strcat "x" (itoa i)))[/B] (* i 1.2))         ;求出xi符号,同时对xi赋值
  18.   (set (read (strcat "y" (itoa i)))                        ;求出yi符号
  19.        (+ (* [B](eval (read (strcat "x" (itoa i))))[/B]     ;求出xi符号,并返回xi的值
  20.              (eval (read (strcat "x" (itoa i))))
  21.              2
  22.           )
  23.           3
  24.        )
  25.   )
  26. )       ;最终对xi、yi(i=0~9)分别赋值

  27. ;;;直接解二(直接解一简化)
  28. (setq i -1)
  29. (repeat        10
  30.   (setq i (1+ i))
  31.   (setq xx (read (strcat "x" (itoa i))))     ;提出重复部分,将xi符号赋予变量xx
  32.   (set xx (* i 1.2))      ;对变量xx的值(xi)赋值
  33.   (set (read (strcat "y" (itoa i)))
  34.        (+ (* (eval xx)        ;变量xx的值(xi)经过计算后传递到yi
  35.              (eval xx)
  36.              2
  37.           )
  38.           3
  39.        )
  40.   )
  41. )

  42. ;;;直接解三(直接解二变形)
  43. (setq i -1)
  44. (repeat        10
  45.   (setq i (1+ i))
  46.   (setq xx '(read (strcat "x" (itoa i))))     ;提出重复部分,将xi符号计算过程赋予变量xx
  47.   (set (eval xx) (* i 1.2))      ;对变量xx求值(xi)并赋值
  48.   (set (read (strcat "y" (itoa i)))
  49.        (+ (* (eval (eval xx))        ;变量xx的值(xi)经过计算后传递到yi
  50.              (eval (eval xx))
  51.              2
  52.           )
  53.           3
  54.        )
  55.   )
  56. )

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

使用道具 举报

发表于 2004-7-12 14:58:23 | 显示全部楼层
好帖,建议加分
我的理解, set 完成的是求值(对两个参数)并赋值(第二个的结果赋给第一个参数的结果),求值相当于 eval 赋值则是 setq,多看看 天正、理正的Lisp会有好处,用了很多 set 和 eval
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-7-12 19:39:28 | 显示全部楼层
我也来玩玩:)
不知道算偏方还是正解之一. :P ,会不会更好理解呢?
[php]
(defun xset (str i do)
  (set (read(strcat str (itoa i))) do)
)
(setq i -1)
(while (< (setq i (1+ i)) 10)
  (setq x (xset "x" i (* i 1.2)))
  (xset "y" i (+ (* x x 2) 3))
)
[/php]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2004-7-14 19:34:12 | 显示全部楼层
太高深了,大家能否详细解释一下,我消化不了。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-27 06:56 , Processed in 0.201446 second(s), 52 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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