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.
As instruções acima são sincronizadas com um repositório compartilhado para garantir consistência entre todas as trilhas de linguagens. Este apêndice traz esclarecimentos adicionais ou modifica as instruções conforme necessário, para alinhá-las melhor com os objetivos da trilha de Clojure.
Neste exercício da trilha de Clojure, considere que tanto a entrada quanto a saída são vetores, como indicam os testes. Como objetivo extra, pense em como implementar uma abordagem que não use listas nas etapas intermediárias.
É importante não reaproveitar funções nativas do Clojure com funcionalidade parecida, pois isso reduziria o valor de aprendizado pretendido pelo exercício.
As principais funções do namespace clojure.core que você deve evitar incluem into, concat, cat, lazy-cat, mapcat, flatten, filter, filterv, remove, count, map, mapv, reduce, transduce, reverse e rseq.
O objetivo opcional é para quem quer um desafio extra e foi pensado supondo que você já concluiu o objetivo principal.
Tente passar nos testes elaborando uma abordagem que parte do princípio de que:
Se você decidir publicar, não deixe de incluir um comentário indicando que a solução atende ao objetivo opcional de usar listas. Não esqueça de atualizar as docstrings!
Crie sua conta no Exercism para aprender e dominar Clojure com 12 conceitos105 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.