Costinbos77 发表于 2022-7-6 06:54:05

完成和评估

你好
 
也可以写入以下表达式:
 

(foreach el (list 'Length 'Circumference 'ArcLength)
(if (vlax-property-available-p vobi el) (setq per (vlax-get-property vobi el) )) )

 
停止对第一个真实答案列表的评估?

Lee Mac 发表于 2022-7-6 06:58:52

我不太明白这个问题,但也许:
(vl-some
'(lambda ( x ) (if (vlax-property-available-p vobi x) (vlax-get-property vobi x)))
'(length circumference arclength)
)

MSasu 发表于 2022-7-6 07:03:49

Lee,我相信这正是Costinbos77所要寻找的——一种End Foreach语句(例如类似于VB中的End for),它将在第一次遇到满足特定条件的项时中止评估周期。
 
我提议这样做是为了证明两者的区别:
(progn (foreach x '(1 2 5 3 5 4 5) (if (eq x 5) (print T) (print nil))) (princ))vs。
(progn (vl-some '(lambda(x) (if (eq x 5) (print T) (print nil))) '(1 2 5 3 5 4 5)) (princ))

Costinbos77 发表于 2022-7-6 07:12:27

谢谢你的回复。
 
我重新制定了要求。
 
vl某些函数将停止计算第一个真实响应?
 
因为foreach函数计算整个项目列表。

Lee Mac 发表于 2022-7-6 07:14:46

 
正确-请参阅上面MSasu提供的演示。

Costinbos77 发表于 2022-7-6 07:19:32

我试着表达:

(progn (vl-some '(lambda(x) (princ "\n") (princ (if (= x 5) (setq a x) "NO")) (princ ";")) '(1 2 5 3 5 4 5)) (princ))

 
结果是:
 

NO; ' Only one! Supposed to be two.'
...

and

a = nil

 
似乎评估在第一个错误时停止。我需要反转,首先是真的。

MSasu 发表于 2022-7-6 07:24:09

我相信这就是你想要得到的:
(vl-some '(lambda(x) (princ "\n") (princ (if (= x 5) (progn (setq a x) "Done")))) '(1 2 5 3 5 4 5))

Lee Mac 发表于 2022-7-6 07:30:33

考虑这个例子:
_$ (vl-some '(lambda ( x ) (print x) (= x 5)) '(0 1 2 5 3 4 5))
0
1
2
5 T

Costinbos77 发表于 2022-7-6 07:35:07

似乎:
 

(vl-some '(lambda(x) (princ "\n") (princ (if (= x 5) (setq a x) vvv)) (princ ";")) '(1 2 5 3 5 4 5))

 
如果vvv/=nil,停止评估lambda函数。

MSasu 发表于 2022-7-6 07:39:32

您的代码将在第一项停止求值,因为由于最后一次求值(PRINC),LAMBDA函数将始终返回T!你测试了7号帖子上提出的更正吗?
页: [1] 2
查看完整版本: 完成和评估