轨道
/
Tcl
Tcl
/
练习
/
数组操作
数组操作

数组操作

中等

说明

实现基本的数组操作。

在函数式语言中,像length、map和reduce这样的数组操作非常常见。 请实现一系列基本的数组操作,不要使用现有的函数。

需要实现的操作的具体数量和名称会因你所在的编程语言轨道而异,以避免与现有名称冲突,但你将要实现的一般操作包括:

  • append(给定两个数组,把第二个数组中的所有元素添加到第一个数组的末尾);
  • concatenate(给定一系列数组,把所有数组中的所有元素合并成一个扁平数组);
  • filter(给定一个谓词和一个数组,返回所有满足 predicate(item) 为 True 的元素组成的数组);
  • length(给定一个数组,返回其中元素的总数);
  • map(给定一个函数和一个数组,返回对每个元素应用 function(item) 所得结果组成的数组);
  • foldl(给定一个函数、一个数组和一个初始累加器,从左到右把每个元素折叠(归约)进累加器);
  • foldr(给定一个函数、一个数组和一个初始累加器,从右到左把每个元素折叠(归约)进累加器);
  • reverse(给定一个数组,返回一个包含所有原元素、但顺序相反的数组)。

注意,传给折叠函数(foldl、foldr)的实参顺序很重要。

Tcl 的apply命令

测试用例可能看起来令人困惑。 你需要实现这个:

set myList {alpha beta gamma delta}
listOps::filter $myList {{word} {expr {[string length $word] == 4}}

为什么最后一个实参有这么多大括号?

回顾一下,proc命令的定义如下:

proc procName argList body

Tcl 有一个apply命令:

apply func ?arg1 arg2 ...?

这个“func”是一个两个元素的数组{argList body},本质上是一个匿名 proc(或“lambda”)。 apply命令会调用那个匿名 proc,并传递它所需的实参。

例如,下面这些是等价的:

# using proc
proc myReverse {str} {return [string reverse $str]}
puts [myReverse "Hello, World!"]

# using apply
puts [apply {{str} {string reverse $str}} "Hello, World!"]

# or, store the func in a variable
set func {{str} {string reverse $str}}
puts [apply $func "Hello, World!"]

使用apply可以更简单地传递代码块。

参考:apply,proc。

通过 GitHub 编辑 链接将在新窗口或新标签页中打开
Tcl Exercism

准备好开始 数组操作 了吗?

注册 Exercism,借助 135 个练习 和真人导师指导,学习并掌握 Tcl,全部免费。

深入探索 数组操作!

来体验一次递归的实用入门吧,探索数组操作的命令式和函数式替代方案,并深入了解尾调用递归和累加器函数。