明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
12
返回列表 发新帖
楼主: peng197806

如何获取已定义的全局变量名称?

  [复制链接]
发表于 2005-4-26 10:51:00 | 显示全部楼层
跟前面的不是一样的?
发表于 2005-4-26 11:10:00 | 显示全部楼层
不好意思,是我范低级错误了...


TO楼主,以上都是正确的,只是如果用命令行来看结果,是不对的,因为命令行显示结果不全
 楼主| 发表于 2005-4-26 16:39:00 | 显示全部楼层
恩,谢谢大家!!都是高人哦
发表于 2007-2-27 16:02:00 | 显示全部楼层

今天突然找到这个话题,怎样能得到自定义函数的形式参数?我求不出来,如:

(defun test ( a / b)

(if (< a 0)(princ (setq b (- 0 a))) (princ (setq b a)) )

(princ)

)

在这个简单的函数中,怎样在lisp中判断函数test中是否有形式参数a,如果没有,可以用apply加载运行它,如果有参数的话,怎样将参数传给它并运行.

怎样实现,敬请高手指点!

发表于 2007-2-27 16:56:00 | 显示全部楼层
本帖最后由 作者 于 2007-2-27 17:03:40 编辑

byghbcx发表于2007-2-27 16:02:00今天突然找到这个话题,怎样能得到自定义函数的形式参数?我求不出来,如defun test ( a / b)(if (< a 0)(princ (setq b (- 0 a))) (princ (setq b a)) )(princ))在这个简单的函数
这个要求,在VisualLISP中我认为实现比较难。在AutoLISP中实现比较容易。
因此,在AutoCAD R14中实现是可能的。在AutoCAD 2000以后的版本中,defun函数会对函数进行编译,所以必须显式地用defun-q 函数来定义。
在AutoLISP中,函数也是一个表。用表处理函数就可以得到参数。
在2000以上的版本中,用下面的定义形式(R14中你可以直接用defun)
  1. (defun-q test ( a / b)
  2. (if (< a 0)(princ (setq b (- 0 a))) (princ (setq b a)) )
  3. (princ)
  4. )
defun(Defun-q)函数其实与这段是等价的:
  1. (setq test '((A / B) (IF (< A 0) (PRINC (SETQ B (- 0 A))) (PRINC (SETQ B A))) (PRINC)))
用下面的代码可以:
取得参数列表:(car test)
返回:(A / B)

取得第一个参数: (caar test)
返回:A

取得第二个参数:(cadar test)
返回:/
取得第三个参数:(caddar test)
返回:B
用!test可以查看函数定义,甚至在程序中用表处理函数动态修改这个函数定义。
在极端的情况下,可以定义一个可以不断修改自身代码的程序。(不停地变种,类病毒?嘿嘿)

发表于 2007-2-27 17:20:00 | 显示全部楼层
非常感谢秋枫版主的精心指教,使我学到了很多知识,我想再请问一下,能否在VisualLISP中用defun定义的函数转成由defun-q定义的函数呢?从而将函数当作一个表处理函数.
发表于 2007-2-27 17:25:00 | 显示全部楼层
byghbcx发表于2007-2-27 17:20:00非常感谢秋枫版主的精心指教,使我学到了很多知识,我想再请问一下,能否在VisualLISP中用defun定义的函数转成由defun-q定义的函数呢?从而将函数当作一个表处理函数.

defun-q 就是VisualLISP中的函数。

它就是为了你的这种需求而保留的。

如果没有这个函数的话,上面不也提出了一个替代的方法用 Setq 来定义函数嘛。

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

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2025-6-20 22:59 , Processed in 0.178556 second(s), 19 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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