#Smalltalk (79/66 chars)#

###version 1 (79):###
    {
        [ 'line1' print ].
        [ 'line2' print ].
        [ 'line3' print ].
        [ 'line4' print ]
    } reverse map:#value

little explanation:<br>
[..] is a block (aka lambda closure);<br>
{..} is an array constructor;<br>
reverse and map are obvious;<br>
 #value evaluates a block closure.

###output:###
line4line3line2line1

###version 2 (66):
Here is a version using reflection; it fetches the string constants of the block and prints them:

Given any block containing string-prints:

    b := [
        'line1' print.
        'line2' print.
        'line3' print.
        'line4' print
    ].

where 'normal' evaluation with:

    b value.

gives: line1line2line3line4l

The following extracts the string literals and prints them reverse:

    (b method literals select:[:l|l class==String]) reverse map:#print

gives: line4line3line2line1

the code is a little unsafe (it requires that the block's containing method does not contain other string literals; but we are playing golf - not trusted software development ;-)

character counts are w.o omittable whitespace