Revisão de programação funcional
Orientação
Para cada questão, você deve escrever no mínimo dois casos de teste, que devem ser submetidos junto com a questão. Os casos de teste devem ser escritos na seguinte forma:
// formato:
teste(resultadoEsperado, chamadaAFuncao);
// exemplo:
teste(120, fatorial(6));
Em Lisp a lógica é a mesma:
(teste 120 (fatorial 6))
O resultado da execução dos testes aparece no console do navegador.
Questão 1
Considere a seguinte estrutura de dados:
[
{
nome: "Fulano",
turma: "01",
nota: 8,
},
{
nome: "Sicrano",
turma: "02",
nota: 5,
},
...
]
Escreva uma função em JavaScript que recebe dados nessa estrutura e o número de uma turma e retorna a média das notas dos alunos que dessa turma. Não use estruturas de repetição (for, while, do) ou recursão. Use as funções alta ordem R.map
, R.filter
e R.reduce
.
function(str, info) { return simplesEval(str, info); }
Questão 2
Escreva uma função em JavaScript que recebe um predicado e uma lista, e retorna o número de elementos na lista que satisfazem ao predicado. Use recursão profunda.
Dicas:
- A expressão
x instanceof Array
retorna verdadeiro somente sex
for um array. - A expressão
lista.slice(1)
retorna uma cópia delista
sem o seu primeiro elemento.
function(str, info) { return simplesEval(str, info); }
Questão 3
Escreva uma função em Lisp para calcular a soma de todos os elementos de uma lista de números (não-profunda). Assuma que uma lista vazia tem soma zero. Use recursão de cauda.
function(str, info) { return multiEvalLisp(str, info); }
Questão 4
Considere o código abaixo. Modifique a função main
para que ela passe a considerar o nome passado como parâmetro, conforme exemplificado no teste.
function(str, info) { return simplesEval(str, info); }
Questão 5
Preencha os parâmetros de R.pipe
no código-fonte abaixo para que a função maximo
retorne o maior valor ímpar da lista.
function(str, info) { return simplesEval(str, info); }