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); }