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

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

日志

分享一些Skill里常用的函数(二)

热度 15已有 4413 次阅读| 2022-2-9 18:23 |个人分类:Skill语言|系统分类:其他

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

15

点赞

刚表态过的朋友 (15 人)

全部作者的其他最新日志

评论 (0 个评论)

facelist

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

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

    周排名
  • 0

    月排名
  • 0

    总排名
  • 0

    关注
  • 19

    粉丝
  • 2

    好友
  • 45

    获赞
  • 4

    评论
  • 173

    访问数
关闭

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

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

GMT+8, 2024-7-4 08:48 , Processed in 0.100369 second(s), 15 queries , Gzip On, Redis On.

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