Implemente operações básicas com listas.
Em linguagens funcionais, operações com listas como length, map e reduce são muito comuns.
Implemente uma série de operações básicas com listas, sem usar funções já existentes.
O número e os nomes exatos das operações a serem implementadas vão depender da trilha, para evitar conflitos com nomes já existentes, mas as operações gerais que você vai implementar incluem:
append (dadas duas listas, adicione todos os itens da segunda lista ao final da primeira lista);concatenate (dada uma série de listas, combine todos os itens de todas as listas em uma única lista achatada);filter (dados um predicado e uma lista, retorne a lista de todos os itens para os quais predicate(item) é True);length (dada uma lista, retorne o número total de itens dentro dela);map (dadas uma função e uma lista, retorne a lista dos resultados de aplicar function(item) a todos os itens);foldl (dados uma função, uma lista e um acumulador inicial, faça o fold (reduza) de cada item no acumulador, a partir da esquerda);foldr (dados uma função, uma lista e um acumulador inicial, faça o fold (reduza) de cada item no acumulador, a partir da direita);reverse (dada uma lista, retorne uma lista com todos os itens originais, mas em ordem inversa).Observe que a ordem em que os argumentos são passados para as funções de fold (foldl, foldr) faz diferença.
apply do TclOs casos de teste podem parecer confusos. Espera-se que você implemente isto:
set myList {alpha beta gamma delta}
listOps::filter $myList {{word} {expr {[string length $word] == 4}}
Por que esse último argumento tem tantas chaves?
Lembre-se de que o comando proc é definido assim:
proc procName argList body
O Tcl tem um comando apply:
apply func ?arg1 arg2 ...?
esse "func" é uma lista de dois elementos {argList body} que é, essencialmente, um proc anônimo (ou "lambda").
O comando apply invoca esse proc anônimo, passando a ele os argumentos de que precisa.
Por exemplo, estes são equivalentes:
# 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!"]
Usar apply facilita passar blocos de código de um lado para o outro.
Crie sua conta no Exercism para aprender e dominar Tcl com 135 exercícios e mentoria humana de verdade, tudo de graça.
Aproveite uma introdução prática à recursão, explore as alternativas imperativas e funcionais para Operações com Listas e mergulhe a fundo na recursão de cauda e nas funções acumuladoras.