• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

sanchaz

[Scheme] Dúvida Lambda

4 mensagens neste tópico

Boas,

tenho este código no meu livro de scheme.

No entanto não consigo perceber o que o lambda (p) faz para que quando meto (cria-compl 3 5) ele assuma o 3 como parte real e o 5 como parte imaginaria.

Tb não percebo muito bem o output da parte real.

(define (parte-real c)

  (c 1))

aqui ele faz c e qualquer coisa a 1 certo?

Alguem me pode ajudar e dizer o que acontece aqui nestas operações.

Obrigado.

(define (cria-compl r i)
  (lambda (p)
    (cond ((= p 1) r)
          ((= p 2) i)
          (else "cria-compl: Solicitação errada"))))

(define (parte-real c)
  (c 1))

(define (parte-imag c)
  (c 2))

(define c1 (cria-compl 3 5))

(parte-real c1)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Basicamente estás a criar uma nova função, chamada cria-compl.

Ao criar a função, passas-lhe a parte real e imaginária do complexo (neste caso, 3 e 5. À função que criaste chamas c1)

O que essa função faz, é devolver a parte real (3) ou imaginária (5) conforme lhe passas o valor 1 ou 2.

Ou seja, (c1 1) retorna 3 e (c1 2) retorna 5.

Isto não é fácil de explicar, mas se não tiveres percebido diz que volto a tentar.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

(SNIP!)

não consigo perceber o que o lambda (p) faz para que quando meto (cria-compl 3 5) ele assuma o 3 como parte real e o 5 como parte imaginaria.

O procedimento anonimo [lambda(p)] nao faz abs. nada.

O que acontece e' que ao avaliares o procedimento <cria-compl> o interpretador cria um novo enquadramento com os valores dos argumentos actuais associados aos identificadores desse procedimento. Esse novo enquadramento vai fazer parte do ambiente associado 'a avaliacao do corpo do proc.

Ao avaliar o corpo, o interpretador encontra uma exp. lambda - qual e' o seu resultado? Simples, um procedimento. Mas o que e' um procedimento? Surpresa, um procedimento e' um ambiente associado a uma expressao, exactamente isto: (<ambiente> . <exp. corpo do proc>)

Assim, o intepretador, ao tentar avaliar a exp. lambda diz "ah, ok, uma exp. lambda. Vou criar um procedimento. Preciso do seu corpo do lambda e de um ambiente. Que ambiente vou usar? O actual, associado 'a avaliacao desta expressao."

Portanto o resultado de (faz-complexo 3 4) resulta num procedimento com uma representacao interna (no interpretador scheme) semelhante a isto: ((ambientes (<ambiente-global>) ((r 3) (i 4))) . (corpo (cond ((- p 1) ...)))

E ao avaliares esse procedimento resultante, essa aval. e' feita nesse ambiente, e que tem as associacaoes necessarias para as bound variables <r> e <i>

Este comportamento e' importantissimo em CompSci, take a look: http://en.wikipedia.org/wiki/Closure_(computer_science)

Se quiseres explorar mais a fundo isto, ha' um livro excelente que e' o "The Little Schemer"

So, Alameda, Tagus, ou F*UP?

EDIT: apercebi-me de que ha bastante ppl da F*UP aqui, portanto retirei a flame.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora