Percursos
/
Bash
Bash
/
Exercícios
/
Operações com listas
Operações com listas

Operações com listas

Médio

Instruções

Implementa operações básicas com listas.

Em linguagens funcionais, operações sobre listas como length, map e reduce são muito comuns. Implementa uma série de operações básicas com listas, sem usar as funções já existentes.

O número exato e os nomes das operações a implementar variam de track para track, para evitar conflitos com nomes já existentes, mas as operações gerais que vais implementar incluem:

  • append (dadas duas listas, acrescenta todos os itens da segunda lista ao fim da primeira lista);
  • concatenate (dada uma série de listas, combina todos os itens de todas as listas numa única lista achatada);
  • filter (dado um predicado e uma lista, devolve a lista de todos os itens para os quais predicate(item) é True);
  • length (dada uma lista, devolve o número total de itens que ela contém);
  • map (dada uma função e uma lista, devolve a lista dos resultados de aplicar function(item) a todos os itens);
  • foldl (dada uma função, uma lista e um acumulador inicial, aplica fold (reduce) a cada item no acumulador, a partir da esquerda);
  • foldr (dada uma função, uma lista e um acumulador inicial, aplica fold (reduce) a cada item no acumulador, a partir da direita);
  • reverse (dada uma lista, devolve uma lista com todos os itens originais, mas pela ordem inversa).

Repara que a ordem pela qual os argumentos são passados às funções de fold (foldl, foldr) é importante.

Biblioteca de funções

Este é o primeiro exercício que vemos em que a solução que escrevemos não é um script "main". Estamos a escrever uma biblioteca que vai ser "source"ada dentro de outros scripts, que irão invocar as nossas funções.

Namerefs do Bash

Este exercício exige a utilização de variáveis nameref. Para isso é preciso uma versão do bash igual ou superior a 4.0. Se estiveres a usar o bash que vem por omissão no MacOS, vais precisar de instalar outra versão: consulta Instalar o Bash

Os namerefs são uma forma de passar uma variável a uma função por referência. Assim, a variável pode ser modificada dentro da função e o valor atualizado fica disponível no âmbito de quem a chamou. Aqui está um exemplo:

prependElements() {
    local -n __array=$1
    shift
    __array=( "$@" "${__array[@]}" )
}

my_array=( a b c )
echo "before: ${my_array[*]}"    # => before: a b c

prependElements my_array d e f
echo "after: ${my_array[*]}"     # => after: d e f a b c
Editar via GitHub A ligação abre numa nova janela ou separador
Bash Exercism

Estás pronto para começar Operações com listas?

Inscreve-te no Exercism para aprenderes e dominares Bash com 97 exercícios, e mentoria humana real, tudo grátis.

Mergulha a fundo em Operações com listas!

Desfruta de uma introdução prática à recursão, explora as alternativas imperativas e funcionais às Operações com listas e mergulha a fundo na recursão de cauda e nas funções acumuladoras.