edpratomo wrote:
>> Misalnya:
>> "..if only Java has block and closure like Ruby.."
>
> sebetulnya yg dimaksud dng closure oleh teman2 ruby ini apa ya..
> apakah sama dng anonymous function?
> karena saya pernah lihat di salah satu website (ruby), closure ini
> disamakan dng anonymous function yg dari proc/lambda.
>
> kalo berdasarkan ilmu onta, closure itu != anonymous func.
> bahkan function yg bukan anonymous pun bisa jadi closure.
>
> kalo anonymous function, di java ada yg bilang bisa pake anonymous
> inner class. nah mahluk apaan tuh..
>
> rgds,
> Edwin.
Good Question !!!
Saya akan mencoba menjawab yang ruby saja sambil membanding2kan jg dg sedikit
bahasa2x lain (Smalltalk [pakai Squeak], Perl [This is perl, v5.8.8 built for
darwin-2level] dan Haskell [Hugs> :version
-- Hugs Version September 2006 && ghc --version
The Glorious Glasgow Haskell Compilation System, version 6.6])..
*Silakan di CMIIW ya* .. kalau yg Java, saya akan ikutan nonton Gembong Gembong
Juragan Java di id-ruby sini saja :-)
Seringkali kalau kita baca2x buku ruby disebut2x ruby bahasa dinamis mendukung
seperti closure, iterator, exception, overloading, reflection
# mancing2 lagi ah kali aja akan ada yg berbekam dg apa itu iterator?
bedanya dgn
closure? kalau block? nah bedanya semua apa? lalu reflection.. overloading..
Dalam konteks ruby, kita mulai dari yang paling mudah, yaitu dari
bawaan ruby dulu. Closure banyak kita temui di kelas-kelas bawaan
ruby.
ini adalah metode dari kelas Array, (walau dari kelas Enumerable juga
ada/ri for detail).
sayang:~/Desktop arie$ ruby -e 'puts (1..30).select {|e|
e.modulo(10).zero? }.join(" ")'
10 20 30
sayang:~/Desktop arie$
dalam hal ini, select adalah metode iterator (yg juga bisa disebut
closure, yang juga boleh disebut blok, blok apa? blok closure.. maupun
blok iterator. Eit, nanti dulu, harus ditegaskan dulu, blok itu adalah
mulai dari buka kurung kurawa sampai tutup kurung kurawa atau mulai
dari do sampai end, jadi nama metode tidak termasuk), e adalah
parameter blok atau variabel blok, bukan variabel lokal (3 kata
setelah koma ini barusan untuk mengkoreksi ucapan steve waktu kita
ngobrol dulu steve, hmm.. masih ingat aja. Jadi kalau didalam blok ada
variabel lokal, baru itu betul yg kita bicarakan, entah dari situ
pertama kali assignmentnya, maupun yang dilewatkan sebagai argumen
metode ybs)
Ada banyak lagi koleksi closure bawaan ruby, perlu diingat, siapa
metode siapa milik kelas mana, mis. metode open miliknya senior kelas
IO yang otomatis menjadi milik si "anak" kelas File. Tapi tidak begitu
dengan metode new pada kelas File (yg tidak menerima blok)
Lalu bagaimana supaya kita punya kekuatan closure bikinan sendiri di ruby?
Caranya tidak terlepas dari jurus-jurus yield, Proc, lambda.
irb(main):001:0> def coba
irb(main):002:1> yield
irb(main):003:1> end
=> nil
irb(main):004:0> coba
LocalJumpError: no block given
from (irb):2:in `coba'
from (irb):4
from :0
irb(main):005:0> coba { 'oi' }
=> "oi"
irb(main):006:0>
lalu tentang objek yang bisa dipanggil alias bisa di .call
irb(main):006:0> p = Proc.new { puts "Didalam blok nya Proc" }
=> #<Proc:0x0004568c@(irb):6>
irb(main):007:0> p.call
Didalam blok nya Proc
=> nil
nah kalau objek Proc jadi closure, begini.
cara biasa.
irb(main):008:0> def teslagi
irb(main):009:1> a = 'hai'
irb(main):010:1> puts a
irb(main):011:1> end
=> nil
irb(main):012:0> a = 'halo'
=> "halo"
irb(main):013:0> teslagi
hai
=> nil
irb(main):014:0> puts a
halo
=> nil
irb(main):015:0>
cara closure.
irb(main):015:0> def bakalpanggilprocnih(pr)
irb(main):016:1> a = "a yang tidak relefan berada dalam skop metode"
irb(main):017:1> puts a
irb(main):018:1> pr.call
irb(main):019:1> end
=> nil
irb(main):020:0> a = "'a' yg dipakai di dalam blok Proc"
=> "'a' yg dipakai di dalam blok Proc"
irb(main):021:0> pr = Proc.new { puts a }
=> #<Proc:0x0003ac3c@(irb):21>
irb(main):022:0> pr.call
'a' yg dipakai di dalam blok Proc
=> nil
irb(main):023:0> bakalpanggilprocnih(pr)
a yang tidak relefan berada dalam skop metode
'a' yg dipakai di dalam blok Proc
=> nil
irb(main):024:0>
sekarang argumen untuk objek Proc
irb(main):024:0> pr2 = Proc.new { |e| puts e**2 }
=> #<Proc:0x000727e0@(irb):24>
irb(main):025:0> pr2.call(100)
10000
=> nil
irb(main):026:0> pr2.call(3)
9
=> nil
irb(main):027:0>
yang jadi argumen si 3, si 100.
sengaja dierrorkan:
irb(main):027:0> pr2.call
(irb):24: warning: multiple values for a block parameter (0 for 1)
from (irb):27
NoMethodError: undefined method `**' for nil:NilClass
from (irb):24
from (irb):27:in `call'
from (irb):27
from :0
irb(main):028:0>
karna objek pingin minta argumen tapi gak dikasih.
Nah sekarang kalau mau argumennya banyak.
irb(main):028:0> prlagi = Proc.new { |a,b,c| p a,b,c }
=> #<Proc:0x000443cc@(irb):28>
irb(main):029:0> prlagi.call(1,1)
1
1
nil
=> nil
irb(main):030:0> prlagi.call(1,1,1,1)
1
1
1
=> nil
irb(main):031:0>
Nah kalau tadi objek Proc, sekarang yang tak punya nama, alias anonim
/ anonymous, pakai lambda.
irb(main):031:0> la = lambda { puts "Perkenalkan, saya lambda!" }
=> #<Proc:0x0007f954@(irb):31>
irb(main):032:0> la.call
Perkenalkan, saya lambda!
=> nil
irb(main):033:0>
naah, tapi :
irb(main):033:0> la.class
=> Proc
:-D
hmmm... saya review / lihat2x lagi ini / ngedit2x khawatir ada yg salah...
wah! kok isinya ruby semua??? mana haskell, perl, smalltalknya
codes-codesnya belum dicopy paste???? nanti daripada kelamaan, ini
dulu dah.
# kaburrr
Links:
http://www.ruby-lang.org/en/documentation/ruby-from-other-languages/
bagian yg bawah2x
http://en.wikipedia.org/wiki/Closure_%28computer_science%29
# contoh closure di perl, php malah ada di external linksnya.
# contoh closure di C (yg bukan C++), malah ada di wikipedia
Jepang/bukan inggris
Some languages, such as Ruby, allow the programmer to choose the way he wants
return to be captured. An example in Ruby:
def foo
f = Proc.new { return "return from foo from inside proc" }
f.call # control leaves foo here
return "return from foo"
end
def bar
f = lambda { return "return from lambda" }
f.call # control does not leave bar here
return "return from bar"
end
puts foo # prints "return from foo from inside proc"
puts bar # prints "return from bar"
Both Proc.new and lambda in this example are ways to create a closure, but
semantics of the closures thus created are different with respect to the return
statement.
http://www.martinfowler.com/bliki/Closure.html
http://www.martinfowler.com/bliki/CollectionClosureMethod.html
The Power of yields # Presentasinya Matz
http://www.rubyist.net/~matz/slides/oscon2005/index.html
http://dougbryant.net/articles/2005/8/4/oscon-2005-yield-to-the-block-the-power-of-blocks-in-ruby
Link (akan kadaluarsa dalam 90 hari):
http://gudangupload.com/filelink.php?filecode=8c6672d23f7f1a08f59c71cc7794921f4d014c5fdb47ce206449748faacdcbb3
buat yang belum baca ini, buruan baca ini!!! must have!
sumber sumber daya kepala diatas juga dari buku2x yang pernah saya
review di blog + buku2x haskell + buku2x smalltalk + man perl,
perltoot dst dkk
--
Arie || ariekeren, YM!=riyari3, http://ariekusumaatmaja.wordpress.com
http://groups.yahoo.com/groups/id-ruby, Mysterious Power
"Never sayRTFM.Turn the trolls into committers",AudreyTang,conisli-ofun
Due to the amount of work, I usually need one millennium to answer