大家帮忙看一下这个函数
在晓东CAD上见到的一个自定义Lisp函数:功能判断表是否存在相同元素找到相同马上退出返回T‘代码是
(defun Y::LIST:for (lst / st)
(foreach n lst
(mapcar '(lambda (x)
(if(equal n x 0.000001)
(setq st t
lst '()
)
);;;;if
)
(setq lst (cdr lst))
)
)
st
)
不太看的懂,主要是哪个if语句块,总觉得应该是:
(defun Y::LIST:for (lst / st)
(foreach n lst
(mapcar '(lambda (x)
(if(equal n x 0.000001)
(progn
(setq st t
lst '()
)
)
);;;;if
)
(setq lst (cdr lst))
)
)
st
)
试了一下,好像都可以,有点不明白啊,让大家见笑啊,还望大家解惑啊,个人觉得foreach 、mapcar函数的用法确实深奥啊
progn的作用是将多个语句连接为一组。
lisp中每个语句的开头都必须是功能函数(运算符也是功能函数)。
if函数内最多只能有两个(组)语句,所以当同一逻辑条件(true或false)下要执行多个语句时就要用progn。
而(setq st t lst '())是一个语句,用不用progn都可以。 谢谢satan421解答啊,我仔细运行了也是这个结论,我一直以为(setq st t lst '())与(setq st t) (setq lst '())是等效的,但在此处不一样,人啊,有些最基本的还真是不懂,再一次感谢耐心讲解啊 此处progn实际上是多余,senq给本来就是可以给多个变量赋值的,连续单个赋值和一次多个赋值是同样的。
progn作用是把一串“语句”串为一句,只返回最后结果,这在某些情况下非常重要,比如if的输出结果,非此即彼,是与非都只有一个结果,这种情况就不能平铺下去,比如:
(if a
(progn
(setq lst (cdr lst))
(reverst lst)
)
(setq lst '())
)
在这里,“是”的结果是两步完成的,就需要progn“连接一下,否则就不是要的答案了。
在这个例题里,我们换一个函数:
(if a
(progn
(setq lst (cdr lst))
(setq nn (car lst))
)
(setq lst '())
)就语法而言,progn同样是需要的,但连续使用setq,实际上也可以写成:
(if a
(setq lst (cdr lst) nn (car lst))
(setq lst '())
)
progn函数常见的普遍使用于if函数的“结果”,但实际上在其它情况下一样有用,比如while函数的条件等等。
大家都讲得比较仔细,谢谢啊
页:
[1]