找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1318|回复: 12

[求助] [LISP程序]:lisp难题求助,高手快出招

[复制链接]

已领礼包: 6个

财富等级: 恭喜发财

发表于 2006-3-9 18:46:12 | 显示全部楼层 |阅读模式

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

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

×
lisp难题求助,高手快出招
如果用lisp自定义了命令abcd
(defun c:abcd ( / ) (princ "01234")(princ))
在另一lisp程序中(setq a "c:abcd"),如何利用变量a执行程序c:abcd
而不是用(c:abcd)执行程序???
高手快出招.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 1915个

财富等级: 堆金积玉

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

使用道具 举报

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

使用道具 举报

已领礼包: 1915个

财富等级: 堆金积玉

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

使用道具 举报

已领礼包: 1915个

财富等级: 堆金积玉

发表于 2006-3-9 22:15:49 | 显示全部楼层
在2004下这样才行
(setq a "c:abcd")
(setq a (eval (read a)))
(a)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-3-14 19:19:52 | 显示全部楼层
在ACAD2006里:
(setq a "c:abcd")
(eval(read a))
也不行。
必须这样:
(setq a "c:abcd")
(setq a (eval (read a)))
(a)

其实和版本没关系。
(setq a "c:abcd") 只是把一个字符串 “c:abcd”赋给了变量a
(read a) 只是把变量a中的字符串解析为autolisp 的相应数据。也就是把"c:abcd"字符串解析为C:ABCD
eval 函数只是求值函数。 因此,
(eval (read a)) 相当于
(eval C:ABCD) 其结果应该是C:ABCD的值,即如
#<USUBR @03ba7ca8 C:ABCD>
这样的值(其实这是C:ABCD的句柄)
所以,要想执行C:ABCD
只能:
(setq a (eval (read a)))
(a)
------------------------------------------
楼主的这个问题是非常好的,能帮助理解 read 和 eval
函数的意义和应用。

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

使用道具 举报

已领礼包: 488个

财富等级: 日进斗金

发表于 2006-3-14 20:54:02 | 显示全部楼层
命令: (defun c:abcd ( / ) (princ "01234")(princ))
C:ABCD

命令: (setq a "c:abcd")
"c:abcd"

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

使用道具 举报

已领礼包: 6个

财富等级: 恭喜发财

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

使用道具 举报

发表于 2006-3-15 21:55:56 | 显示全部楼层
楼上提出的
方法1: (eval (read (strcat "(" a")")))

(方法2:(eval (read (strcat a))))

确实能执行没错。
方法1 的实质就是:(eval (c:abcd))
(c:abcd)是一个lisp表达式, 对其求值自然是运行abcd命令。

而方法2 中(strcat a)的结果还是字符串“c:abcd”所以相当于
((eval (read a))) 又等于
((eval c:abcd))

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

使用道具 举报

已领礼包: 1915个

财富等级: 堆金积玉

发表于 2006-3-15 22:10:53 | 显示全部楼层
最初由 crtrccrt 发布
[B]---------------------------------------------
(eval (read (strcat "(" a")")))
---------------------------------------------
((eval (read (strcat  a))))
--------------------------------------------... [/B]


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

使用道具 举报

发表于 2006-3-15 23:15:54 | 显示全部楼层
lisp就是表
表就是()
(。。。)的第一个元素是函数,则求值(以后面的元素为参数)。,非函数则列表
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1915个

财富等级: 堆金积玉

发表于 2006-3-16 08:41:41 | 显示全部楼层
最初由 雨箭风刀 发布
[B]lisp就是表
表就是()
(。。。)的第一个元素是函数,则求值(以后面的元素为参数)。,非函数则列表 [/B]



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

使用道具 举报

发表于 2006-3-17 16:03:52 | 显示全部楼层
你是不是像定义子函数啊?
取消c:改为
(defun abcd()
......
)

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-23 11:16 , Processed in 0.469061 second(s), 55 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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