Functional Programming in Pharo


View | Edit


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