明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 360|回复: 4

[讨论] 大家帮忙看一下这个函数

[复制链接]
发表于 2019-7-15 16:59 | 显示全部楼层 |阅读模式
在晓东CAD上见到的一个自定义Lisp函数:
                                                        功能判断表是否存在相同元素找到相同马上退出返回T‘代码是
            (defun Y:IST: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:IST: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函数的用法确实深奥啊

"觉得好,就打赏"
还没有人打赏,支持一下
发表于 2019-7-16 09:03 | 显示全部楼层
progn的作用是将多个语句连接为一组。
lisp中每个语句的开头都必须是功能函数(运算符也是功能函数)。
if函数内最多只能有两个(组)语句,所以当同一逻辑条件(true或false)下要执行多个语句时就要用progn。
而(setq st t lst '())是一个语句,用不用progn都可以。
 楼主| 发表于 2019-7-16 09:44 | 显示全部楼层
谢谢satan421解答啊,我仔细运行了也是这个结论,我一直以为(setq st t lst '())与(setq st t) (setq lst '())是等效的,但在此处不一样,人啊,有些最基本的还真是不懂,再一次感谢耐心讲解啊
发表于 2019-7-16 10:33 | 显示全部楼层
此处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函数的条件等等。
 楼主| 发表于 2019-7-16 11:46 | 显示全部楼层
大家都讲得比较仔细,谢谢啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-3-28 16:01 , Processed in 0.179057 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表