Functional Programming in Pharo
Introdução
Este post contém uma descrição da minha exploração usando o Pharo Smalltalk da Grande Ideia do Unison com respeito a endereçar código usando hashes. A figura acima, do pragdave, ilustra a separação entre os nomes que o programador usa na sua codificação e a AST que representa o código.
Como esta página aqui neste digital garden ainda é um esboço várias anotações para modificar e evoluir o texto, em forma de tarefa como acima, serão encontradas espalhadas. Serão retiradas a medida que completadas.
Como na programação funcional as funções são elementos de first class vamos representar as funções através da classe Function
já que as classes no Smalltalk é que são first-class citizen.
Object subclass: #Function
instanceVariableNames: 'type block'
classVariableNames: ''
package: 'Functions-Core'
Uma forma syntactic sugar ao criar uma função é:
sum := Function sum: { Integer. Integer. Integer } as: [ :a :b | a + b ].
Criar e usar uma função é ilustrado no snippet abaixo:
sum := Function sum: { Integer. Integer. Integer } as: [ :a :b | a + b ].
"..."
(Function sum x: 3 y: 4) >>> 7.
"ou"
(sum x: 3 y: 4) >>> 7. "Caso a variável `sum` esteja no escopo corrente."
No Unison o código equivalente seria
sum : Nat -> Nat -> Nat
sum a b = a Nat.+ b
#...
>sum 3 4
onde o tipo Nat
representa os números naturais.
O
Integer
do Pharo é um super set dos números naturais.
O tipos dos argumentos e do retorno das funções são verificados. Bem como o número deles.
Inferência de tipos está no radar (se estiver ao meu alcance implementá-lo corretamente).
O hash da função depende apenas da sua AST. Independe dos nomes dos parâmetros e dos nomes das funções chamadas em seu interior.
Por exemplo
sum := Function sum: { Integer. Integer. Integer } as: [ :a :b | a + b ].
"e"
sum2 := Function sum2: { Integer. Integer. Integer } as: [ :x :y |
x + y
].
(hash := sum functionHash) >>> '__hash__006c012521aa6806e119fc213036ecb45563eb46'.
(hash2 := sum2 functionHash) >>> '__hash__006c012521aa6806e119fc213036ecb45563eb46'.
hash = hash2 >>> true
Writing MOC Draft MOC Published MOC Digital Garden MOC Writings MOC