08.02.2015 Views

Programação Funcional e Concorrente com Scheme

Programação Funcional e Concorrente com Scheme

Programação Funcional e Concorrente com Scheme

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

notas de aula -<br />

Jerônimo C. Pellegrini<br />

( syntax-rules ()<br />

((_) #f)<br />

((_ test )<br />

(if test<br />

test<br />

#f))<br />

((_ test1 test2 ...)<br />

(if test1<br />

test1<br />

(or* test2 ...)))))<br />

(or* (begin (display 5)(newline) 10) #f)<br />

5<br />

5<br />

10<br />

O 5 foi mostrado duas vezes porque foi avaliado duas vezes:<br />

(expand ’(or* (begin (display 5) (newline) 10) #f)<br />

(if (begin (display 5) (newline) 10) (begin (display 5) (newline) 10) (or*<br />

#f))<br />

É <strong>com</strong>um que se queira avaliar os argumentos de macros uma única vez. No exemplo<br />

acima o argumento da macro apenas mostra o número 5 – o que não parece um problema<br />

grave. No entanto, os efeitos colaterais do argumento da macro poderiam ser mais<br />

importantes: uma variável pode ser incrementada duas vezes ao invés de uma, ou uma<br />

mensagem pode ser enviada pela rede mais de uma vez, por exemplo.<br />

O problema pode ser resolvido avaliando cada argumento uma única vez em uma<br />

variável temporária:<br />

Versão Preliminar<br />

( define-syntax or*<br />

( syntax-rules ()<br />

((_) #f)<br />

((_ test )<br />

( let (( result test ))<br />

(if result<br />

result<br />

#f )))<br />

182<br />

[ 27 de outubro de 2010 at 15:47 ]

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!