evaluate and print an expression

  • Thread starter Piergiuliano Bossi
  • Start date
P

Piergiuliano Bossi

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@(irb):16>
=> true

Do you see what I mean? Instead of having:
#<Proc:0x02a4ea78@(irb):16>
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
 
B

Bermejo, Rodrigo

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

evaluate("1+2==3")

1+2==3 ==>
true
 
P

Piergiuliano Bossi

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

evaluate("1+2==3")

1+2==3 ==>
true

:)

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@(irb):16>
=> true

Instead of having:
#<Proc:0x02a4ea78@(irb):16>
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
 
R

Robert Klemme

Piergiuliano Bossi said:
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@(irb):16>
=> true

Do you see what I mean? Instead of having:
#<Proc:0x02a4ea78@(irb):16>
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
 
J

jesse rudolph

Piergiuliano Bossi said:
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.
 
P

Piergiuliano Bossi

jesse said:
Nope, you can't. I've read a rationale for this somewhere, but I don't
remember the details.

:)

Ok, this is what I thought.

Thanks, Giuliano
 
P

Piergiuliano Bossi

Robert said:
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
 
B

Bermejo, Rodrigo

Piergiuliano said:
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
 
P

Piergiuliano Bossi

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
 
R

Robert Klemme

Piergiuliano Bossi said:
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
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,769
Messages
2,569,580
Members
45,055
Latest member
SlimSparkKetoACVReview

Latest Threads

Top