您的代码:
返回按z坐标递增排序的点列表。
但是,while循环(仅考虑第一个示例)永远不会计算测试表达式后面的表达式:
由于测试表达式将在第一次评估时返回nil:“而第一项的z坐标大于或等于第二项的z坐标”。只有当列表中的项具有相等的整数z坐标时,该语句才为真(因为列表是按z坐标值的递增顺序排序的,并且由于双精度浮点格式,double很少真正相等)。
然而,由于您正在寻找给定排序标准的极值,因此不需要排序(我们不关心剩余值的顺序),因此,代码可以变成:
示例:
- (defun getminmax ( lst / maz miz rtn zco )
- (setq rtn (list (list (car lst)) (list (car lst)))
- miz (caddar lst)
- maz miz
- )
- (foreach itm (cdr lst)
- (setq zco (caddr itm))
- (cond
- ( (equal miz zco 1e-
- (setq rtn (cons (cons itm (car rtn)) (cdr rtn)))
- )
- ( (equal maz zco 1e-
- (setq rtn (reverse (cons (cons itm (cadr rtn)) (cdr (reverse rtn)))))
- )
- ( (< (caddr itm) miz)
- (setq rtn (cons (list itm) (cdr rtn))
- miz zco
- )
- )
- ( (< maz (caddr itm))
- (setq rtn (reverse (cons (list itm) (cdr (reverse rtn))))
- maz zco
- )
- )
- )
- )
- rtn
- )
|