Cadence Skill 论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 35422|回复: 15

关于skill中的list(二)

[复制链接]
发表于 2013-3-27 21:35:14 | 显示全部楼层 |阅读模式

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坐标


发表于 2013-4-8 15:35:54 | 显示全部楼层
我的理解
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)
发表于 2013-5-15 22:37:57 | 显示全部楼层
stillfish 发表于 2013-4-8 15:35
我的理解
cons : 在list中添加一元素 , 添加在前方 , cons(1 '(2 3))
append1 : 在list中添加一元素 , 添 ...

那与tconc的区别大吗,逆序的效率会比tconc的效率高吗,我以前一直是用tconc而且是经常会用到list处理,总觉得应该找一个效率高的函数,请赐教。
发表于 2013-7-17 16:33:41 | 显示全部楼层
学习了,真好
发表于 2014-3-8 14:17:22 | 显示全部楼层
感谢楼主,求继续更新,好好东西啊
发表于 2016-1-28 10:49:31 | 显示全部楼层
感谢楼主提供这样的好东西 可以学习
发表于 2016-5-13 10:44:30 | 显示全部楼层
感谢楼主提供这样的好东西 可以学习
发表于 2016-6-7 10:24:13 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
发表于 2017-6-7 21:05:11 | 显示全部楼层
万分感谢楼主分享,这个真是干货
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|网站地图|Cadence Skill 论坛 ( 蜀ICP备13024417号 )

GMT+8, 2024-4-26 21:12 , Processed in 0.157163 second(s), 19 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表