sexta-feira, 16 de abril de 2010

Sintaxe para definição de "curried procedures"

A definição de curried procedures é bastante usual em Scheme. Consiste em fazer com que o valor produzido por um procedimento seja outro procedimento.

Abaixo está um exemplo de um criador de objetos que respondem a mensagens:
(define (make-obj)
(lambda (message)
(case message
((hello) "Hello!")
((bye) "Bye bye!")
(else (error "Unknown message.")))))


O código acima já está com uma sintaxe simplificada para definições de procedimentos. A forma mais longa seria:
(define make-obj
(lambda ()
(lambda (message)
(case message
((hello) "Hello!")
((bye) "Bye bye!")
(else (error "Unknown message."))))))


Não está na especificação da linguagem, mas algumas implementações oferecem a possibilidade de usar uma sintaxe mais simplificada para a definição de curried procedures:
(define ((make-obj) message)
(case message
((hello) "Hello!")
((bye) "Bye bye!")
(else (error "Unknown message."))))


Das implementações em que testei, Chicken, Guile, MIT Scheme e PLT admitem essa sintaxe para definição de curried procedures. Ypsilon e Gambit não admitem.

Nenhum comentário: