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 Fischer <ronald.fischer@venyon.com>
Phone: +49-89-452133-162

Ronald Fischer 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

···

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

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

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

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?

The latter, see above. :slight_smile:

Kind regards

robert

···

2007/7/11, Ronald Fischer <ronald.fischer@venyon.com>:

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 Joyce

···

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

Ronald Fischer 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

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?

···

2007/7/11, Stefan Rusterholz <apeiros@gmx.net>:

Ronald Fischer 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

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

HERE document as second parameter works:

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

···

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