ljxkm 发表于 2019-7-15 16:59:07

大家帮忙看一下这个函数

在晓东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函数的用法确实深奥啊

satan421 发表于 2019-7-16 09:03:57

progn的作用是将多个语句连接为一组。
lisp中每个语句的开头都必须是功能函数(运算符也是功能函数)。
if函数内最多只能有两个(组)语句,所以当同一逻辑条件(true或false)下要执行多个语句时就要用progn。
而(setq st t lst '())是一个语句,用不用progn都可以。

ljxkm 发表于 2019-7-16 09:44:25

谢谢satan421解答啊,我仔细运行了也是这个结论,我一直以为(setq st t lst '())与(setq st t) (setq lst '())是等效的,但在此处不一样,人啊,有些最基本的还真是不懂,再一次感谢耐心讲解啊

ll_j 发表于 2019-7-16 10:33:44

此处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函数的条件等等。

ljxkm 发表于 2019-7-16 11:46:45

大家都讲得比较仔细,谢谢啊
页: [1]
查看完整版本: 大家帮忙看一下这个函数