关于skill中的list(二)
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 => 1b = 2 => 2list( a b 3 ) => ( 1 2 3 )使用 cons 将给出的元素添加到之前的 list 中必须将 cons 返回值赋给一个变量,否则新的 list 将会丢失通常情况下,可将结果存储到自身变量,如下: result = ‘( 2 3 ) => ( 2 3 ) //将一个list赋值给resultresult = 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函数很难理解,请看下面的问题与答案:
QuestionAnswer
nil与’ (nil)之间有什么区别nil 是一个空list,长度是0;‘ (nil)是创建一个list包含单个元素,长度是1
如何在一个list的最后添加一个新的元素使用list函数创建一个包含需要添加元素的List,然后使用append函数与之前的list相合并。
cons 与 append 之间有什么区别cons 函数只需要第二个参数是list,输出的list长度比原始list的长度要长;append 函数需要两个输入参数都必须为 list 。输出list长度是两个输入list长度和。
访问ListsLists在内部被存储为一系列的分支点,可以想象成左边第一个元素为左分支,右边其余的元素为右分支(更多的分支点)。可以使用 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 ) => nilmember( 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 ) => 300yCoord( aCoordinate ) => 400可通过单引号(‘)或者list函数创建一个包含坐标的list You can use the car function to access the x coordinate and car( cdr ( … ) ) to accessthe 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:400upperRight = 500:450bBox = list( lowerLeft upperRight )可通过使用单引号(‘)创建一个bounding box,但需要逐个给出listsbBox = ‘(( 300 400 ) ( 500 450 ))使用 carcdr操作 Bounding Boxes
函数意义例子描述
carcar( … )ll = car( bBox)左下角坐标
cadrcar( cdr( … ) )ur= cadr( bBox)右上角坐标
caarcar( car( … ) )llx = caar( bBox)左下角X坐标
cadarcar( cdr( car( … ) ) )lly = cadar( bBox)左下角Y坐标
caadrcar( car( cdr( … ) ) )urx = aadr( bBox)右上角X坐标
cadadrury =cadadr( bBox)右上角Y坐标
我的理解
cons : 在list中添加一元素 , 添加在前方 , cons(1 '(2 3))
append1 : 在list中添加一元素 , 添加在後方 , append1('(2 3) 4)
append : 在list中添加上另一個list的所有元素 , 添加在後方 , append('(2 3) '(4 5))
但是因為 append1, append效率較差 , 如果程式需要在迴圈中逐一添加單一元素 , 添加在後方 ,
可先使用cons添加 , 最後再reverse反轉
x = nil
for( i 1 100 x = cons( i x )) => t
x => (100 99 98 .. 2 1)
x = reverse( x ) => (1 2 3 .. 100) stillfish 发表于 2013-4-8 15:35 static/image/common/back.gif
我的理解
cons : 在list中添加一元素 , 添加在前方 , cons(1 '(2 3))
append1 : 在list中添加一元素 , 添 ...
那与tconc的区别大吗,逆序的效率会比tconc的效率高吗,我以前一直是用tconc而且是经常会用到list处理,总觉得应该找一个效率高的函数,请赐教。 学习了,真好 感谢楼主,求继续更新,好好东西啊 感谢楼主提供这样的好东西 可以学习 继续学习 感谢楼主提供这样的好东西 可以学习 万分感谢楼主分享,这个真是干货
页:
[1]
2