赋值与求值函数 何志丹 (SetQ <sym1> <exp1> [<sym2> <exp2>]...) 偶数位上的参数求值,并把求值的结果赋给前一个符号原子。SetQ 返回最后一个表达式的值。 注意: 1,SetQ是串行函数 ,即对前面的符号先赋值,后面的符号后赋值。 2,SetQ只是简单地加了一个内存指针,这个指针是从奇数位上的符号指向其后偶数位上的数据所指的内存数据。 例子: (SetQ x 2.4 y (+ x 2.0) 返回值4.5
(Set <sym> <expr>) Set函数把参数二的值赋给参数一的值,返回参数二的值。 例子: (SetQ c "AB") (SetQ d 'c) (kSet D 2.0) 返回值为2.0 ,c的值为2.0
禁上求值函数Quote (Quote <epxr>) Quote函数的功能是阻止求值器对其参数求值,返回没有值的S-表达式。 例子: (Quote (+ 6 5)) 返回值是(+ 6 5)而不是11。 注意: 1,此函数的作用范围是紧跟其后的S-表达式。 2,单引号是简写,只能用在表达中,不能从键盘输入一个单引号引起来的表达式直接响应AutoCAD的命令提示。 3,(CDR (1 2 3))是错误的,为了求该表的CDR,求值器先到表(1 2 3)求值,求值器把1作为函数名,于是出错。
Function 函数 与Quote函数基本相同,当<expr> 为函数名时,Fuction就把该函数的局部变量约束到当前环境中。 如: (apply (function +) '(2.0 4.0 5.5)) 返回值11.5
再求值函数 (eval <expr>) 先对变量expr求值,把结果返回给eval,eval对它再次求值。 如: (SetQ x '(* 5.0 6.0)) (eval x) 返回值30.0
小结: 1,在SetQ函数中符号名和SetQ中sym的值不能和AutoLisp的内部符号和内部函数名(在自带的编辑器中以不同的颜色显示)相同,否刚会使这引起些符号失去原有的意义。 2,Quote函数只能阻止对其后的S-表达式的一次求值,有时被 阻止的表达式需要转化成调用被求值,可以用eval. 3,利用eval,我们可以把程序中用到的数据结构独立于程序。 如: (SetQ datastr '(list x y z)) 
|