Problem with HERE document as first parameter (parser bug?)

I have problems passing a HERE document as the first parameter
to a function expecting more than 1 parameter. Example:

This is file here1.rb

def q(a,b)
end
q(<<-END
line1
line2
END
,‘x’)

Executing this program yields the error messages

./here1.rb:9: syntax error, unexpected ‘,’, expecting ‘)’
,‘x’)
^
./here1.rb:9: syntax error, unexpected ‘)’, expecting $end

Using a temporary variable to hold the content of the HERE
string works fine though:

temp=<<-END
line1
line2
END
q(temp,‘x’)

Bug in Ruby? Or do I misunderstand something in the workings of the
parser?

Ronald

Ronald F. wrote:

I have problems passing a HERE document as the first parameter
to a function expecting more than 1 parameter. Example:

This is file here1.rb

def q(a,b)
end
q(<<-END
line1
line2
END
,‘x’)

Executing this program yields the error messages

./here1.rb:9: syntax error, unexpected ‘,’, expecting ‘)’
,‘x’)
^
./here1.rb:9: syntax error, unexpected ‘)’, expecting $end

Using a temporary variable to hold the content of the HERE
string works fine though:

temp=<<-END
line1
line2
END
q(temp,‘x’)

Bug in Ruby? Or do I misunderstand something in the workings of the
parser?

Ronald

Not a bug in the parser, just wrong usage.
q(<<-END, ‘x’)
line1
line2
END

That will work.

Regards
Stefan

On Jul 11, 2007, at 6:53 AM, Stefan R. wrote:

END

Bug in Ruby? Or do I misunderstand something in the workings of the
That will work.

Regards
Stefan

While it works, it is, IMHO, ugly and a little obfuscated.
It is much better to simply assign the heredoc to a variable, and put
the variable name in the function parameter.
I know it is a correct form, but some times linguistically correct is
not always good for you. (most people know what I mean if I mention C )

John J.

2007/7/11, Ronald F. [email protected]:

,‘x’)

Executing this program yields the error messages

./here1.rb:9: syntax error, unexpected ‘,’, expecting ‘)’
,‘x’)
^
./here1.rb:9: syntax error, unexpected ‘)’, expecting $end

I believe you have got the order wrong. Do it like this:

$ ruby -e 'def f(a,b) p a,b end

f(<<XXX, 123)
foo
bar
XXX’
“foo\nbar\n”
123

Bug in Ruby? Or do I misunderstand something in the workings of the
parser?

The latter, see above. :slight_smile:

Kind regards

robert

2007/7/11, Stefan R. [email protected]:

line2

That will work.

Regards
Stefan


Posted via http://www.ruby-forum.com/.

HERE document as second parameter works:

irb(main):072:0> def q(a,b)
irb(main):073:1> puts a
irb(main):074:1> puts b
irb(main):075:1> end
=> nil
irb(main):076:0> q(‘1’,<<-END
irb(main):077:1" 2
irb(main):078:1" END
irb(main):079:1> )
1
2
=> nil

If correctness of usage depends on parameters order - is this a bug?

Valeri Mytinski wrote:

irb(main):072:0> def q(a,b)
irb(main):073:1> puts a
irb(main):074:1> puts b
irb(main):075:1> end
=> nil
irb(main):076:0> q(‘1’,<<-END
irb(main):077:1" 2
irb(main):078:1" END
irb(main):079:1> )
1
2
=> nil

If correctness of usage depends on parameters order - is this a bug?

I’m actually suprised, that your usage works.

puts(‘1’, <<END)
2
END

That’s how I’d have written it.
You can also use multiple

puts(<<FIRST, <<SECOND)
1
FIRST
2
SECOND

Or apply methods

puts(<<FIRST.upcase, <<SECOND.capitalize)
first
FIRST
second
SECOND

(will print “FIRST” newline “Second”)

Btw, no need for the ‘q’ method, puts can handle multiple arguments :wink:

Regards
Stefan