菜卷鱼 发表于 2015-11-5 10:18:22

程序局部变量问题

本帖最后由 菜卷鱼 于 2015-11-5 14:24 编辑

像(rtos number ]) , mode 跟 precision 这两个变量爱填不填,函数都能使用,这种效果怎么弄出来的?

根据两位大神的回答,那我只能把程序这样弄了

用来测试的程序是用来排序的,论坛里有很多这种功能的,不过我这个跟他们的有点不一样
;(vla-sort 选择集 属性名称 排序方式)    举例(vla-sort ss 'EffectiveName > )按块名排序
;假如排序属性是列表的话
;(vla-sort 选择集‘(属性名称要比较的第几个位置) 排序方式)   举例   (vla-sort ss’(InsertionPoint 1)< )按插入点排序,1是X,2是Y ,3是Z坐标(defun vla-sort(ss mark syb / ns sl)
(setqns (ssadd) sl nil)
(setq i -1)
(repeat (sslength SS)
    (setq sl (cons (ssname SS (setq i (1+ i))) sl))
    )
(cond
((= (type mark) 'SYM)
(setqsl
   (vl-sort
   sl
   (function
       (lambda (X Y)
         (Syb
   (vlax-get (vlax-ename->vla-object X)mark)
   (vlax-get (vlax-ename->vla-object Y)mark)
   )
         )
             )
         )
         )
)
((= (type mark) 'LIST)
(setqsl
   (vl-sort
   sl
   (function
       (lambda (X Y)
         (Syb
(NTH (1- (CADR mark))   (vlax-get (vlax-ename->vla-object X) (car mark)))
(NTH (1- (CADR mark))   (vlax-get (vlax-ename->vla-object Y) (car mark)))
   )
         )
             )
         )
         )
))
(foreach x sl (setq ns (ssadd x ns)))
)

ZZXXQQ 发表于 2015-11-5 10:22:39

这是内部定义的函数,是用C++做出来的。

edata 发表于 2015-11-5 11:49:52

你这个问的应该叫函数的可选参数,目前lisp的自定义函数是直接无法解决的。
可以采用表传递的方式来控制可选参数,也就是说自定义函数后面是表。
也可以参考不死猫的帖子。

如果非要和rtos 这样的函数类似,就必须通过c++的arx或c#.net,vb.net来自定义内部函数。
arx版本不限,.net只有2007之上才可以,06没有自定义lisp函数功能。

简单说说.net定义可选参数的原型,也是将函数后面的所有参数作为一个数组(可以理解为表)传递给函数内部计算。其实和用lisp自定义函数的表是一个道理。只不过多了表这个括号。

love_cq 发表于 2020-12-16 10:08:17

好贴,虽然不懂讲的是啥,但是感觉学习了。
页: [1]
查看完整版本: 程序局部变量问题