Algebraic Effects em Pharo usando Exception Handling
author:: chicoary
source:: Algebraic Effects in Pharo using Exception Handling
clipped:: 2023-09-13
published::
Publicado em https://chicoary.wordpress.com/2023/09/11/algebraic-effects-in-pharo-using-exception-handling.
English version:Algebraic Effects in Pharo using Exception Handling – Englished
Algebraic Effects
Ao me deparar com o Ability do Unison, uma implementação do conceito de algebraic effects, resolvi experimentar fazer algo similar, como um protótipo. Como li que os algebraic effects se parecem com o tratamento de exceções resolvi usar o mesmo para implementar minha versão naïve abaixo.
Faço aqui uma pequena explicação prévia à uma experimentação que pode ser feita pelos leitores.
As duas linhas
representam “funções puras” como na Purely functional programming. Não apresentam efeitos colaterais (se considerarmos que lançar exceções não são efeitos colaterais). São implementadas usando as Block Closures do Pharo.
O bloco protegido
contém somente chamadas a “funções puras”.
O bloco acima contém os handles para os effects #ask
e #inform:
.
O trecho
trata o effect #ask
. Se o usuário dá uma resposta vazia quando UIManager default request: 'Value:'
apresenta a interface abaixo o trecho self inform: 'Enter a value.'. error retry
mostra uma mensagem informando o problema e provoca a execução do bloco protegido novamente.
Se uma resposta não vazia foi inserida pelo usuário a mensagem error resume: anAnswer
é executada e o program counter, digamos assim, retorna para logo depois da expressão que lançou (raise) o erro. Como a expressão que lançou o erro é ask := [ MyResumableError signal: #ask ]
o programa retoma a execução no final do bloco e com o valor que foi passado na expressão error resume: anAnswer
. O leitor pode facilmente deduzir qual o próximo código que será executado.
Provavelmente descobriu que
inform value: answer.
será a próxima expressão a ser executada. E ela lança uma exceção que representa o effect#inform:
.
O outro trecho que representa o handle para o effect #inform:
mostra o que o usuário digitou (como foi passada uma Association ao ser lançado o erro que representa o effect #inform
usamos os getters key
e value
para obter o identificador do effect e o que deve ser mostrado, respectivamente).
Conclusão
Assim como o tratamento de exceção que usa uma estrutura try catch
para separar o trecho de código que trata os erros a estrutura effect handle
faz o mesmo separando as “impurezas”, representada pelos efeitos colaterais na Purely functional programming, do resto.
Uma vantagem que logo poderia ser notada é que minha função ask
poderia ter a sua implementação facilmente trocada alterando-se o handle correspondente para obter a resposta do usuário através da rede. O mesmo poderia ser feito com a função inform
para que gravasse num banco de dados ou então enviasse uma mensagem pela rede.
Unison MOC Blogpost MOC Algebraic effects MOC Smalltalk MOC Pharo MOC Published MOC Digital Garden MOC Wordpress MOC