From ruby-talk-admin@ruby-lang.org Fri Dec 16 03:13:12 2005 Received: from kankan.nagaokaut.ac.jp (kankan.nagaokaut.ac.jp [133.44.2.24]) by blade.nagaokaut.ac.jp (8.12.3/8.12.3/Debian-6.6) with ESMTP id jBFIDCZk030869; Fri, 16 Dec 2005 03:13:12 +0900 Received: from funfun.nagaokaut.ac.jp (funfun.nagaokaut.ac.jp [133.44.2.201]) by kankan.nagaokaut.ac.jp (Postfix) with ESMTP id 25EFE5A68; Fri, 16 Dec 2005 03:13:17 +0900 (JST) Received: from localhost (localhost.nagaokaut.ac.jp [127.0.0.1]) by funfun.nagaokaut.ac.jp (Postfix) with ESMTP id 48CB8F04896; Fri, 16 Dec 2005 03:13:17 +0900 (JST) Received: from voscc.nagaokaut.ac.jp (voscc.nagaokaut.ac.jp [133.44.1.100]) by funfun.nagaokaut.ac.jp (Postfix) with ESMTP id D0443F04866; Fri, 16 Dec 2005 03:13:11 +0900 (JST) Received: from beryllium.ruby-lang.org (beryllium.ruby-lang.org [210.163.138.100]) by voscc.nagaokaut.ac.jp (Postfix) with ESMTP id C9B48630024; Fri, 16 Dec 2005 03:13:11 +0900 (JST) Received: from beryllium.ruby-lang.org (beryllium.ruby-lang.org [127.0.0.1]) by beryllium.ruby-lang.org (Postfix) with ESMTP id 1883B33DE8; Fri, 16 Dec 2005 03:13:11 +0900 (JST) Received: from localhost (beryllium.ruby-lang.org [127.0.0.1]) by beryllium.ruby-lang.org (Postfix) with ESMTP id C68CB33DF6 for ; Fri, 16 Dec 2005 03:13:01 +0900 (JST) Received: from beryllium.ruby-lang.org ([127.0.0.1]) by localhost (beryllium.ruby-lang.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 19872-06 for ; Fri, 16 Dec 2005 03:13:01 +0900 (JST) Received: from mail.gmx.net (mail.gmx.net [213.165.64.21]) by beryllium.ruby-lang.org (Postfix) with SMTP id B8F9933DE8 for ; Fri, 16 Dec 2005 03:13:00 +0900 (JST) Received: (qmail 13312 invoked by uid 0); 15 Dec 2005 18:12:54 -0000 Received: from 62.225.37.69 by www73.gmx.net with HTTP; Thu, 15 Dec 2005 19:12:54 +0100 (MET) Delivered-To: ruby-talk@ruby-lang.org Date: Fri, 16 Dec 2005 03:13:02 +0900 Posted: Thu, 15 Dec 2005 19:12:54 +0100 (MET) From: "Peter Ertl" Reply-To: ruby-talk@ruby-lang.org Subject: Re: Assigning a block to a variable in Ruby To: ruby-talk@ruby-lang.org (ruby-talk ML) Message-Id: <17266.1134670374@www73.gmx.net> References: <20051215180032.GC6110@demiurgo.org> X-ML-Name: ruby-talk X-Mail-Count: 92 X-MLServer: fml [fml 4.0.3 release (20011202/4.0.3)]; post only (only members can post) X-ML-Info: If you have a question, send e-mail with the body "help" (without quotes) to the address ruby-talk-ctl@ruby-lang.org; help= X-Mailer: WWW-Mail 1.6 (Global Message Exchange) X-Original-To: ruby-talk@ruby-lang.org X-Priority: 3 (Normal) X-Authenticated: #8402114 X-Flags: 0001 X-Virus-Scanned: by amavisd-new-20030616-p10 (Debian) at ruby-lang.org X-Spam-Checker-Version: SpamAssassin 3.0.3 (2005-04-27) on beryllium.ruby-lang.org X-Spam-Level: X-Spam-Status: No, score=-14.9 required=7.0 tests=AWL,BAYES_00,BLARS00, BLARS_SPAM00,CONTENT_TYPE_PRESENT,RCVDFRMLOCALIP,RCVD_IN_BLARS, RCVD_IN_BLARS_SPAM,RCVD_IN_BLARS_SPSPRT,X_MAILER_PRESENT autolearn=ham version=3.0.3 Mime-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: 8bit Precedence: bulk Lines: 122 List-Id: ruby-talk.ruby-lang.org List-Software: fml [fml 4.0.3 release (20011202/4.0.3)] List-Post: List-Owner: List-Help: List-Unsubscribe: X-Virus-Scanned: by AMaViS snapshot-20020531 what eternal goal do you want to achieve with your strange code snippet anyway? if you want to pass functions as arguments then lambda / proc does just what you want... > --- Ursprüngliche Nachricht --- > Von: Esteban Manchado Velázquez > An: ruby-talk@ruby-lang.org (ruby-talk ML) > Betreff: Re: Assigning a block to a variable in Ruby > Datum: Fri, 16 Dec 2005 03:00:45 +0900 > > Hi, > > On Fri, Dec 16, 2005 at 01:57:41AM +0900, ajmayo@my-deja.com wrote: > > I am new to Ruby and curious as to how you emulate the following > > Javascript snippet > > (example in Windows, hence the call to Echo) > > > > var a = function(p) {WScript.Echo(p)} > > > > bar(a); > > > > function bar(z) > > { > > z(1); > > WScript.Echo(z); > > } > > > > which would of course create an anonymous function, assign it to > > variable a, pass this as a parameter to function bar() and then > > evaluate the function with parameter 1, then attempt to print the > > function itself (which Javascript will do, printing the text of the > > block) > > > > I found Ruby quite intuitive until I tried > > > > a = {some block} > > > > and found that this of course doesn't work as in this context {} refers > > to a hash. > > You can use: > > a = lambda {some block} > > > Ok, that's fine, but the 'yield' statement seems very funky and Perlish > > to me. > > Sorry, I don't see the connection :-? > > > Effectively a block passed to a routine exists as a 'hidden' > > argument so that > > > > foo(100) {someblock} > > > > in Ruby passes one parameter explicitly (as we would see from foo's > > defined argument list) and a 'hidden' block which 'yield' inside the > > body of foo() would evaluate. > > > > (though, oddly, yield {someblock} is also not valid Ruby). > > yield is to _call_ a given block. You do things like: > > def foo(bar) > yield "foo, #{bar}!" > end > > foo("world") do |i| > puts i > end > > > This seems horribly inelegant for a language touted as being The Next > > Great Thing. > > > > It is also unclear, how, then, I pass down a block as an argument and > > then in turn pass it again to a child routine. > > Easy: > > def some_method > yield "some value" > end > > def foo(bar, &blk) > some_method(&blk) > end > > foo(1) do |i| > puts i > end > > I.e. every time you put an ampersand before a parameter when defining some > method, you get the block as a Proc object. Every time you put an > ampersand > before a parameter when calling some method, the Proc object is received > as a regular block by the callee. > > Take a look at the first edition of Pickaxe. It's publicly available > at > http://www.ruby-doc.org/docs/ProgrammingRuby/. > > > I can see how a parameter to a block works - this is clearly borrowed > > from Smalltalk - but Javascript doesn't enforce separation of dynamic > > code in the way Ruby appears to. > > > > At present Javascript's syntax looks much cleaner. Am I missing > > something? > > Hope the above clears up some confusion. > > > Also, I presume Ruby is a forward-referencing language only, unlike > > Javascript, where I can declare a function after code which calls it. > > Ruby didn't seem to like that much. > > So, why not just use Javascript? :-) > > -- > Esteban Manchado Velázquez - http://www.foton.es > EuropeSwPatentFree - http://EuropeSwPatentFree.hispalinux.es >