policectsu的个人空间 https://blog.eetop.cn/1797297 [收藏] [复制] [分享] [RSS]

空间首页 动态 记录 日志 相册 主题 分享 留言板 个人资料

日志

SKILL常用函数~~~

已有 658 次阅读| 2022-12-15 12:54 |系统分类:芯片设计

1.list():


用来创建一个List数据类型的变量,也可用单引号'。例如:

aList='(1 2 a b c)

bList=list(1 2 'a 'b 'c)

cList='(1 (2 a b) c)

注:当有字符出现的时候,用list()函数创建必须在字符前加单引号。


2.car():

用来读取List中的第一个元素。例如:

car('(a b c))

=>a


3.cdr():

用来读取List中除了第一个元素外后面的单元。例如:

cdr('(a b c))

=>(b c)

此外,可以对List重复混合使用car或cdr函数,组合的格式为以c开头,r结尾,中间可有多个a|d。例如:

caadr功能等同于car(car(cdr(List))),caadr()函数对List的操作顺序为:

(1)先执行一次cdr,读取后面的单元;

(2)对第一步读取的值执行car,读取其第一元素;

(2)对第二步读取的值执行car,读取其第一元素。

caadr('((1 2 3) (4 5 6) (7 8 9)))

=>4


4.nthelem():

按元素序号读取List中的元素。用法:

nthelem(1 1_list)等同于car(1_list)


5.last():

用来读取List中的最后一个元素。其数据类型也是一个List。用法:

last(listname)


6.rplaca():

用来替换List中的第一个元素。例如:

aList='(1 2 3)

bList=rplaca(aList 4)

aList

=>(4 2 3)

eq(aList bList)

=>t

同理用rplacd()函数可以替换List后面的单元。


7.cons():

用来添加元素到List之前。例如:

aList='(2 3 4)

cons(1 aList)

=>(1 2 3 4)

此外,xcons()函数和cons()函数功能一样,只是格式有所区别,前面的变量为原List的元素,后面的变量为需要添加的元素。例如:

xcons('(b c) 'a)

=>(a b c)


8.append1():

用来添加元素到List之后。例如:

append1('(1 2 3) 4)

=>(1 2 3 4)


9.append()与nconc():

两个函数都是用来合并两个List。前者不改变所合并的List变量的值;后者会改变所合并List的值,且依次累加,最后一个List值不变。例如:

cList='(1 2) dList='(3 4 5) eList='(6 7)

append(cList dList)

=>(1 2 3 4 5)

cList

=>(1 2)

dList

=>(3 4 5)

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)


10.reverse():

用于元素倒序排序。例如:

aList='(1 2 3)

reverse(aList)

=>(3 2 1)

bList='(1 2 (3 4 5) 6)

reverse(bList)

=>(6 (3 4 5) 2 1)

bList

=>(1 2 (3 4 5) 6)


11.sort():

用于元素按条件排序。书写格式为:

sort(1_data u_comparefn)

其中第一个变量“1_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")  (其中“axlStrcmpAlpNum”为自定义函数)

此外,当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))


12.member()与assoc():

member()函数是一种用于查找List元素的函数。它从List的第一个元素开始查找,找到并返回第一个元素后继续找,一直到最后。如果能找到,返回从找到的元素开始直到最后的元素,找不到则返回nil。因此可以用来判断元素是否存在。例如:

member(3 '(2 3 4 3 5))

=>(3 4 3 5)

member(6 '(2 3 4 3 5))

=>nil

assoc()函数也是一种用于查找List元素的函数,其书写格式为:

assoc(g_key l_alist)

其中“g_key”变量为所查找的第一个完整的关键值,“l_alist”是个由多个List组成的List,格式为:((key1 value1) (key2 value2) (key3 value3)......)。

assoc()函数返回的是查找到的子List。例如:

aList='((1 "one") (2 "two") (3 "three"))

assoc(2 aList)

=>(2 "two")

assoc("one" aList)

=>nil


13.setof()、exists()与forall():

这三种函数都是用于过滤List元素的函数。

setof()函数的书写格式为:

setof(s_formalVar l_valueList g_predicateExpression)。

其中“s_formalVar”变量为局部变量,作用于“g_predicateExpression”表达式中,“l_valueList”变量为要过滤的List变量,“g_predicateExpression”为自定义表达式。例如:

setof(x '(1 2 3 4) (x>2))

=>(3 4)

setof(x '(1 2 3 4 5 6) oddp(x))

=>(1 3 5)  (oddp()函数是将一个不是奇数的数值舍入为最接近的奇数)

exists()函数和setof()函数的区别在于exists()函数查找List中满足条件的第一个元素,并返回之后的所有元素。例如:

exists(x '(4 3 4 5) (x<4))

=>(3 4 5)

forall()函数用于判断List中所有的元素是否全部满足表达式,全满足返回t,否则返回nil。例如:

forall(x '(1 2 3 4) (x>0))

=>t

forall(x '(2 4 7 8) evenp(x))

=>nil  (evenp()函数是返回沿绝对值增大方向取整后最接近的偶数)


14.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)

15.foreach():


最常用的遍历函数。只能依次取得List中的元素,不能改变List中原先储存的元素。例如:


foreach(x '(1 2 3 4) print(x))


=>1234


foreach((x y) '(1 2 3) '(4 5 6) (println x+y))


=>5


     7


     9


foreach(x '(1 2 3) (print plus(x 2)))


=>345




16.mapcar():


连续依次操作List集合中每个子List的元素,首先把每个List中的第一个元素当作function的形参,然后是每个List的第二个元素,一直到最短的List的最后一个元素。剩下的元素将被忽略。它的结果是返回一个List集合的元素依次应用于function的结果。例如:


mapcar('plus '(1 2 3) '(8 7 6))


=>(9 9 9)


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)  (“lambda”为匿名函数)


拓展:


mapc()函数与mapcar()函数类似,只是返回的是参数的第一个List,并没有聚集的结果,故它比mapcar()函数快。例如:


mapc('lambda((x) plus(x 1)) '(2 4 6))


=>(2 4 6)


map()函数对遍历处理每一个子List很有用,它用的是cdr()函数的方式,忽略每次运行的结果,返回原始的List。例如:


map('list '(1 2 3) '(9 8 7))


=>(1 2 3)




17.maplist():


和mapcar()函数类似,不过maplist()函数是首先将函数apply到每个List参数下。即函数首先应用于整个List,然后将函数应用到每个List的cdr,再将函数应用到每个List的cddr,一直到最短的一个List为空为止。例如:


maplist('length '(1 2 3))


=>(3 2 1)  (length()函数用于计算一个list或者array的长度)


maplist('list '(a b c) '(1 2 3))


=>(((a b c) (1 2 3)) ((b c) (2 3)) ((c) (3)))


此外还有mapl()函数。mapl对于maplist正如mapc对应于mapcar。




18.mapcan():


遍历收集每次运行的结果存放在一个新的List中,可用于List的重组。例如:


mapcan('list '(1 2 3) '(a b c))


=>(1 a 2 b 3 c)


foreach(mapcan x '((1 2) (3 4 5) (6 7)) x)


=>(1 2 3 4 5 6 7)




19.when()与unless():


两者都是单分支函数。用法:


when(bCondition)     ; bCondition为逻辑表达式、nil或其它(真值)。当bCondition为真时执行when里的命令。


unless(bCondition)    ; bCondition为假时执行when里的命令。


即when==(!unless)。




20.if():


双分支函数。用法:


if(bCondition then exp1 else exp2)    ; bCondition为真时执行exp1,为假时执行exp2。




21.cond()与case():


多分支函数。区别:


cond()函数里有多个程序块,程序会逐个判断各模块里面的程序,然后退出块的条件,直到找到一个逻辑为真的块,执行cond。cond就像是if then else的多次叠加。


case()函数里也有多个程序块,程序会判断case条件的程序块,后面哪个表达式满足其中的条件,只执行满足的那个。


cond和case的区别在于cond中的判断表达式可以不唯一,而case只判断一个表达式。意为:


cond( ((a>1) ...) ((a=1) ...) ((a<1) ...) )


b=1 (case(0 ...) case(1 ...) case(2 ...))




22.while()与for():


两者都为循环控制函数。用法:


while(bCondition expressions)    ; bCondition为非nil时一直重复执行while里面的命令行。


for(nStep 1 10)                         ; for命令的索引只可以递增,不像C语言那样支持递减。




23.prog()与let():


两者都是定义局部变量的函数。两者语法格式一样。不同的是prog要带一个return返回值,而let不需要。单单使用局部变量的功能,那么let的效率要比prog高。如果要从一个for循环里跳出,采用下面方法是不行的,Skill不支持:


for(nNum 1 20


    when(nNum>10


    return(nNum)


    )


)


必须要在for之前加一个prog,如下:



prog( ()


for(nNum 1 20


    when(nNum>10


    return(nNum)


    )


))


=>11



点赞

评论 (0 个评论)

facelist

您需要登录后才可以评论 登录 | 注册

  • 关注TA
  • 加好友
  • 联系TA
  • 0

    周排名
  • 0

    月排名
  • 0

    总排名
  • 4

    关注
  • 6

    粉丝
  • 10

    好友
  • 0

    获赞
  • 2

    评论
  • 145

    访问数
关闭

站长推荐 上一条 /2 下一条


小黑屋| 手机版| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-12-24 01:56 , Processed in 0.023632 second(s), 14 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
返回顶部