Programação funcional
Exercícios
Considere a seguinte função, que imprime os primeiros n
números primos:
function(str, info) { return simplesEval(str, info); }
Essa função tem várias responsabilidades:
- determinar se um número é primo
- controlar a quantidade de números retornados
- imprimir números
Do jeito que está, a função não é muito extensível. E se quiséssemos retornar os números primos em vez de imprimi-los? E se quiséssemos obter os números primos menores que 100? Qualquer dessas mudanças exigiria a implementação de uma nova função.
Ainda bem que Javascript é uma linguagem funcional! Vamos aproveitar os recursos da linguagem para decompor essa função em funções menores, cada uma com uma única responsabilidade, para facilitar o reuso das funções?
Isolando a checagem de números primos
Vamos decompor a função original em duas partes: a função ehPrimo(numero)
determina se um número é primo ou não, e imprimePrimeiros(n, pred)
imprime os primeiros n
números naturais que satisfazem à função pred
. Com isso, podemos reescrever imprimePrimeirosPrimos(n)
combinando as duas funções.
function(str, info) { return simplesEval(str, info); }
Isolando a forma de retorno
A função atual imprime o resultado no console. E se quiséssemos mostrar em caixas de alerta? E se quiséssemos retornar um array? Vamos reescrever a função para dar essa possibilidade.
function(str, info) { return simplesEval(str, info); }
Transforme a função primeirosPred em um generator.
Nesse caso, você não precisará mais passar a função func
, uma vez que primeirosPred
retornará diretamente o valor através da instrução yield
.
function(str, info) { return simplesEval(str, info); }