陶小明 发表于 2022-7-31 14:59:50

vlisp中函数的可选参数,剩余参数和关键参数如何设置?

各位大佬好,请问cad中lisp在定义函数的时候,如何设置lisp语言中的可选参数,剩余参数和关键参数呢?

我在网上查找的,lisp语言好像可以设置这些参数,如关键参数:
(defun function ( &key a b)
          .....

但是我用cad加载lisp文件运行函数的时候,会报参数过多或者参数过少的错误。请问是设置方式的问题还是说不能设置这种参数呢?谢谢大家。

陶小明 发表于 2022-7-31 16:32:58

G〆h 发表于 2022-7-31 16:20
自定义函数可以设置多个参数,当某参数为nil时,表示无此参数。参数较多时,要在逐一列举判断各参数存在的 ...

谢谢你的回答。
比如说我定义了一个函数fc
(defun fc(a b)
.....
)
一般调用fc时是(fc a b),然后我想实现的是我只想输入a参数,不输入b参数,此时b参数默认为nil,但是我调用时只需要输入(fc a)即可,这样后续我对fc扩充参数数量的时候,我就不需要对之前调用了这个函数的代码进行修改了。
目前输入(fc a)时会报“参数过少”然后好像也进不去函数里面,请问该如何解决呢?谢谢

G〆h 发表于 2022-7-31 16:43:48

陶小明 发表于 2022-7-31 16:32
谢谢你的回答。
比如说我定义了一个函数fc
(defun fc(a b)


输入 (fc a nil)即可,函数里面做个空值判断。

;带提示的ssget
(defun LM:ssget ( msg arg / sel )
    (princ msg)
    (setvar 'nomutt 1)
    (if arg
                        (setq sel (vl-catch-all-apply 'ssget arg))
                        (setq sel (vl-catch-all-apply 'ssget ))
                )
    (setvar 'nomutt 0)
    (if (not (vl-catch-all-error-p sel)) sel)
)

(defun C:CO ()
        (vl-cmdf "COPY" (LM:ssget "\ncopy阵列 选择对象:" nil) "" (getpoint "选择起点:") "A" (getint "\ncopy阵列 数量:") "F" )
)

wzg356 发表于 2022-7-31 15:26:41

自定义的函数,使用时必须填全参数

masterlong 发表于 2022-7-31 15:28:32

参数的允许个数以及类型
要看函数的帮助

对于可选参数或者不定长度参数
只需要把握住一点
可选时
各参数的类型都是不一样的
比如(strcase str T/nil)
不定长度时
各参数的类型都是一样的
比如(+ 1 2 3 ....)

陶小明 发表于 2022-7-31 15:47:46

wzg356 发表于 2022-7-31 15:26
自定义的函数,使用时必须填全参数

谢谢你的回答。
自定义的函数可以设置可选参数之类的吗?就是说我调用函数的时候,不填那个参数,这个参数会默认为nil这样函数改起来比较方便,适合后面不断的扩充参数数量。我之前在其他地方看到的lisp语言有这种用法,不知道vlisp可不可以这样用就是。

陶小明 发表于 2022-7-31 15:49:58

masterlong 发表于 2022-7-31 15:28
参数的允许个数以及类型
要看函数的帮助



谢谢你的回答。
主要是自定义函数是否可以实现类似你举的函数例子那种可选参数或不定长参数的效果?这样的话,有利于函数的后续扩充。

G〆h 发表于 2022-7-31 16:20:10

自定义函数可以设置多个参数,当某参数为nil时,表示无此参数。参数较多时,要在逐一列举判断各参数存在的情况,执行相对应的功能。不定长参数,把参数本身考虑成函数,通过函数嵌套来实现。

陶小明 发表于 2022-7-31 17:32:05

G〆h 发表于 2022-7-31 16:43
输入 (fc a nil)即可,函数里面做个空值判断。

;带提示的ssget


好的,非常感谢,我试一下看能否解决问题

mituzhe 发表于 2022-8-1 10:24:41

autolisp是方言,不支持可变参数,可选参数,关键字参数这些。
页: [1] 2
查看完整版本: vlisp中函数的可选参数,剩余参数和关键参数如何设置?