Eu me oponho a algo que continuo vendo repetidamente na maioria dessas respostas, que o que torna uma função uma função é que ela retorna um valor.
Uma função não é apenas um método antigo que retorna um valor. Não é assim: para que um método seja uma função real, ele deve retornar o mesmo valor sempre com uma entrada específica. Um exemplo de método que não é uma função é o random
método na maioria dos idiomas, porque, embora retorne um valor, o valor nem sempre é o mesmo.
Uma função, portanto, é mais semelhante a um mapa (por exemplo, onde x -> x'
uma função unidimensional). Essa é uma distinção muito importante entre métodos e funções regulares porque, quando se lida com funções reais, o momento e a ordem em que são avaliadas nunca devem importar onde, pois nem sempre é o caso das não funções.
Aqui está outro exemplo de método que não é uma função, mas que ainda assim retornará um valor.
// The following is pseudo code:
g(x) = {
if (morning()) {
g = 2 * x;
}
else {
g = x;
}
return g;
}
Objeto ainda mais a noção de que os procedimentos não retornam valores. Um procedimento é apenas uma maneira específica de falar sobre uma função ou método. Portanto, se o método subjacente que seu procedimento define ou implementa retorna um valor, adivinhe o que esse procedimento retorna. Tomemos, por exemplo, o seguinte trecho do SICP :
// We can immediately translate this definition into a recursive procedure
// for computing Fibonacci numbers:
(define (fib n)
(cond ((= n 0) 0)
((= n 1) 1)
(else (+ (fib (- n 1))
(fib (- n 2))))))
Você já ouviu falar de procedimentos recursivos ultimamente? Eles estão falando sobre uma função recursiva (uma função real) e está retornando um valor e estão usando a palavra "procedure". Então qual é a diferença então?
Bem, outra maneira de pensar em uma função (além do significado mencionado acima) é como uma representação abstrata de um ideal como o numeral 1. Um procedimento é a implementação real dessa coisa. Eu pessoalmente acho que eles são intercambiáveis.
(Observe que, se você ler esse capítulo no link que forneço, poderá achar que um conceito mais difícil de entender não é a diferença entre uma função e um procedimento, mas um processo e um procedimento. Você sabia que um procedimento recursivo pode ter um processo interativo?)
Um análogo para procedimentos são receitas. Por exemplo; suponha que você tenha uma máquina chamada make-pies
esta máquina consome ingredientes (fruit, milk, flower, eggs, sugar, heat)
e esta máquina retorne a pie
.
Uma representação desta máquina pode parecer
make-pies (fruit, milk, flower, eggs, sugar, heat) = {
return (heat (add fruit (mix eggs flower milk)))
}
Claro que essa não é a única maneira de fazer uma torta.
Nesse caso, podemos ver que:
A function is to a machine
as a procedure is to a recipe
as attributes are to ingredients
as output is to product
Essa analogia é boa, mas é quebrada quando você leva em consideração que, ao lidar com um programa de computador, tudo é uma abstração. Portanto, diferentemente do caso de uma receita para uma máquina, estamos comparando duas coisas que são abstrações; duas coisas que podem muito bem ser a mesma coisa. E eu sustento que eles são (para todos os efeitos) a mesma coisa.