明经通道 发表于 2012-11-9 22:14

第九章 映射和循环函数

第九章 映射和循环函数
AutoLISP提供了大量强大的映射和循环函数,如(while)、(foreach)、(mapcar)和(apply)。而Visual LISP也增加了一些更适合用于与ActiveX集合对象的函数。这些函数包括有(vlax-for)、(vl-every)和(vlax-map-collection)等等。

(vlax-map-collection object function)
应用function到集合对象的成员(对象),如果对象不是集合,则生成错误。

参数:
Object 代表集合的vla对象。
Function 用于对象的符号或lambda表达式。

示例:
(setq docs (vla-get-documents (vlax-get-acad-object)))
(vlax-map-collection docs ‘vlax-dump-object)
这将重复每个已打开文件并列表所有特性...
; IAcadDocument: An AutoCAD drawing
; 特性值:
; Active (RO) = -1
; ActiveDimStyle = #<VLA-OBJECT IAcadDimStyle 046bb644>
; ActiveLayer = #<VLA-OBJECT IAcadLayer 046bbd84>
; ActiveLayout = #<VLA-OBJECT IAcadLayout 046b8a64>
; ActiveLinetype = #<VLA-OBJECT IAcadLineType 046b89b4>
… 还有其它…

(vlax-for symbol collection ]…)
循环集合的成员对象并对每一成员对象执行语句。如果第二个参数不是集合对象,将生成错误。引用的symbol是局部的和临时的,就如(foreach)一样。

参数:
Symbol 指定给集合中每个vla对象的符号。
Collection 代表集合的vla对象
Expressions 求值的一个或多个语句(可选项)

示例:
(setq acad (vlax-get-acad-object))
(setq layers (vla-get-layers (vla-get-activedocument acad)))
(vlax-for eachLayer layers
(princ (vla-get-name eachLayer))
(terpri)
)
这将在命令提示处列出活动图形中所有图层的名称。

(vl-position item list)
找到时返回在list中item的第n个位置。如果list中未找到item,则返回nil。第一元素的位置索引为零(0)。

参数:
Item任何符号或值。
List值或符号列表。

示例:
(setq mylist ‘(“A” “B” “C”))
(vl-position “B” mylist) 返回 1
(vl-position “b” mylist) 返回 nil

(vl-every predicate-function list ...)
vl-every 函数将每个表的第一个元素作为参数(如果有多个表则形成参数表)传递给测试函数,然后传递每个表中的下一个元素,以此类推,直至其中一个表到达结束处为止。

参数:
Predicate-function测试函数。它可以是任何一个函数:参数个数和 vl-every 提供的表的个数一致,且对任何用户指定条件返回T。如果 predicate-function 结合每个元素后均返回非 nil 值,函数返回 T,否则返回 nil。

predicate-function 的值可以采用下列格式之一:
■符号(函数名)
■(function(lambda(A1 A2)...))

List(s) 被测试的列表。

示例:
在给定的文件夹中检查大于1024字节的文件:
(vl-every
(function
    (lambda (filename)
      (> (vl-file-size filename) 1024)
    )
)
(vl-directory-files nil nil 1)
)
T
对比两个表...
(vl-every '= '(1 2) '(1 3))
返回 nil
(vl-every '= '(1 2) '(1 2 3))
返回 T

第一个表达式返回 nil,因为 vl-every 比较两个表中的第二个元素,而它们在数值上并不相等。第二个表达式返回 T,因为 vl-every 在处理完较短的表 (1,2) 中所有元素后即停止比较,而直到这时为止,两个表是相等的。如果到达了表的结束处,则 vl-every 返回非 nil 值。

_$ (setq list1 (list 1 2 3 4))
(1 2 3 4)
_$ (setq list2 nil)
nil
_$ (vl-every '= list2 list1)
T
返回值为 T,因为 vl-every 处理 nil 表时,假定已经到达了表的结束处(尽管没有对其中任何元素应用论断)。既然如此,vl-every 将返回非 nil 值。



http://bbs.mjtd.com/xwb/images/bgimg/icon_logo.png 该贴已经同步到 明经通道的微博

smartstar 发表于 2012-11-10 12:39

持续关注中!

zyhandw 发表于 2012-11-29 08:59

这些函数还没用过,努力学习

董堃 发表于 2012-12-15 09:14

这些函数还没用过,努力学习中

ltrliu 发表于 2015-8-11 14:42

新人学习中

zjh2785 发表于 2017-10-12 15:38

继续支持....个人这方面的知识还是比较欠缺的,学习了

雨的节奏 发表于 2019-10-16 15:02

这些函数还没用过,努力学习中

丶吟游诗人灬 发表于 2023-4-8 16:43

循环函数是很熟悉了 但是 映射这个词第一次接触好奇

丶吟游诗人灬 发表于 2023-4-8 17:12

vl-every这个有点烧脑啊
页: [1]
查看完整版本: 第九章 映射和循环函数