Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Ruby > Ruby expressions vs. values (like Perl?)

Reply
Thread Tools

Ruby expressions vs. values (like Perl?)

 
 
John Gabriele
Guest
Posts: n/a
 
      10-12-2006
Does Ruby use the same terminology as Perl with regard to expressions
versus values?

I read a great MJD comment on PerlMonks a while back (
http://www.perlmonks.org/?node_id=72263 ). That comment notes how, in
Perl, one needs to be well aware of the difference between expressions
(the things you type into your code), and values (the things the
interpreter evaluates expressions to).

It seems that, the big reason for watching the difference between
expressions and values in Perl is because expressions turn into
different values at runtime depending upon context.

So, back to Ruby, I believe that the rhs of the following statement is
an "Array expression":

irb(main):001:0> foo = ['a','bee','sea']
=> ["a", "bee", "sea"]

but, what kind of expression is the rhs of the following:

irb(main):002:0> bar = 'dee', 'ee', 'eff'
=> ["dee", "ee", "eff"]

?

Incidentally, I also note that this one -- although performing
parallel assignment -- also happens to be generating an Array value:

irb(main):003:0> zz = ( a, b, c = 'gee', 'aitch', 'aye' )
=> ["gee", "aitch", "aye"]

irb(main):004:0> zz
=> ["gee", "aitch", "aye"]

According to irb, the Array gets generated even if you leave off the
"zz =" and the parentheses. Seems like extra work for the interpreter
to go through (making that Array), just to do a parallel assignment,
no?

Thanks,
---John

 
Reply With Quote
 
 
 
 
Booker C. Bense
Guest
Posts: n/a
 
      10-12-2006
-----BEGIN PGP SIGNED MESSAGE-----

In article <65e0bb520610121433u151b89d9y1d757621bc4d41d3@mail .gmail.com>,
John Gabriele <(E-Mail Removed)> wrote:
>Does Ruby use the same terminology as Perl with regard to expressions
>versus values?
>
>I read a great MJD comment on PerlMonks a while back (
>http://www.perlmonks.org/?node_id=72263 ). That comment notes how, in
>Perl, one needs to be well aware of the difference between expressions
>(the things you type into your code), and values (the things the
>interpreter evaluates expressions to).
>
>It seems that, the big reason for watching the difference between
>expressions and values in Perl is because expressions turn into
>different values at runtime depending upon context.


This is what many people dislike about perl. In Ruby, the
distinction mostly doesn't exist. It's an Object...

>
>So, back to Ruby, I believe that the rhs of the following statement is
>an "Array expression":
>
>irb(main):001:0> foo = ['a','bee','sea']
>=> ["a", "bee", "sea"]
>
>but, what kind of expression is the rhs of the following:
>
>irb(main):002:0> bar = 'dee', 'ee', 'eff'
>=> ["dee", "ee", "eff"]
>
>?


One of the nice things about Ruby is that you can always ask it
what it thinks.

irb(main):090: bar.class
=> Array
irb(main):010:0> bar.methods
=> ["respond_to?", "index", "select", "<<", "to_a", "delete_if",
"slice", "&", "type", "each_index", "length",
"protected_methods", "partition", "sort!", "assoc", "to_ary",
"eql?", "*", "grep", "instance_variable_set", "+", "is_a?",
"hash", "push", "send", "to_s", "-", "rindex", "reject", "size",
"pack", "join", "class", "reverse_each", "tainted?", "collect!",
"private_methods", "rassoc", "at", "member?", "__send__",
"compact!", "untaint", "|", "find", "each_with_index", "reject!",
"flatten", "id", "pop", "slice!", "replace", "collect",
"inspect", "transpose", "instance_eval", "reverse", "all?",
"clone", "entries", "indexes", "public_methods", "map!", "uniq",
"fetch", "extend", "freeze", "detect", "values_at", "display",
"zip", "__id__", "shift", "<=>", "methods", "method", "map",
"==", "clear", "empty?", "===", "any?", "indices", "sort",
"nil?", "dup", "instance_variables", "include?", "min",
"instance_of?", "flatten!", "first", "find_all", "delete_at",
"nitems", "each", "object_id", "insert", "reverse!", "unshift",
"=~", "inject", "singleton_methods", "fill", "delete", "concat",
"uniq!", "equal?", "taint", "sort_by", "instance_variable_get",
"max", "[]", "frozen?", "compact", "kind_of?", "last", "[]="]


>
>Incidentally, I also note that this one -- although performing
>parallel assignment -- also happens to be generating an Array value:
>
>irb(main):003:0> zz = ( a, b, c = 'gee', 'aitch', 'aye' )
>=> ["gee", "aitch", "aye"]
>
>irb(main):004:0> zz
>=> ["gee", "aitch", "aye"]
>
>According to irb, the Array gets generated even if you leave off the
>"zz =" and the parentheses. Seems like extra work for the interpreter
>to go through (making that Array), just to do a parallel assignment,
>no?


It's not making an Array, it's making a reference to an existing
object. Every ruby statement generally returns a reference
to the result, this can be an incredibly powerful tool.

_ Booker C. Bense



-----BEGIN PGP SIGNATURE-----
Version: 2.6.2

iQCVAwUBRS7BCGTWTAjn5N/lAQGrXgP+NWJ+xN04v1o67cQ9PSQeHCtakRJQAz3r
Rx/ivNqUXXMeR9uL3G2Ffui8BTE1KGpnsci2rzBcrxn2w1yjqAOV/IkmKFrmk72g
27FlxtqVCT3OonCx1KtsHF/8akrqlojFPwdw5MVvDXAxFQoYYOY2DE17WVmfXmY9
T+wBUTromgw=
=Ilxn
-----END PGP SIGNATURE-----
 
Reply With Quote
 
 
 
 
John Gabriele
Guest
Posts: n/a
 
      10-13-2006
On 10/12/06, Booker C. Bense
<(E-Mail Removed) nford.edu> wrote:
> In article <65e0bb520610121433u151b89d9y1d757621bc4d41d3@mail .gmail.com>,
> John Gabriele <(E-Mail Removed)> wrote:
> [snip]
> >
> >So, back to Ruby, I believe that the rhs of the following statement is
> >an "Array expression":
> >
> >irb(main):001:0> foo = ['a','bee','sea']
> >=> ["a", "bee", "sea"]
> >
> >but, what kind of expression is the rhs of the following:
> >
> >irb(main):002:0> bar = 'dee', 'ee', 'eff'
> >=> ["dee", "ee", "eff"]
> >
> >?

>
> One of the nice things about Ruby is that you can always ask it
> what it thinks.
>
> irb(main):090: bar.class
> => Array
> irb(main):010:0> bar.methods
> => ["respond_to?", "index", "select", "<<", "to_a", "delete_if",
> "slice", "&", "type", "each_index", "length",
> [snip]


Right. I see that bar is an Array, but I what I meant was, what kind
of expression is that comma-separated thingy on the right hand side
(when I made the assignment to bar)? Evidently, the answer seems to be
that ruby is allowing a little bit of extra syntactic sugar to make it
so I don't have to type those square brackets.

> >
> >Incidentally, I also note that this one -- although performing
> >parallel assignment -- also happens to be generating an Array value:
> >
> >irb(main):003:0> zz = ( a, b, c = 'gee', 'aitch', 'aye' )
> >=> ["gee", "aitch", "aye"]
> >
> >irb(main):004:0> zz
> >=> ["gee", "aitch", "aye"]
> >
> >According to irb, the Array gets generated even if you leave off the
> >"zz =" and the parentheses. Seems like extra work for the interpreter
> >to go through (making that Array), just to do a parallel assignment,
> >no?

>
> It's not making an Array, it's making a reference to an existing
> object.


Huh? irb seems to be clearly showing an Array. I'm thinking it's like
in C++ where you have this little short-lived temporary object. It
seems like it's an extra step for the interpreter to bother making
that extra temporary -- I'd think it could've just done the assignment
to a, b, and c and be done with it.

---John

 
Reply With Quote
 
AlexG
Guest
Posts: n/a
 
      10-13-2006
John Gabriele wrote:
> On 10/12/06, Booker C. Bense
> <(E-Mail Removed) nford.edu> wrote:
> > In article <65e0bb520610121433u151b89d9y1d757621bc4d41d3@mail .gmail.com>,
> > John Gabriele <(E-Mail Removed)> wrote:
> > [snip]
> > >
> > >So, back to Ruby, I believe that the rhs of the following statement is
> > >an "Array expression":
> > >
> > >irb(main):001:0> foo = ['a','bee','sea']
> > >=> ["a", "bee", "sea"]
> > >
> > >but, what kind of expression is the rhs of the following:
> > >
> > >irb(main):002:0> bar = 'dee', 'ee', 'eff'
> > >=> ["dee", "ee", "eff"]
> > >
> > >?

> >
> > One of the nice things about Ruby is that you can always ask it
> > what it thinks.
> >
> > irb(main):090: bar.class
> > => Array
> > irb(main):010:0> bar.methods
> > => ["respond_to?", "index", "select", "<<", "to_a", "delete_if",
> > "slice", "&", "type", "each_index", "length",
> > [snip]

>
> Right. I see that bar is an Array, but I what I meant was, what kind
> of expression is that comma-separated thingy on the right hand side
> (when I made the assignment to bar)? Evidently, the answer seems to be
> that ruby is allowing a little bit of extra syntactic sugar to make it
> so I don't have to type those square brackets.
>
> > >
> > >Incidentally, I also note that this one -- although performing
> > >parallel assignment -- also happens to be generating an Array value:
> > >
> > >irb(main):003:0> zz = ( a, b, c = 'gee', 'aitch', 'aye' )
> > >=> ["gee", "aitch", "aye"]
> > >
> > >irb(main):004:0> zz
> > >=> ["gee", "aitch", "aye"]
> > >
> > >According to irb, the Array gets generated even if you leave off the
> > >"zz =" and the parentheses. Seems like extra work for the interpreter
> > >to go through (making that Array), just to do a parallel assignment,
> > >no?

> >
> > It's not making an Array, it's making a reference to an existing
> > object.

>
> Huh? irb seems to be clearly showing an Array. I'm thinking it's like
> in C++ where you have this little short-lived temporary object. It
> seems like it's an extra step for the interpreter to bother making
> that extra temporary -- I'd think it could've just done the assignment
> to a, b, and c and be done with it.
>
> ---John


Someone with better understanding of Ruby internals will need to
confirm this because I may well be wrong, but I think you are correct.
eval.c creates a temporary array out of the right-hand side (in the
svalue_to_mrhs function I think). Page 91 of the Pickaxe (2nd Ed)
explains this a little more. Whether or not optimising the Array away
is possible or desirable is another question. Unless you are doing some
pretty insane parallel assignment I wouldn't have thought it makes any
practical difference.

Alex Gutteridge

 
Reply With Quote
 
Booker C. Bense
Guest
Posts: n/a
 
      10-13-2006
-----BEGIN PGP SIGNED MESSAGE-----

In article <65e0bb520610121750k33171391q78d868bdaa1f8efe@mail .gmail.com>,
John Gabriele <(E-Mail Removed)> wrote:
>On 10/12/06, Booker C. Bense
><(E-Mail Removed) anford.edu> wrote:
>>
>> One of the nice things about Ruby is that you can always ask it
>> what it thinks.
>>
>> irb(main):090: bar.class
>> => Array

>
>Right. I see that bar is an Array, but I what I meant was, what kind
>of expression is that comma-separated thingy on the right hand side
>(when I made the assignment to bar)? Evidently, the answer seems to be
>that ruby is allowing a little bit of extra syntactic sugar to make it
>so I don't have to type those square brackets.


Yes. For good or ill, Ruby has various syntactic sugar bits
sprinkled about.

>
>> >
>> >Incidentally, I also note that this one -- although performing
>> >parallel assignment -- also happens to be generating an Array value:
>> >
>> >irb(main):003:0> zz = ( a, b, c = 'gee', 'aitch', 'aye' )
>> >=> ["gee", "aitch", "aye"]
>> >

>>
>> It's not making an Array, it's making a reference to an existing
>> object.

>
>Huh? irb seems to be clearly showing an Array. I'm thinking it's like
>in C++ where you have this little short-lived temporary object. It
>seems like it's an extra step for the interpreter to bother making
>that extra temporary -- I'd think it could've just done the assignment
>to a, b, and c and be done with it.


This is the part of Ruby that took me the longest to get my head
around and I think causes lot's of difficulties since it uses a
reference model that's quite different from many other languages.
Variables are always a reference to an object, assignment copies
the reference but not the object. In many languages you can do

a = b

and then manipulate a , but b will remain unchanged. In Ruby,
both b and a are pointers to the underlying object and if you
change a then b changes as well. There is only 1 Array object
in the fragment above. In Ruby if you want a more conventional
version of assignment you do

a = b.copy

_ Booker C. Bense

-----BEGIN PGP SIGNATURE-----
Version: 2.6.2

iQCVAwUBRS+f7GTWTAjn5N/lAQEjEgP+IWgJY5cyaJOb1Xp1I7t0kJulonMPuqKY
Vj9wXYNgS05jKuGz0xRY8EVcMHopJxELn0+Zij0cknAYeEkSn+ Balnnw3kJk+5oi
Ao6w/9nK1eRZ4tOFcXBMqHyMedHlavKXBm+BIIJDJHH9COTJkFB/0lN/qRkCc7cE
Ovaey9QPQhs=
=vY74
-----END PGP SIGNATURE-----
 
Reply With Quote
 
Rick DeNatale
Guest
Posts: n/a
 
      10-13-2006
On 10/12/06, AlexG <(E-Mail Removed)> wrote:


> Someone with better understanding of Ruby internals will need to
> confirm this because I may well be wrong, but I think you are correct.
> eval.c creates a temporary array out of the right-hand side (in the
> svalue_to_mrhs function I think). Page 91 of the Pickaxe (2nd Ed)
> explains this a little more. Whether or not optimising the Array away
> is possible or desirable is another question. Unless you are doing some
> pretty insane parallel assignment I wouldn't have thought it makes any
> practical difference.


Yep, that's exactly what seems to be happening.

One reason for this is so that a parallel assignment like

x, y = y, x

works correctly.

If the interpreter simply broke that down into series of assignments
without the temporary array, then it would need to detect such cases
and handle them separately or:

x = 1
y = 2
# x, y = y, x
# converted into
x = y
y = x

x => 2
y => 2

which is not what we want.


--
Rick DeNatale

My blog on Ruby
http://talklikeaduck.denhaven2.com/

IPMS/USA Region 12 Coordinator
http://ipmsr12.denhaven2.com/

Visit the Project Mercury Wiki Site
http://www.mercuryspacecraft.com/

 
Reply With Quote
 
John Gabriele
Guest
Posts: n/a
 
      10-13-2006
On 10/13/06, Rick DeNatale <(E-Mail Removed)> wrote:
> On 10/12/06, AlexG <(E-Mail Removed)> wrote:
>
>
> [snip]
>
> If the interpreter simply broke that down into series of assignments
> without the temporary array, then it would need to detect such cases
> and handle them separately or:
>
> x = 1
> y = 2
> # x, y = y, x
> # converted into
> x = y
> y = x
>
> x => 2
> y => 2
>
> which is not what we want.


Ah. Of course. Thanks.

Also, to answer my own original question, I think actually that it may
not've had much pith to it... That is to say, everything the
interpreter sees is an "expression" of some kind (regardless of the
name one wants to give that expression). I think, most of the time,
ruby simply turns expressions into what values you think they should
be turned into, and (as Booker mentions) sprinkles little syntactic
sugar bits around here and there for the programmer's convenience.

Perl does the same thing, except it has some arguably quirkier rules
about the values it thinks the expressions should be evaluated to.

Thanks,
---John

 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
JSP+JSTL cant output values using <c: taglib. "attribute items does not accept any expressions" Anonymous Java 2 08-31-2006 04:13 PM
#!/usr/bin/ruby , #!/usr/bin/ruby -w , #!/usr/bin/ruby -T?, #!/usr/bin/ruby -T1... anne001 Ruby 1 04-23-2006 03:02 PM
Strange problem with regular expressions and tainted values Hadmut Danisch Ruby 0 10-27-2005 08:45 PM
Position of test values in conditional expressions =?ISO-8859-1?Q?Ney_Andr=E9_de_Mello_Zunino?= C++ 23 06-28-2004 08:02 PM
Add custom regular expressions to the validation list of available expressions Jay Douglas ASP .Net 0 08-15-2003 10:19 PM



Advertisments