Треки
/
Tcl
Tcl
/
Вправи
/
Операції з масивом
Операції з масивом

Операції з масивом

Середня

Вказівки

Реалізуйте базові операції з масивами.

У функціональних мовах такі операції з масивами, як length, map і reduce, трапляються дуже часто. Реалізуйте низку базових операцій з масивами, не використовуючи наявні функції.

Точна кількість і назви операцій, які потрібно реалізувати, залежать від конкретного треку, щоб уникнути конфліктів з наявними назвами, але загалом потрібно реалізувати такі операції:

  • append (отримавши два масиви, додати всі елементи другого масиву в кінець першого);
  • concatenate (отримавши низку масивів, поєднати всі елементи з усіх масивів в один плаский масив);
  • filter (отримавши предикат і масив, повернути масив усіх елементів, для яких predicate(item) є правдою);
  • length (отримавши масив, повернути загальну кількість елементів у ньому);
  • map (отримавши функцію і масив, повернути масив результатів застосування function(item) до всіх елементів);
  • foldl (отримавши функцію, масив і початковий акумулятор, згорнути (звести) кожен елемент у акумулятор зліва);
  • foldr (отримавши функцію, масив і початковий акумулятор, згорнути (звести) кожен елемент у акумулятор справа);
  • reverse (отримавши масив, повернути масив з усіма початковими елементами, але у зворотному порядку).

Зауважте, порядок, у якому аргументи передаються до функцій згортання (foldl, foldr), має значення.

Команда apply у Tcl

Тестові випадки можуть здатися заплутаними. Реалізуйте це так:

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 (або «лямбда»). Команда 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, щоб вивчати й опановувати Tcl, а також 135 вправ та справжнє наставництво від людей, і все це безкоштовно.

Глибоке занурення у Операції з масивом!

Насолоджуйтеся практичним вступом до рекурсії, розгляньте імперативні та функціональні альтернативи «Операціям з масивом» і зануртеся в хвостову рекурсію та функції-акумулятори.