segunda-feira, 30 de março de 2009

Definição de procedimentos e return explícito

A seguir está um pequeno hack em Chicken Scheme usando procedimento de escape (via call/cc) e definição de macros ao estilo de Common Lisp. No final das contas, tem-se definições de função como em Python ou Ruby, incluindo return explícito (para os masoquistas).

(define-macro (def procname args . body)
`(define (,procname ,@args)
(call/cc (lambda (return)
,@body))))


Exemplo de uso (considerando programadores de linguagens cujo if não passa seu resultado para a sua continuação):

(def fatorial(n)
(if (< n 2)
(return 1)
(return (* n (fatorial (sub1 n))))))


Exemplo de uso (considerando um schemer sendo obrigado a usar return):

(def fatorial(n)
(return (if (< n 2)
1
(* n (fatorial (sub1 n))))))


Código equivalente em Scheme puro:

(define (fatorial n)
(if (< n 2)
1
(* n (fatorial (sub1 n)))))