TO楼主,以上都是正确的,只是如果用命令行来看结果,是不对的,因为命令行显示结果不全 恩,谢谢大家!!都是高人哦 <p>今天突然找到这个话题,怎样能得到自定义函数的形式参数?我求不出来,如:</p><p>(defun test ( a / b)</p><p>(if (< a 0)(princ (setq b (- 0 a))) (princ (setq b a)) )</p><p>(princ)</p><p>)</p><p>在这个简单的函数中,怎样在lisp中判断函数test中是否有形式参数a,如果没有,可以用apply加载运行它,如果有参数的话,怎样将参数传给它并运行.</p><p>怎样实现,敬请高手指点!</p> 本帖最后由 作者 于 2007-2-27 17:03:40 编辑
byghbcx发表于2007-2-27 16:02:00static/image/common/back.gif今天突然找到这个话题,怎样能得到自定义函数的形式参数?我求不出来,如:(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)(defun-q test ( a / b)
(if (< a 0)(princ (setq b (- 0 a))) (princ (setq b a)) )
(princ)
)
defun(Defun-q)函数其实与这段是等价的:
(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可以查看函数定义,甚至在程序中用表处理函数动态修改这个函数定义。
在极端的情况下,可以定义一个可以不断修改自身代码的程序。(不停地变种,类病毒?嘿嘿)
非常感谢秋枫版主的精心指教,使我学到了很多知识,我想再请问一下,能否在VisualLISP中用defun定义的函数转成由defun-q定义的函数呢?从而将函数当作一个表处理函数. byghbcx发表于2007-2-27 17:20:00static/image/common/back.gif非常感谢秋枫版主的精心指教,使我学到了很多知识,我想再请问一下,能否在VisualLISP中用defun定义的函数转成由defun-q定义的函数呢?从而将函数当作一个表处理函数.
<p>defun-q 就是VisualLISP中的函数。</p><p>它就是为了你的这种需求而保留的。</p><p>如果没有这个函数的话,上面不也提出了一个替代的方法用 Setq 来定义函数嘛。</p>
页:
1
[2]