Cadence Skill中的list是一个 skill 数据对象的有序集合。list 元素可以是任何对象,包括变量、其它 list。一个 list 可以包含任意多个对象(包括空)。一个空的 list 即可以用 “()” 表示,也可以用 “nil” 表示。list必须包含在一个括号内。Lists 可以包含其它 Lists 组成一个复合的数据结构。见下例子: List | 说明 | (1 2 3) | 一个List包含三个整型常数 1,2,3 | (1) | 一个List包含单个元素 1 | ( ) | 空List(也可用nil表述) | (1 (2 3) 4) | 一个List包含另外一个List作为其第二个元素 |
Skill可以显示一个List,List元素必须在括号内。以下的例子将一个List赋值给变量shapeTypeList,然后再得到其变量值: shapeTypeList = ‘( “rect” “polygon” “rect” “line” ) shapeTypeList => ( “rect” “polygon” “rect” “line” ) skill提供了一个丰富的功能用于创建和操纵 List (列表)。许多 Skill 函数可返回List,Skill 可以使用多行来显示List (列表)。Skill 可在 _itemsperline 全局变量中保存适当值。 创建List 使用以下方式可以创建一个 List •使用单引号(‘)逐个指定元素创建 List •使用 list 函数将需要创建的 List 作为 list 函数的入口参数来创建一个List •使用cons函数将一个元素添加到一个已经存在的list 中 •使用append函数合并两个list 注:使用cons和append两个函数将创建一个新的list并返回,必需将返回结果保存在一个变量中,否则新的list后面将不可用。 以下函数允许你以不同的方式构建新的列表,并以不同的方式与现有的列表一起工作。 通过给出的元素创建一个List 使用单引号(‘)创建一个给出确切元素的List。a 和 b 之间并不相干。list 函数通过获取 a 和 b 的值来创建一个包含List 的 List。如下: ‘( 1 2 3 ) => ( 1 2 3 ) a = 1 => 1 b = 2 => 2 list( a b 3 ) => ( 1 2 3 ) 使用 cons 将给出的元素添加到之前的 list 中 必须将 cons 返回值赋给一个变量,否则新的 list 将会丢失 通常情况下,可将结果存储到自身变量,如下: result = ‘( 2 3 ) => ( 2 3 ) //将一个list赋值给result result = cons( 1 result ) => ( 1 2 3 )//将result的值与1相合并,然后再赋值给result 使用 append 函数合并两个list 必须将 append 返回值赋给一个变量,否则新的 list 将会丢失,如下: oneList = ‘( 4 5 6 ) => ( 4 5 6 ) aList = ‘( 1 2 3 ) => ( 1 2 3 ) bList = append( oneList aList) => ( 4 5 6 1 2 3 ) 如果你觉得nil、cons、append函数很难理解,请看下面的问题与答案: Question | Answer | nil与’ (nil)之间有什么区别 | nil 是一个空list,长度是0; ‘ (nil)是创建一个list包含单个元素,长度是1 | 如何在一个list的最后添加一个新的元素 | 使用list函数创建一个包含需要添加元素的List,然后使用append函数与之前的list相合并。 | cons 与 append 之间有什么区别 | cons 函数只需要第二个参数是list,输出的list长度比原始list的长度要长; append 函数需要两个输入参数都必须为 list 。输出list长度是两个输入list长度和。 |
访问Lists Lists在内部被存储为一系列的分支点,可以想象成左边第一个元素为左分支,右边其余的元素为右分支(更多的分支点)。可以使用 car 函数获取左分支的元素,cdr获取右分支的元素(除去第一个元素剩下的右边所有元素)。 检索 List 的第一个元素(car) car 函数返回list的第一元素 numbers = ‘( 1 2 3 ) => ( 1 2 3 ) car( numbers ) => 1 检索list的尾部元素(cdr) numbers = ‘( 1 2 3 ) => ( 1 2 3 ) cdr( numbers ) => ( 2 3 ) 通过索引检索一个元素(nth) nth(0 numbers) 相当于car( numbers). numbers = ‘( 1 2 3 ) => ( 1 2 3 ) nth( 1 numbers ) => 2 确定一个数据是否在list中 (member) member 函数不能搜索所有分级的list,只能查找顶层元素。将查找到的元素及其右分支的所有元素输出。 numbers = ‘( 1 2 3 ) => ( 1 2 3 ) member( 4 numbers ) => nil member( 2 numbers ) => ( 2 3 ) 统计list的元素 (length) length determines the length of a list, array, or association table. length 函数可确定一个list、数组、群丛表的长度 numbers = ‘( 1 2 3 ) => ( 1 2 3 ) length( numbers ) => 3 修改list 以下函数操作的变量将不会改变自身值或者参数新的变量 Coordinates坐标 一个xy坐标是通过包含两个元素的list表示。”:” 可通过x值和y值的创建一个坐标。 xValue = 300 ;x值 yValue = 400 ;y值 aCoordinate = xValue:yValue => ( 300 400 ) The functions xCoord and yCoord access the x coordinate and the y coordinate. xCoord函数和yCoord函数可分别获取坐标的x值和y值 xCoord( aCoordinate ) => 300 yCoord( aCoordinate ) => 400 可通过单引号(‘)或者list函数创建一个包含坐标的list You can use the car function to access the x coordinate and car( cdr ( … ) ) to access the y coordinate. 可通过使用car获取x坐标,car(cdr(…))获取y坐标。 Bounding Boxes(包围盒) A bounding box is represented by a list of the lower-left and upper-right coordinates. Use the list function to build a bounding box that contains 顾名思义,Bounding Boxes 是一个方形区域,可通过一个list表示出来,该list包含两个坐标——左下角和右上角。使用list函数可创建一个 bounding box: _ 通过“:”表示坐标 (. bBox = list( 300:400 500:450 ) _ 通过变量表示坐标. lowerLeft = 300:400 upperRight = 500:450 bBox = list( lowerLeft upperRight ) 可通过使用单引号(‘)创建一个bounding box,但需要逐个给出lists bBox = ‘(( 300 400 ) ( 500 450 )) 使用 car cdr 操作 Bounding Boxes 函数 | 意义 | 例子 | 描述 | car | car( … ) | ll = car( bBox) | 左下角坐标 | cadr | car( cdr( … ) ) | ur= cadr( bBox) | 右上角坐标 | caar | car( car( … ) ) | llx = caar( bBox) | 左下角X坐标 | cadar | car( cdr( car( … ) ) ) | lly = cadar( bBox) | 左下角Y坐标 | caadr | car( car( cdr( … ) ) ) | urx = aadr( bBox) | 右上角X坐标 | cadadr | | ury =cadadr( bBox) | 右上角Y坐标 |
|