328302216 发表于 2013-10-31 20:32:34

求助高手帮忙解决个用变量来代替要调用的子程序问题

本帖最后由 328302216 于 2013-11-1 09:04 编辑

(defun c:tt()
(setq pt1(getpoint "点选一个点"))
(setq pt2(getdist pt1 "输入距离"))
(setq pt3(getfiled "选择子程序文件" "" "lsp" 8))
(setq pt4(load pt3))
(pt4)
)
(defun tt1()
(if(= pt2 0)(setq pt2 50))
(command "rectang"pt1 "d" pt2 pt2 pt1)
)
(defun tt2()
(command "line" pt1 '(0 0) "")
)
有这么两个子程序(主程序保存在一个文件,两个子程序也分别保存为两个lsp文件),我想执行主程序tt后选择子程序 tt1 或 tt2 中的一个并自动加载执行子程序内容,如上的程序解决不了!原因是返回的pt4是sym类型的。如果将子程序和主程序放在同一个程序并把 (setq pt4(load pt3))改成 (setq pt4 tt1)则能执行子程序tt1改成(setq pt4 tt2)则能执行子程序tt2。且子程序和主程序在同一个文件下的话pt4的类型为USUBR(从LISP中加载的用户定义函数)!
不知道各位大大有没有办法将 sym类型或str类型的变量转换成usubr类型的呢!或者有其他办法直接实现更好!先说了不用(cond((判断选择为tt1)(tt1))((判断选择为tt2)(tt2)))的方法!
大概意思应该就是将要执行的子程序赋给一个变量调用并执行该子程序内容!

328302216 发表于 2013-10-31 22:20:01

高手们 你们是没想过这种调用子程序吗还是此路不通?这种的话如果有几千甚至更多的子程序的话就可以需要调用哪个就直接加载哪个来调用就够了,就不用每个都加载,还要判断用哪个!
求各位大神们出手相救啊   

328302216 发表于 2013-11-1 09:44:43

本帖最后由 328302216 于 2013-11-1 09:45 编辑

没人回答,我自己找到了答案,自己来回答一下!!
把 (setq pt4(load pt3))
改成 (setq pt4(eval(load pt3)))
就能达到目的了

Andyhon 发表于 2013-11-1 10:42:52

先这样试
((eval pt4))

梦回唐朝 发表于 2013-11-1 13:00:41

这样也可以
(setq pt5 (eval ( read (vl-filename-base pt3))))
(pt5)
页: [1]
查看完整版本: 求助高手帮忙解决个用变量来代替要调用的子程序问题