Bastos

let’s code!


Blocos não são objetos.

Depois de muito discutir com um colega sobre os blocos e closures, ele falava que nem tudo em ruby era OO, eu falava que tudo era. Isso era mais confuso que eu esperava.

Bem, em Smalltalk blocos são objetos por si só, em Ruby não, eles são estruturas da linguagem. Mas ai você fala, “se eu passar um bloco por parâmetro e der um .class nele, vai aparecer que ele é um Proc”, de fato, Ruby faz a conversão de bloco para Proc automaticamente, mágica, você ainda pode usar o Proc.new ou o lambda para fazer isso, então seu bloco vira uma closure.

# Percebam o & que admite o método receber um bloco e dentro ser usado como uma closure.
def x(&block)
  puts block.class
end

Blocos foram criados inicialmente para loops executarem com yield, mas depois como o próprio Matz explica, foi sendo usado para tudo, então, o que usando são sim objetos.

“…A closure is a nameless function the way it is done in Lisp. You can pass around a nameless function object, the closure, to another method to customize the bhttp://www.nabble.com/Yield-should-be-renamed-call_block-to11494240.html#a11494557ehavior of the method. As another example, if you have a sort method to sort an array or list, you can pass a block to define how to compare the elements. This is not iteration. This is not a loop. But it is using blocks… “

Apesar do Matz falar como se closure fosse diferente de blocos, há quem chame o bloco de closure, como o Martin Fowler:

“I use closures a lot in Ruby, but I don’t tend to create Procs and pass them around.”

Ele não precisa criar os procs, é claro, Ruby faz isso para você!

“…The second difference is less of a defined formal difference, but is just as important, if not more so in practice. Languages that support closures allow you to define them with very little syntax…” - Martin Fowler

Tudo bem, mas ai lendo mais eu chego a isso:

“The each method takes a one argument block (Ruby and Smalltalk both refer to closures as blocks).”

Hum, mas não foi isso que eu entendi lendo o que o Matz falou:

Bill Venners: What makes a block a closure?

Yukihiro Matsumoto: A closure object has code to run, the executable, and state around the code, the scope. So you capture the environment, namely the local variables, in the closure. As a result, you can refer to the local variables inside a closure. Evenhttp://www.martinfowler.com/bliki/Closure.html after the function has returned, and its local scope has been destroyed, the local variables remain in existence as part of the closure object. When no one refers to the closure anymore, it’s garbage collected, and the local variables go away.

Mas ai eu encontro isso que esclarece bastante sobre Procs e blocos:

“Proc objects are blocks of code that have been bound to a set of local variables. Once bound, the code may be called in different contexts and still access those variables.”

- Retirado da documentação do Ruby

Portanto, uma coisa é um bloco (função anônima), outra coisa é uma closure (objeto que contem uma função anônima, um estado e escopo), a conversão no Ruby é automática quando ele é atribuído a alguma variável. Bloco é uma construção sintática realmente interessante, podem não ser objetos, mas isso pouco me importa…

Mais em:
http://www.ddj.com/architect/184404436
http://rubylearning.com/blog/2007/11/30/akitaonrails-on-anatomy-of-ruby-blocksclosures/
http://www.ruby-lang.org/en/about/
http://www.sapphiresteel.com/Ruby-The-Smalltalk-Way-3-The-World
http://www.ruby-forum.com/topic/71221
http://www.neeraj.name/blog/articles/589
http://deadprogrammersociety.blogspot.com/2007/02/ruby-blocks-closures-and-continuations.html
http://www.rubyist.net/~matz/slides/oscon2005/mgp00001.html
http://www.infoq.com/news/2008/01/new-lambda-syntax
http://www.martinfowler.com/bliki/Closure.html
http://www.akitaonrails.com/2007/11/30/anatomia-de-ruby-blocks-closures
http://www.nabble.com/Yield-should-be-renamed-call_block-to11494240.html#a11494557

obs: Estou com muito sono, provavelmente algo tenha passado desapercebido ;)

Published by Bastos, on October 30th, 2008 at 3:41 am. Filled under: ruby | 4 Comments

Emacs, eu uso.

É engraçado como a vida da voltas, sempre achei o Emacs um editor meio maluco, esquisito e feio! Eu só não entendia ele. Passei boa parte do tempo programando em editores como Gedit, Notepad++ ou até mesmo, Netbeans (Esse foi por pouco tempo) até ver na tela de um colega do trabalho o Emacs aberto, e ouvir ele falar as vantagens de usar.

Certo, então instalei, pacman -S emacs-cvs, não larguei, passei um tempo me acostumando, montando meu .emacs e hoje me sinto muito confortável usando Emacs. O fato de poder modificá-lo como quiser, sim, como quiser, é extremamente interessante. O Emacs é um editor antigão, por isso tem muita coisa já escrita nele, tem muita coisa boa e claro, tem seus defeitos, mas no geral, me acostumei muito bem. Ele é extensível pois foi feito basicamente em cima de um core pequeno escrito em C e o resto TODO em Lisp (Emacs Lisp).

Bem, vale a pena tentar para aqueles que como eu, achava que o Emacs era uma grande “coisa”, e não um grande editor.

Published by Bastos, on October 29th, 2008 at 11:08 pm. Filled under: emacs | 1 Comment