A linguagem de programação JOY é uma linguagem de programação puramente funcional que foi produzida por Manfred von Thun na Universidade de La Trobe em Melbourne, Australia.
JOY é baseada na composição de funções, melhor que calculos Lambda. Mostrou ter muita semelhanças a Forth, Foi projetada como um tipo de evolução paralela e convergente.
JOY é incomun (com exceção para linguagens de programação a nivel de função e algumas esotericas, como a UNLAMBDA) em que falta um operador LAMBDA e portanto a falta de parametros formais. Para ilustrar isto com um exemplo comum, isto é, como a função quadrada pode ser definida em uma linguagem de programação imperativa (C):
int square(int x) {
return x*x;
}
A variavel X é um parametro formal que é substituido pelo valor real a ser multiplicado quando a função é chamada. Agora aki como a função seria definida em uma linguagem funcional (esquema)
(define square
(lambda (x) (* x x)))
Há diferentes formas, mas ainda usando o parametro formal X dessa maneira. Agora aqui é como a função quadrada seria definida em JOY
DEFINE square == dup * .
Explicando: em JOY tudo é uma função que leva uma pilha como
argumento e retorna uma pilha como resultado. Por exemplo, o
numero 5, não é, como pode parecer, um inteiro constante, mas
ao invés um programa curto que empurra o número 5 sobre a pilha.
O operador (*) joga dois numeros pra fora da pilha e coloca de
volta o produto deles. O operador DUP, duplica o elemento q esta
no topo da pilha, simplismente tirando da pilha uma copia do mesmo
Assim esa definição da função quadrada diz fazer uma cópia do
elemento do topo da pilha e então multiplicar os dois elementos
do topo, deixando o quadrado do elemento original no toipo da pilha
. Isto é, não necessitando de parametro formal. Esta designação da
a JOY conscisão e poder, como ilustrado por essa definição de QUICKSORT
DEFINE qsort == [small] [] [uncons [>] split] [[swap] dip cons concat] binrec .
"binrec" é uma das varias combinações recursivas de JOY, implementando recursão binária. Espera quatro programas no topo da pilha que representam a condição de terminação (se a lista é "pequena" (1 ou 0 elementos) já é ordenada), o que fazer se a condição de terminação é conhecida (neste caso nada), o que fazer por padrão (dividir a lista em dois, compararando cada elemento como o "pivô") e finalmente o que fazer no final (inserir o "pivô" entre os dois )