unlambda - Unlambda
Paradigma | Quase puro funcional |
---|---|
Projetado por | David Madore |
Desenvolvedor | David Madore |
Apareceu pela primeira vez | 28 de junho de 1999 |
Versão estável | 2.0.0 / 20 de dezembro de 1999
|
disciplina Typing | Untyped |
linguagem de implementação | Esquema , C , Java |
Licença | GPL 2.0 ou posterior |
Local na rede Internet | www |
Unlambda é um mínimo "quase pura " linguagem de programação funcional inventado por David Madore. É baseado em lógica combinatória , uma versão do cálculo lambda que omite o operador lambda. Ele baseia-se principalmente em duas funções internas ( s
e k
) e um operador aplicar (escrito `
, a crase personagem). Estes só tornam Turing completo , mas há também alguns saída de entrada / (I / O) para funções permitem interagir com o utilizador, algumas funções de atalho, e uma avaliação lenta função. Variáveis não são suportados.
Unlambda é software livre e de código aberto distribuído sob a GNU General Public License (GPL) 2.0 ou posterior.
Conteúdo
Princípios básicos
Como uma linguagem de programação esotérica , unlambda se entende como uma demonstração de programação funcional muito pura, em vez de para o uso prático. Sua principal característica é a falta de operadores convencionais e tipos-o de dados único tipo de dados no programa são funções de um parâmetro. Os dados podem, contudo, ser simulado com funções adequadas como no cálculo lambda . Funções multi-parâmetro pode ser representado através do método de currying .
Unlambda baseia-se no princípio da eliminação de abstração , ou a eliminação de todas as variáveis salvas, incluindo funções. Como uma linguagem puramente funcional, funções de unlambda são objetos de primeira classe , e são os únicos tais objetos.
Aqui é uma implementação de um programa Olá mundo em unlambda:
`r```````````.H.e.l.l.o. .w.o.r.l.di
Originais funções embutidas
A notação denota uma função que leva um argumento e retorna-lo inalterado, imprimir o caráter único x como um efeito colateral quando é invocada. representa a versão da função de identidade que não tem tal efeito lateral; ele é usado aqui como um argumento fictício. O programa se aplica a função -Printing a um argumento fictício de , retornando e imprimir a carta como um efeito colateral. Da mesma forma, primeiro aplica-se a , imprimir a letra e retornando ; este resultado é, em seguida, aplicado a tal como no exemplo anterior. A função é açúcar sintático para a função que imprime um caractere de nova linha.
.x
i
`.di
d
i
i
d
``.l.di
.l
.d
l
.d
.d
i
r
Outras características importantes fornecidos por unlambda incluir o k
e s
funções. k
fabrica funções constantes: o resultado de uma função que, quando invocado, retorna x . Assim, o valor de é x para qualquer x e y .
`kx
``kxy
s
é um operador de avaliação generalizada. avaliada como para qualquer x , y , e z . É um facto notável que e são suficientes para realizar qualquer cálculo, tal como descrito no cálculo ESQUI combinador . Como um breve exemplo, a função de identidade pode ser implementado como , uma vez que produz x para todos os x .
```sxyz
``xz`yz
s
k
i
``skk
```skkx
Construção de controle de um fluxo de unlambda é chamar a continuação atual , denotado c
. Quando uma expressão da forma é avaliada, um especial continuação objecto é construído, que representa o estado do interpretador nesse momento. Então x é avaliada, e então o resultado é dado o objeto continuação como um argumento. Se a continuação nunca é aplicado a um argumento, o valor da expressão é o mesmo que o valor de x . Mas se o objeto de continuação é aplicada a um valor y , a execução de x é imediatamente interrompida, e o valor de toda a expressão é y .
`cx
`cx
`cx
Semântica de execução de unlambda são normalmente avaliação ansiosa , mas uma avaliação preguiçosa existe opção, indicada pelo uso do d
operador. Geralmente, para avaliar a expressão da forma , unlambda avalia primeiro x , em seguida, Y , e, em seguida, aplica- x para y . No entanto, se x é avaliada como o valor especial , então y é não avaliadas; em vez disso, o valor da expressão é um especial "computação retardada" objeto, que, quando aplicado a um argumento z , avalia y , e, em seguida, aplica-se o seu valor para z . Na ausência de efeitos colaterais, este é exatamente o mesmo que . A diferença é que executa quaisquer efeitos secundários em y imediatamente, ao passo que adia os efeitos laterais até que o resultado é aplicado a um outro argumento.
`xy
d
`dy
`iy
`iy
`dy
Próximo operador integrado do unlambda é v
, que ignora o seu argumento e retorna v
. Este recurso não é estritamente necessário, uma vez que v
poderia ser implementado como ``s`k``s``s`kskk`k``s``s`kskk
, mas é fornecido como uma conveniência. (Esta expressão acima é simplesmente `Yk
, que Y
indica um elemento de combinação ponto fixo ).
Versão 2 built-in funções
Mais built-ins foram introduzidas na versão unlambda 2. entrada é facilitada pelos operadores @
e . Quando é aplicado a uma função de x , um personagem é lida a partir da entrada, e armazenado como o "caráter atual"; então X é aplicado a . No entanto, se há mais personagens estavam disponíveis na entrada, o caractere atual é deixado indefinido, e x é aplicado em seu lugar. Quando uma função é aplicada a uma função de x , o resultado é a avaliação de se o personagem atual é u , caso contrário, é avaliada.
?u
@
i
v
?u
`xi
`xv
Há também um operador de "reedição" |
. Quando é avaliada, a função x é aplicada a se u é o personagem atual, ou se não houver caracteres atual.
`|x
.u
v
Finalmente, há um operador de saída e
. Quando e
é aplicado a x , a execução do programa é encerrado, e x é tomado como o resultado do programa (a maioria dos intérpretes actualmente existentes ignorar o resultado de qualquer maneira).
Veja também
Referências
- Felix-Hernandez Campos (1 de Abril 2002), Palestra 28: Mais sobre programação funcional , University of North Carolina COMP144
- 原悠(Yutaka Hara) (2008). Rubiで作る奇妙なプログラミング言語(em japonês). Tóquio: Mainichikomyunikēshonzu. pp. 205-214. ISBN 4-8399-2784-7 .