SKILL语言入门语言入门语言入门语言入门
From: www.PCBSkill.com/wiki
Write-By: Edward, Laikelang,
TrizDev, WolfWang
Revision History:
2009-08-19 第一部分第一章完成
第一部分第一章完成第一部分第一章完成
第一部分第一章完成
2009-08-20 第一部分第二章完成
第一部分第二章完成第一部分第二章完成
第一部分第二章完成
2009-08-23 第一部分第三章完成
第一部分第三章完成第一部分第三章完成
第一部分第三章完成
2009-08-23 第一部分第四章完成
第一部分第四章完成第一部分第四章完成
第一部分第四章完成
2009-08-23 第一部分第五章完成
第一部分第五章完成第一部分第五章完成
第一部分第五章完成
PCBSkill
第 1 页
www.pcbskill.com
SKILL语言基础
目录目录目录目录
1 SKILL语言基础 ................................................................................................................................................ 1
1.1 SKILL语言简介 .................................................................................................................................... 1
1.1.1 语法格式 ................................................................................................................................... 1
1.1.2 简单的 SKILL运行环境 ........................................................................................................... 1
1.1.3 LOAD SKILL .............................................................................................................................. 2
1.1.4 注释 ........................................................................................................................................... 2
1.1.5 基本的数据类型 ....................................................................................................................... 3
1.1.6 变量 ........................................................................................................................................... 3
1.1.7 操作符 ....................................................................................................................................... 3
1.1.8 输出数据 ................................................................................................................................... 3
1.1.9 错误信息 ................................................................................................................................... 4
1.1.10 总结 ........................................................................................................................................... 5
1.2 List数据类型 ........................................................................................................................................ 6
1.2.1 创建 List数据 ........................................................................................................................... 6
1.2.2 List在内存中的储存方式 ........................................................................................................ 6
1.2.3 读取 List元素 ........................................................................................................................... 7
1.2.4 修改 List单元 ........................................................................................................................... 8
1.2.5 添加 List元素和合并 List ........................................................................................................ 9
1.2.6 List元素排序 .......................................................................................................................... 10
1.2.7 查找 List元素 ......................................................................................................................... 10
1.2.8 过滤 List元素 ......................................................................................................................... 11
1.2.9 移除 List元素 ......................................................................................................................... 11
1.2.10 遍历 List元素 ......................................................................................................................... 11
1.2.11 遍历 List元素实例 ................................................................................................................. 13
1.3
流程
快递问题件怎么处理流程河南自建厂房流程下载关于规范招聘需求审批流程制作流程表下载邮件下载流程设计
控制................................................................................................................................................... 15
1.3.1 逻辑值(t, nil) ................................................................................................................................. 15
1.3.2 分支控制 ....................................................................................................................................... 15
1.3.3 循环控制(while,for,foreach) ......................................................................................................... 17
1.3.4返回命令(return) ............................................................................................................................ 18
1.3.5 总结 ............................................................................................................................................... 18
1.4 函数 .......................................................................................................................................................... 19
1.4.1 程序块 ........................................................................................................................................... 19
1.4.2 函数定义 ....................................................................................................................................... 19
1.4.3 局部变量和全局变量 ................................................................................................................... 20
1.4.4 函数调用与返回值 ....................................................................................................................... 20
1.4.5 总结 ............................................................................................................................................... 20
1.5 文件操作 ............................................................................................................................................. 21
1.5.1文件操作 ........................................................................................................................................ 21
1.5.2读文件(infile, gets, fscanf) ............................................................................................................. 21
1.5.3写入文件(outfile, fprintf) ............................................................................................................... 21
1.5.4总结 ................................................................................................................................................ 21
PCBSkill
第 1 页 / 共 1 页
SKILL语言基础
www.pcbskill.com
1 SKILL语言基础语言基础语言基础语言基础
1.1 SKILL语言简介语言简介语言简介语言简介
SKILL 是用于 Cadence 软件二次开发的语言。我们关于 SKILL 的介绍基于 SKILL 语言参考文档和
Allegro SKILL的应用。
1.1.1 语法格式语法格式语法格式语法格式
SKILL语法支持 lisp格式的语法,但是我们不推荐,推荐类 C的语法格式。
Lisp示例:(max 5 3) => 5
C示例:max(5 3) => 5
Max是求最大值的函数,lisp格式的不便阅读。
1.1.2 简单的简单的简单的简单的 SKILL运行环境运行环境运行环境运行环境
Allegro的 SKILL运行环境:在 Allegro的命令窗口输入 set telskill就可以打开一个新的窗口,这个
窗口就可以用来运行 SKILL命令。窗口的大小可以手动调节。
PCBSkill
第 2 页 / 共 2 页
SKILL语言基础
www.pcbskill.com
1.1.3 LOAD SKILL
如上图所示,可以直接在 SKILL development里面运行 SKILL命令,但是更多的是把写好的代码放
在一个文件里面,用 load命令一次性装载。
在说明 load之前,先说一下 getSkillPath和 setSkillPath这 2个函数。因为 load要找到 SKILL文件
来装载,通常我们都不喜欢通过绝对路径来装载一个文件,因为那样包含的字符太多了。getSkillPath()
将得到当前 Allegro 设置的 SKILL 加载路径,而 setSkillPath 用来指定加载路径。目前先不用考虑这个
setSkillPath。
我的 Allegro当前默认的 SKILL路径是 Allegro的工作路径和 C:\home\pcbenv\skill。
这样我先把 hello.il文件放在 C:\home\pcbenv\skill\下面,下一步来加载这个文件,然后运行定义的
函数。
Hello.il的源代码:
procedure( hello()
let( ()
println("Hello World!")
)
); end procedure
1.1.4 注释注释注释注释
SKILL支持 2种注释方式
a. /* … */ 用于注释多行,像 C一样
b. ; 用于注释单行,类似 C的//
PCBSkill
第 3 页 / 共 3 页
SKILL语言基础
www.pcbskill.com
1.1.5 基本的数据类型基本的数据类型基本的数据类型基本的数据类型
integer 5
float 5.0
string "abc defg"
list '(1 2 3 "a")
boolen t/nil
1.1.6 变量变量变量变量
SKILL的变量定义比较随便,不需要指定其类型,赋什么类型的值就是什么类型。
示例:
变量名可以包含字母、数字、下划线以及问号,数字和问号不可以作为变量的第一个字符。不过为
了
规范
编程规范下载gsp规范下载钢格栅规范下载警徽规范下载建设厅规范下载
编程和方便阅读,对于不同类型的数据的变量都使用简写的方式来代
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
,比如定义一个浮点数的
变量,那么推荐使用 f作为前缀。如 fPrice,lCoordinate,sMessage,iAge/nAge,bCheck...
1.1.7 操作符操作符操作符操作符
数学运算 +
++
+, -
--
-, *, /
//
/, ++
++++
++, **
比较运算 >, <, =, >=, <=, ==
逻辑运算 ||, &&, !
赋值 =
1.1.8 输出数据输出数据输出数据输出数据
示例:
PCBSkill
第 4 页 / 共 4 页
SKILL语言基础
www.pcbskill.com
%d --- integer,%f --- float,%s --- string,%L---多种数据格式
1.1.9 错误信息错误信息错误信息错误信息
像调试其它程序一样,调试 SKILL也需要仔细看清楚出错时的错误提示信息。
比如:
这个错误是说 load命令没有定义,这个是新手长会碰到的一个问
题
快递公司问题件快递公司问题件货款处理关于圆的周长面积重点题型关于解方程组的题及答案关于南海问题
,就是在 Allegro的 cmd窗口直
接调试 SKILL函数,而实际上这是不行的,SKILL命令需要运行在 SKILL环境下,简单点就是在 cmd窗
口下输入 skill回车,然后再 load,如下所示:
这个错误是说类型不匹配,查阅 SKILL Language Reference(sklangref.pdf)会发现函数 strcat只适
用操作字符串类型的数据。
PCBSkill
第 5 页 / 共 5 页
SKILL语言基础
www.pcbskill.com
1.1.10 总结总结总结总结
到目前为止,你应该对 SKILL有一点点基本的认识了。那么你会:
打开 Allegro的 SKILL调试窗口了吗?
知道有几种基本的数据类型吗?
知道怎么输出各种类型的数据吗?
知道怎么定义变量吗?你的变量容易被人阅读/识别吗?
找几个 SKILL Language Reference里面的函数在调试窗口里面运行吗?
函数执行出现错误,知道问题出在哪里并会解决吗?
PCBSkill
第 6 页 / 共 6 页
SKILL语言基础
www.pcbskill.com
1.2 List数据类型数据类型数据类型数据类型
List是 Cadence SKILL中常用的数据类型。可以把 List理解为一个数据结构表,它可以是空的,也
可以有多种类型的常量组成的列表。
例如:'( 1 2 a b c "PCB" )
在上面这个 List中包含的数据有整数、字符、字符串。
在 List中也可以包含 List类型的数据。
例如:'( 1 ( 2 a a ) b )
1.2.1 创建创建创建创建 List数据数据数据数据
创建新的 List数据可以用单引号 ' 或者函数 list来新建一个 List数据类型的变量。例如:
aList = '( 1 2 a b c) => (1 2 a b c)
bList = list( 1 2 'a 'b 'd) => (1 2 a b d)
cList = '( 1 ( 2 a a ) b ) => (1 (2 a a) b)
注意:当有字符出现的时候,用 list函数创建必须在字符前加单引号。
1.2.2 List在内存中的储存方式在内存中的储存方式在内存中的储存方式在内存中的储存方式
我们可以把 List看做是一个 List单元,其中一个 List单元占用两个内存位置。这样便于理解。
� 第一个位置保存 List的首个数据元素
� 第二个位置保存后面的 List单元(除第一个元素之外的所有元素组成的表),它可以为空数据。
用 car函数可以得到保存在第一个位置的 List元素:
car( aList) => 2
用 cdr函数可以得到保存在第二个位置的 List单元:
cdr( aList) => (3 4)
List中可以包含有子 List,例如:
bList = '( 1 ( 2 3 4 ) 5 ) => (1 (2 3 4) 5)
bList在内存中的储存方式如下图所示:
PCBSkill
第 7 页 / 共 7 页
SKILL语言基础
www.pcbskill.com
List中可以同时包含 List和字符,例如:
bList = '( 1 ( 2 a a ) b ) => (1 (2 a a) b)
bList在内存中的储存方式如下图所示:
1.2.3 读取读取读取读取 List元素元素元素元素
1)
))
) 读取
读取读取
读取 List中的第一个元素
中的第一个元素中的第一个元素
中的第一个元素
使用 car函数可以读取 List中的第一个元素。
例:
car( '(a b c) ) => a
z = '(1 2 3) => (1 2 3)
y = car(z) => 1
y => 1
z => (1 2 3)
car(nil) => nil
2)
))
) 读取
读取读取
读取 List中
中中
中后面的
后面的后面的
后面的 List单元
单元单元
单元
使用 cdr函数可以读取 List中后面的 List单元。
例:
cdr( '(a b c) ) => (b c)
PCBSkill
第 8 页 / 共 8 页
SKILL语言基础
www.pcbskill.com
z = '(1 2 3)
cdr(z) => (2 3)
3)
))
) 对
对对
对 List重复混合使用
重复混合使用重复混合使用
重复混合使用 car或者
或者或者
或者 cdr函数读取
函数读取函数读取
函数读取
car 和 cdr 函数混合使用,组合的格式为:ca|d[ a|d ][ a|d ][ a|d ]r,以 c 开头,r 结尾,
中间可以由多个 a或 d组成函数。例如:caadr功能等同于 car( car( cdr( l_list))),caadr函数
对 List的操作顺序为:
1. 先执行一次 cdr,读取后面的 List单元。
2. 对第 1步读取的值,执行 car,读取其第一元素。
3. 对第 2步读取的值,执行 car,读取其第一元素。
实例:
caaar('(((1 2 3)(4 5 6))(7 8 9))) => 1
等同于 car( car( car( l_list)))
caadr('(((1 2 3)(4 5 6))(7 8 9))) => 7
等同于 car( car( cdr( l_list)))
caar('(((1 2 3)(4 5 6))(7 8 9))) => (1 2 3)
等同于 car( car( l_list))
cadr('(1 2 3)) => 2
等同于 car( cdr( l_list))
4)
))
) 按元素序号读取
按元素序号读取按元素序号读取
按元素序号读取 List中的元素
中的元素中的元素
中的元素
用 nthelem 并输入所有读取的元素序号,即可读取该编号位置的元素。如 nthelem(1 l_list)等
同于 car(l_list)。实例:
nthelem( 1 '( a b c ) ) => a
z = '( 1 2 3 )
nthelem( 2 z ) => 2
类似的函数还有 nthcdr。实例:
nthcdr( 3 '( a b c d )) => (d)
z = '( 1 2 3 )
nthcdr( 2 z ) => ( 3 )
5)
))
) 读取
读取读取
读取 List中最后一个
中最后一个中最后一个
中最后一个 List单元
单元单元
单元
用 last函数可以读取 List中最后一个元素单元,其数据类型也是一个 List。实例:
last( '(a b c) ) => (c)
z = '( 1 2 3 )
last( z ) => (3)
1.2.4 修改修改修改修改 List单元单元单元单元
1)
))
) rplaca函数
函数函数
函数
用 rplaca函数可以替换 List中的第一个元素。
aList = '( 1 2 3) => ( 1 2 3 )
bList = rplaca( aList 4 ) => ( 4 2 3 )
PCBSkill
第 9 页 / 共 9 页
SKILL语言基础
www.pcbskill.com
aList => ( 4 2 3 )
eq( aList bList ) => t
2)
))
) rplacd函数
函数函数
函数
用 rplacd函数可以替换 List中后面的 List单元。
aList = '( 1 2 3 ) => ( 1 2 3 )
bList = rplacd( aList '( 4 5 ) ) => ( 1 4 5 )
aList => ( 1 4 5 )
eq( aList bList ) => t
1.2.5 添加添加添加添加 List元素元素元素元素和合并和合并和合并和合并 List
1)
))
) 在
在在
在 List前添加元素
前添加元素前添加元素
前添加元素(
((
(cons,
,,
,xcons)
))
)
用 cons函数可以添加元素到 List前。
aList = '( 2 3 4 )
aList = cons( 1 aList ) => (1 2 3 4 )
xcons 函数和 cons 函数的功能一样,但格式有所区别,前面的变量为 List,后面的变量为添加的元
素。
xcons( '( b c ) 'a ) => ( a b c )
2)
))
) 在
在在
在 List后添加元素
后添加元素后添加元素
后添加元素(
((
(append1)
))
)
用 append1函数可以添加元素到 List后。
append1('(1 2 3) 4) => (1 2 3 4)
3)
))
) 合并
合并合并
合并 List(
((
(ncons,
,,
,append)
))
)
cList = '( 1 2 )
dList = '( 3 4 5 )
eList = '( 6 7 )
append( cList dList ) => ( 1 2 3 4 5 )
cList => ( 1 2 )
PCBSkill
第 10 页 / 共 10 页
SKILL语言基础
www.pcbskill.com
dList => ( 3 4 5 )
append函数只能合并两个 List,并且不改变所合并 List变量的值。
nconc( cList dList eList ) => ( 1 2 3 4 5 6 7 )
cList => ( 1 2 3 4 5 6 7 )
dList => ( 3 4 5 6 7 )
eList => ( 6 7 )
nconc函数可以合并多个 List,但会改变所合并 List变量的值。
1.2.6 List元素排序元素排序元素排序元素排序
1)
))
) 倒序排列
倒序排列倒序排列
倒序排列(
((
(reverse)
))
)
aList = '( 1 2 3 )
aList = reverse( aList ) => ( 3 2 1 )
anotherList = '( 1 2 ( 3 4 5 ) 6 )
reverse( anotherList ) => ( 6 ( 3 4 5 ) 2 1 )
anotherList => ( 1 2 ( 3 4 5 ) 6 )
2)
))
) 按条件排序
按条件排序按条件排序
按条件排序(
((
(sort)
))
)
sort的书写格式为:sort(l_data u_comparefn),其中第一个变量 l_data为 List变量,第二个变
量 u_comparefn为对比函数。对比函数也可以是自定义函数。
sort( '(4 3 2 1) 'lessp ) => (1 2 3 4)
sort( '(d b c a) 'alphalessp) => (a b c d)
sort('("U5" "U10" "U1" "U5" "U2") 'axlStrcmpAlpNum)
=> ("U1" "U2" "U5" "U5" "U10")
当 List元素都是由 List组成的时候,还可以使用 sortcar函数对比子 List的第一个元素排序。
sortcar( '((4 four) (3 three) (2 two)) 'lessp )
=> ((2 two) (3 three) (4 four)
sortcar( '((d 4) (b 2) (c 3) (a 1)) nil )
=> ((a 1) (b 2) (c 3) (d 4))
1.2.7 查找查找查找查找 List元素元素元素元素
1)
))
) member函数
函数函数
函数
member 函数从 List 第一个元素查找到最后,如果找到返回找到的元素开始直到最后的元素,找不
到返回 nil。
member( 3 '( 2 3 4 3 5 )) => (3 4 3 5)
member( 6 '( 2 3 4 3 5 )) => nil
2)
))
) assoc函数
函数函数
函数
assoc函数的书写格式为:assoc(g_key l_alist),g_key变量为所查找的关键值,l_alist是为一
个由多个 List组成的 List,格式为:((key1 value1) (key2 value2) (key3 value3) ...)。assco返回查找到的子
List。
aList = '(( 1 "one" )( 2 "two" )( 3 "three" ))
PCBSkill
第 11 页 / 共 11 页
SKILL语言基础
www.pcbskill.com
assoc( 2 aList ) => ( 2 "two" )
assoc( 5 aList ) => nil
1.2.8 过滤过滤过滤过滤 List元素元素元素元素
1)
))
) 按条件过滤
按条件过滤按条件过滤
按条件过滤 List元素
元素元素
元素(setof)
setof函数的书写格式为:setof( s_formalVar l_valueList g_predicateExpression ),
其中 s_formalVar变量为局部变量,作用于 g_predicateExpression表达式中;l_valueList变量为要过滤的
List变量;g_predicateExpression变量为自定义表达式。setof函数会把 l_valueList变量中的所有元素,遍
历赋值给 s_formalVar局部变量,带入到 g_predicateExpression表达式中,如果表达式返回的值为 nil,在
输出的新 List中会将其元素过滤。
setof( x '(1 2 3 4) (x > 2) ) => (3 4)
setof( x '(1 2 3 4) (x < 3) ) => (1 2)
setof( x '( 1 2 3 4 5 6 ) oddp(x)) => ( 1 3 5 )
2)
))
) exists函数
函数函数
函数
exists函数和 setof函数区别在于 exists函数查找 List中满足条件的第一个元素,并返回其元素和其
余元素组成的新 List。
exists( x '(1 2 3 4) (x > 2) ) => (3 4)
exists( x '(4 3 4 5) (x < 4) ) => (3 4 5)
exists( x '(1 2 3 4) (x > 4) ) => nil
3)
))
) forall函数
函数函数
函数
forall函数判断 List中所有的元素是否全部满足表达式,全部满足返回 t,不是就返回 nil。
forall( x '(1 2 3 4) (x > 0) )=> t
forall( x '(1 2 3 4) (x < 4) )=> nil
forall( x '( 2 4 6 8 ) evenp( x ) ) => t
forall( x '( 2 4 7 8 ) evenp( x ) ) => nil
1.2.9 移除移除移除移除 List元素元素元素元素
1)
))
) remove函数
函数函数
函数
remove函数可以移除 List中所指定的元素,如果 List中没有所指定的元素,那么返回原 List。remove
函数不会改变原 List变量的值。
aList = '( 1 2 3 4 5 )
remove( 3 aList ) => ( 1 2 4 5 )
aList => ( 1 2 3 4 5 )
remove( '( 1 2 ) '( 1 ( 1 2 ) 3 )) => ( 1 3 )
1.2.10 遍历遍历遍历遍历 List元素元素元素元素
1)
))
) foreach函数
函数函数
函数
PCBSkill
第 12 页 / 共 12 页
SKILL语言基础
www.pcbskill.com
foreach( x '(1 2 3 4) println(x))
1
2
3
4
=> (1 2 3 4)
foreach( (x y) '(1 2 3) '(4 5 6) (println x+y))
5
7
9
=> (1 2 3)
2)
))
) mapc函数
函数函数
函数
mapc( 'list '(1 2 3) '(9 8 7) ) => (1 2 3)
mapc( '(lambda (x y) (print (list x y))) '(1 2 3) '(9 8 7) )
(1 9) (2 8) (3 7)
=> (1 2 3)
3)
))
) map函数
函数函数
函数
map( 'list '(1 2 3) '(9 8 7) )
=> (1 2 3)
map( '(lambda (x y) (print (append x y))) '(1 2 3) '(9 8 7) )
(1 2 3 9 8 7) (2 3 8 7) (3 7)
=> (1 2 3)
4)
))
) mapcar函数
函数函数
函数
mapcar( 'plus '(1 2 3) '(9 8 7) )
=> (10 10 10)
mapcar( 'list '(a b c) '(1 2 3) '(x y z) )
=> ((a 1 x) (b 2 y) (c 3 z))
mapcar( 'lambda( (x) plus( x 1 )) '(2 4 6) )
=> (3 5 7)
5)
))
) maplist函数
函数函数
函数
maplist( 'length '(1 2 3) )
=> (3 2 1)
maplist( 'list '(a b c) '(1 2 3) )
=> (((a b c)(1 2 3))((b c)(2 3))((c)(3)))
6)
))
) mapcan函数
函数函数
函数
mapcan( 'list '(1 2 3) '(a b c) )
=> (1 a 2 b 3 c)
mapcan( (lambda (n) (and (plusp n) (list n))) '(1 -2 3 -4 5))
=> (1 3 5)
PCBSkill
第 13 页 / 共 13 页
SKILL语言基础
www.pcbskill.com
1.2.11 遍历遍历遍历遍历 List元素元素元素元素实实实实例例例例
1)
))
) 得到
得到得到
得到 List中字符串的长度
中字符串的长度中字符串的长度
中字符串的长度
假设,有一个由字符串元素组成的 List变量 stringList:
下面写一段代码,它的功能是输出 stringList中每个字符串元素的字符长度:
如果在没有熟悉 mapcar函数的情况下,可能会使用以下代码:
使用 mapcar函数的代码:
其实 mapcar函数就已经包含遍历 List的功能,可以简化代码如下:
2)
))
) 将
将将
将 List中的所有元素
中的所有元素中的所有元素
中的所有元素(
((
(包括子
包括子包括子
包括子 List中的元素
中的元素中的元素
中的元素)
))
)重新组合成新
重新组合成新重新组合成新
重新组合成新 List
假设,有一个由 List组成的 List变量 x:
下面写一个函数 flatten,它的功能是将 List中的所有元素重新组合成新 List,如下:
下面用 mapcan函数,代码如下:
flatten( x ) => ( 1 2 3 4 5 6 7 8 9 )
x = '( (1 2 3) (4) (5 6 7 8) () (9) )
=> ( 3 7 4 )
stringList = ( "sam" "francis" "nick" )
procedure( string_lengths( stringList )
mapcar( 'strlen stringList )
) ; procedure
procedure( string_lengths( stringList)
foreach( mapcar element stringList
strlen( element)
) ; foreach
) ; procedure
procedure( string_lengths( stringList )
let( (result)
foreach( element stringList
result = cons( strlen(element) result)
) ; foreach
reverse( result )
) ; let
) ; procedure
PCBSkill
第 14 页 / 共 14 页
SKILL语言基础
www.pcbskill.com
但上面的代码有一个问题,它改变了 x变量的值,运行 flatten( x )后,x的值如下:
可以使用 copy函数复制 List副本来避免改变原 list值,代码:
上面的代码运行结果如下:
3)
))
) 将
将将
将 List中的所有元素
中的所有元素中的所有元素
中的所有元素(
((
(多重
多重多重
多重 List)
))
)重新组合成新
重新组合成新重新组合成新
重新组合成新 List
假设,有一个由 List和多重 List组成的 List变量 x:
下面写一个函数 flatten,它的功能是将 List中的所有元素重新组合成新 List,如下:
可以重复调用自身函数来解决多重 List读取的难题,代码如下:
procedure( flatten( numberList )
foreach( mapcan element numberList
if( listp( element ) then
flatten( copy( element ) )
else
ncons( element )
) ; if
) ; foreach
) ; procedure
flatten( x ) => ( 1 2 3 4 5 6 7 8 9 )
x = '((1) ((2 (3) 4 ((5)) () 6) ((7 8 ()))) 9)
=> ( ( 1 2 3 4 5 6 7 8 9 ) ( 4 5 6 7 8 9 ) ( 5 6 7 8 9 ) nil ( 9 ) )
x = '( (1 2 3) (4) (5 6 7 8) () (9) )
flatten(x) => ( 1 2 3 4 5 6 7 8 9 )
x => ((1 2 3) (4) (5 6 7 8) nil (9))
procedure( flatten( numberList )
foreach( mapcan element numberList
copy( element)
) ; foreach
) ; procedure
procedure( flatten( numberList )
foreach( mapcan element numberList
element
) ; foreach
) ; procedure
PCBSkill
第 15 页 / 共 15 页
SKILL语言基础
www.pcbskill.com
1.3流程控制流程控制流程控制流程控制
注:下面的一些示例包含多行语句,但是 allegro的 skill调试窗口不支持多行的调试,所以多于多行的情
况,要么把所有的代码重新编辑为一行,或者将代码放到一个文件里面,采用第一章里面说的 load的办
法来调试。
1.3.1 逻辑值逻辑值逻辑值逻辑值(t, nil)
在第一节说到关系操作和逻辑操作,结合这些操作和条件选择及循环控制命令可以选择程序运行。关系
操作和逻辑操作的结果是真值或假值,前面说到 skill的 boolean型数据有 2种,一种是 t表示真值,一
种是 nil表示假值,其实 skill中把一切非 nil的结果都当作真值,而不是仅仅局限于 t。
1.3.2 分支控制分支控制分支控制分支控制
1.3.2.1 单分支命令(when, unless)
when( bCondition ; bCondition为逻辑表达式,nil或其它(真值)
expressions ; bCondition为真的时候执行 when里面的命令
)
示例 nCount = 5
when ( nCount>=5
println(“nCount is no less than 5”)
)
=>“nCount is no less than 5”
unless( bCondition
expressions ; bCondition为假(nil)的时候执行 unless里面的命令
)
示例 nCount=5
unless( nCount<5
println(“nCount is no less than 5”)
)
注意到 when和 unless的 2个示例的区别了吗?其实 when==(!unless),也就是说 when在 c