Evaluate and print an expression


(Piergiuliano Bossi) #1

I hope that what I’m asking doesn’t sound too weird, but I’m trying to
understand if in ruby is possible to print and evaluate an expression at
the same time. I know for example that I can do like this:

irb(main):001:0> expr = “1+2==3”
=> "1+2==3"
irb(main):002:0> puts expr + ’ ==> ’ + (eval expr).to_s
1+2==3 ==> true
=> nil

What I don’t like is to specify the expression as a string. I’d rather
prefer to manage code directly, but I don’t know exactly how to print it
and evaluate it at the same time. Ideally, I’d like to change the
following code in order to print block body:

irb(main):012:0> def evaluate(&code)
irb(main):013:1> p code
irb(main):014:1> code.call
irb(main):015:1> end
=> nil
irb(main):016:0> evaluate { 1+2==3 }
#Proc:0x02a4ea78@:16(irb)
=> true

Do you see what I mean? Instead of having:
#Proc:0x02a4ea78@:16(irb)
I’d like to get:
{ 1+2==3 }
or something like that.

I know that in lisp this can be easily done due to its nature (that is,
code is data and data is code), but in ruby?

Thanks for your help!
Ciao, Giuliano

···


If you want to send me an email in the address you have to write ‘p’,
then a dot, followed by ‘bossi’ at ‘quinary’, another dot and ‘com’ at last


(Bermejo, Rodrigo) #2

def evaluate(code)
puts "#{code}==>"
eval code
end

evaluate(“1+2==3”)

1+2==3 ==>
true

Piergiuliano Bossi wrote:

···

I hope that what I’m asking doesn’t sound too weird, but I’m trying to
understand if in ruby is possible to print and evaluate an expression
at the same time. I know for example that I can do like this:

irb(main):001:0> expr = “1+2==3”
=> "1+2==3"
irb(main):002:0> puts expr + ’ ==> ’ + (eval expr).to_s
1+2==3 ==> true
=> nil

What I don’t like is to specify the expression as a string. I’d rather
prefer to manage code directly, but I don’t know exactly how to print
it and evaluate it at the same time. Ideally, I’d like to change the
following code in order to print block body:

irb(main):012:0> def evaluate(&code)
irb(main):013:1> p code
irb(main):014:1> code.call
irb(main):015:1> end
=> nil
irb(main):016:0> evaluate { 1+2==3 }
#Proc:0x02a4ea78@:16(irb)
=> true

Do you see what I mean? Instead of having:
#Proc:0x02a4ea78@:16(irb)
I’d like to get:
{ 1+2==3 }
or something like that.

I know that in lisp this can be easily done due to its nature (that
is, code is data and data is code), but in ruby?

Thanks for your help!
Ciao, Giuliano


(Robert) #3

“Piergiuliano Bossi” p_bossi_AGAINST_SPAM@tiscali.it schrieb im
Newsbeitrag news:c08kj7$hnm$1@lacerta.tiscalinet.it

I hope that what I’m asking doesn’t sound too weird, but I’m trying to
understand if in ruby is possible to print and evaluate an expression at
the same time. I know for example that I can do like this:

irb(main):001:0> expr = “1+2==3”
=> "1+2==3"
irb(main):002:0> puts expr + ’ ==> ’ + (eval expr).to_s
1+2==3 ==> true
=> nil

What I don’t like is to specify the expression as a string. I’d rather
prefer to manage code directly, but I don’t know exactly how to print it
and evaluate it at the same time. Ideally, I’d like to change the
following code in order to print block body:

irb(main):012:0> def evaluate(&code)
irb(main):013:1> p code
irb(main):014:1> code.call
irb(main):015:1> end
=> nil
irb(main):016:0> evaluate { 1+2==3 }
#Proc:0x02a4ea78@:16(irb)
=> true

Do you see what I mean? Instead of having:
#Proc:0x02a4ea78@:16(irb)
I’d like to get:
{ 1+2==3 }
or something like that.

I know that in lisp this can be easily done due to its nature (that is,
code is data and data is code), but in ruby?

You can’t without manually parsing the source file. The closest you might
get without extra parsing might be this, but still “code” is a String:

code=<<CODE
1 + 2 == 3
CODE
puts “#{code} --> #{eval code}”

Regards

robert

(Piergiuliano Bossi) #4

Bermejo, Rodrigo wrote:

def evaluate(code)
puts "#{code}==>"
eval code
end

evaluate(“1+2==3”)

1+2==3 ==>
true

:slight_smile:

Ok, I understand that I haven’t explained myself clearly.

The point is not how to make it work with an expression as a String
(“1+2==3” for example), but working directly with code.

At the end the question is: is it possible to print the code of an
expression?

Remember that I’m trying to do something like this:

irb(main):012:0> def evaluate(&code)
irb(main):013:1> p code
irb(main):014:1> code.call
irb(main):015:1> end
=> nil
irb(main):016:0> evaluate { 1+2==3 }
#Proc:0x02a4ea78@:16(irb)
=> true

Instead of having:
#Proc:0x02a4ea78@:16(irb)
I’d like to get:
{ 1+2==3 }
or something like that.

I think that the answer in ruby is: no, it’s not possible.
But I may be wrong.

Ciao, Giuliano

···


If you want to send me an email in the address you have to write ‘p’,
then a dot, followed by ‘bossi’ at ‘quinary’, another dot and ‘com’ at last


(Piergiuliano Bossi) #5

Robert Klemme wrote:

I know that in lisp this can be easily done due to its nature (that is,
code is data and data is code), but in ruby?

You can’t without manually parsing the source file. The closest you might
get without extra parsing might be this, but still “code” is a String:

code=<<CODE
1 + 2 == 3
CODE
puts “#{code} --> #{eval code}”

Thanks Robert, I understand what you mean: it looks like code, but it’s
a String.

Smart, but I was looking for real code.

Thanks anyway.
Ciao, Giuliano

···


If you want to send me an email in the address you have to write ‘p’,
then a dot, followed by ‘bossi’ at ‘quinary’, another dot and ‘com’ at last


#6

Nope, you can’t. I’ve read a rationale for this somewhere, but I don’t
remember the details.

···

Piergiuliano Bossi p_bossi_AGAINST_SPAM@tiscali.it wrote

The point is not how to make it work with an expression as a String
(“1+2==3” for example), but working directly with code.

At the end the question is: is it possible to print the code of an
expression?


(Julio Fernández) #7

http://www.rubyist.net/~matz/slides/oscon2003/mgp00001.html


(Bermejo, Rodrigo) #8

Piergiuliano Bossi wrote:

Bermejo, Rodrigo wrote:

I think that the answer in ruby is: no, it’s not possible.
But I may be wrong.

Ciao, Giuliano

take a look at irb/xmp - print exemple.

<-------------
require ‘irb/xmp’

xmp <<END
1+2==3
END
------------->
1+2==3
==>true

···

(Piergiuliano Bossi) #9

jesse rudolph wrote:

···

Piergiuliano Bossi p_bossi_AGAINST_SPAM@tiscali.it wrote

The point is not how to make it work with an expression as a String
(“1+2==3” for example), but working directly with code.

At the end the question is: is it possible to print the code of an
expression?

Nope, you can’t. I’ve read a rationale for this somewhere, but I don’t
remember the details.

:slight_smile:

Ok, this is what I thought.

Thanks, Giuliano


If you want to send me an email in the address you have to write ‘p’,
then a dot, followed by ‘bossi’ at ‘quinary’, another dot and ‘com’ at last


(Piergiuliano Bossi) #10

Bermejo, Rodrigo wrote:

Piergiuliano Bossi wrote:

Bermejo, Rodrigo wrote:

I think that the answer in ruby is: no, it’s not possible.
But I may be wrong.

Ciao, Giuliano

take a look at irb/xmp - print exemple.

<-------------
require ‘irb/xmp’

xmp <<END
1+2==3
END
------------->
1+2==3 ==>true

Neat!

But it is still working on strings, doesn’t it?

Thanks, Giuliano

···


If you want to send me an email in the address you have to write ‘p’,
then a dot, followed by ‘bossi’ at ‘quinary’, another dot and ‘com’ at last


(Sam Roberts) #11

Quoteing jfc@segonet.com, on Tue, Feb 10, 2004 at 10:33:53PM +0900:

http://www.rubyist.net/~matz/slides/oscon2003/mgp00001.html

Cool! I thought I was the only one who’d read Babel-17!

Delaney is one of the most interesting scifi writers ever. Two other
novels dealing with how language affects thought are 1984 (of course),
and SnowCrash, by Neal Stephenson.

Sam


(Robert) #12

“Piergiuliano Bossi” p_bossi_AGAINST_SPAM@tiscali.it schrieb im
Newsbeitrag news:c0g6qb$hba$1@lacerta.tiscalinet.it

Bermejo, Rodrigo wrote:

Piergiuliano Bossi wrote:

Bermejo, Rodrigo wrote:

I think that the answer in ruby is: no, it’s not possible.
But I may be wrong.

Ciao, Giuliano

take a look at irb/xmp - print exemple.

<-------------
require ‘irb/xmp’

xmp <<END
1+2==3
END
------------->
1+2==3 ==>true

Neat!

But it is still working on strings, doesn’t it?

Yes, it does. It’s basically the same as

eval <<END
1+2==3
END

Regards

robert