zsh-users
 help / color / mirror / code / Atom feed
* curiosity with here document.
@ 2015-11-26 18:37 Ray Andrews
  2015-11-26 19:01 ` ZyX
  2015-11-26 19:03 ` ZyX
  0 siblings, 2 replies; 6+ messages in thread
From: Ray Andrews @ 2015-11-26 18:37 UTC (permalink / raw)
  To: Zsh Users

I often comment out blocks of code with here-document, and I just found 
this strange thing:

    /test1 ()/
    /{/
    /    if [[ "$1" = 'howdy' ]];/

    /: <<'COMMENT'/
    /blah blah
    COMMENT/

    /    then/
    /    echo stranger/
    /    fi/
    /}/

    /$ test1 no/
    /stranger/

There's no issue if I put the 'then' above the here-document. How should 
I understand that?  It is as if the here-document is hijacking the 'if' 
test and returning true. I'd expect the 'if' to go hunting for it's 
'then' and if it doesn't find it, then throw and error, but not let the 
here-document interlope.  But if this is proper then it's a caution as 
to using these things for commenting.


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: curiosity with here document.
  2015-11-26 18:37 curiosity with here document Ray Andrews
@ 2015-11-26 19:01 ` ZyX
  2015-11-26 19:03 ` ZyX
  1 sibling, 0 replies; 6+ messages in thread
From: ZyX @ 2015-11-26 19:01 UTC (permalink / raw)
  To: Ray Andrews, Zsh Users

26.11.2015, 21:38, "Ray Andrews" <rayandrews@eastlink.ca>:
> I often comment out blocks of code with here-document, and I just found
> this strange thing:
>
>     /test1 ()/
>     /{/
>     / if [[ "$1" = 'howdy' ]];/
>
>     /: <<'COMMENT'/
>     /blah blah
>     COMMENT/
>
>     / then/
>     / echo stranger/
>     / fi/
>     /}/
>
>     /$ test1 no/
>     /stranger/
>
> There's no issue if I put the 'then' above the here-document. How should
> I understand that? It is as if the here-document is hijacking the 'if'
> test and returning true. I'd expect the 'if' to go hunting for it's
> 'then' and if it doesn't find it, then throw and error, but not let the
> here-document interlope. But if this is proper then it's a caution as
> to using these things for commenting.

This has nothing to do with here document. You can have any *sequence* of commands as the `if` condition, including `:`. What this sequence returns is used for the if: 

    if true; false
    then
        echo True
    else
        echo False
    fi

will echo False.


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: curiosity with here document.
  2015-11-26 18:37 curiosity with here document Ray Andrews
  2015-11-26 19:01 ` ZyX
@ 2015-11-26 19:03 ` ZyX
  2015-11-26 23:19   ` Ray Andrews
  1 sibling, 1 reply; 6+ messages in thread
From: ZyX @ 2015-11-26 19:03 UTC (permalink / raw)
  To: Ray Andrews, Zsh Users

26.11.2015, 21:38, "Ray Andrews" <rayandrews@eastlink.ca>:
> I often comment out blocks of code with here-document, and I just found
> this strange thing:
>
>     /test1 ()/
>     /{/
>     / if [[ "$1" = 'howdy' ]];/
>
>     /: <<'COMMENT'/
>     /blah blah
>     COMMENT/
>
>     / then/
>     / echo stranger/
>     / fi/
>     /}/
>
>     /$ test1 no/
>     /stranger/
>
> There's no issue if I put the 'then' above the here-document. How should
> I understand that? It is as if the here-document is hijacking the 'if'
> test and returning true. I'd expect the 'if' to go hunting for it's
> 'then' and if it doesn't find it, then throw and error, but not let the
> here-document interlope. But if this is proper then it's a caution as
> to using these things for commenting.

And when writing such questions do read documentation. The specification for `if` looks like

    if list then list [ elif list then list ] ... [ else list ] fi

and using “list” for *both* `if` condition and `then` block should have given you an answer.


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: curiosity with here document.
  2015-11-26 19:03 ` ZyX
@ 2015-11-26 23:19   ` Ray Andrews
  2015-11-27  1:56     ` Bart Schaefer
  0 siblings, 1 reply; 6+ messages in thread
From: Ray Andrews @ 2015-11-26 23:19 UTC (permalink / raw)
  To: zsh-users

On 11/26/2015 11:03 AM, ZyX wrote:
> 26.11.2015, 21:38, "Ray Andrews" <rayandrews@eastlink.ca>:
>> And when writing such questions do read documentation. The specification for `if` looks like
>>
>>      if list then list
Until you know what 'list' entails, " if list then list " doesn't answer 
every question.  I've never seen anything like this previously so I 
wanted some knowledgeable comment, begging your pardon and thanks, I now 
know that a here-doc is true as far as any following 'then' is 
concerned, and any preceding 'if' test is ignored, which seems strange 
to me, but there it is.  So using that for commenting is not always 
safe; lesson learned.


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: curiosity with here document.
  2015-11-26 23:19   ` Ray Andrews
@ 2015-11-27  1:56     ` Bart Schaefer
  2015-11-27  2:29       ` Ray Andrews
  0 siblings, 1 reply; 6+ messages in thread
From: Bart Schaefer @ 2015-11-27  1:56 UTC (permalink / raw)
  To: zsh-users

On Nov 26,  3:19pm, Ray Andrews wrote:
}
} lesson learned.

Except it's the wrong lesson!  What you *ought* to learn is, first, that
for purposes of determining the "truth value" (zero or nonzero return
status),

    if command1; command2; command3; then ...

is the same as

    function three_commands {
	command1; command2; command3
    }
    if three_commands; then ...

And second, that [[ ... ]] is just a command like any other command,
it's not magically connected to "if".  Further, ":" is also a command
like any other command.

And third, that a here-document is just the standard input of the
command it follows, so

    : <<END
    some stuff
    END

is (again for purposes of determining truth value) the same as

    :

and the colon command is "true" for purposes of if/while/until/etc.,
it has a return status of zero.  So what you've written is

    if [[ ... ]]; : ; then ...

and colon is true and is the last command before the "then", so the
true branch is taken.

The here-document itself has no true or false interpretation, and the
presence of the here-document is not what is causing "if" to behave
the way it does.


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: curiosity with here document.
  2015-11-27  1:56     ` Bart Schaefer
@ 2015-11-27  2:29       ` Ray Andrews
  0 siblings, 0 replies; 6+ messages in thread
From: Ray Andrews @ 2015-11-27  2:29 UTC (permalink / raw)
  To: zsh-users

On 11/26/2015 05:56 PM, Bart Schaefer wrote:
> On Nov 26,  3:19pm, Ray Andrews wrote:
> }
> } lesson learned.
>
> Except it's the wrong lesson!
Well no, it is a lesson to be careful trying to use here-docs to comment 
blocks. As to why it goes off the rails, I was close to understanding it 
anyway--I'd expect legal code like that to have some sort of truth 
value, inconvenient as it may be.  I'm not really surprised by the 
correct understanding.
>      function three_commands {
> 	command1; command2; command3
>      }
>      if three_commands; then ...
Sure, but in practice I don't think we see that sort of 'list' after an 
'if' very often.  It seems that only the truth value of the last 
statement is acted upon as far as any 'if-then' structure, so as I said, 
the original 'if' seems to be orphaned.  So what?  It's me put the 
parser into that strange position, I'm not bitchin', it did what it had 
to do. Don't want orphan tests?  Don't make them.
> And second, that [[ ... ]] is just a command like any other command,
> it's not magically connected to "if".

That's the sort of fact that one might think one understands without 
really understanding it.  I probably can't hardly help C-ing it the C 
way.  I appreciate these deep corrections.
> And third, that a here-document is just the standard input of the
> command it follows, so
>
>      : <<END
>      some stuff
>      END
>
> is (again for purposes of determining truth value) the same as
>
>      :

Yeah, I'm really not as thick as I seem about this.  Wanting the 
'comment' to be available at any point wasn't realistic. Not one of my 
better questions.

BTW, I wish there was a way of going back to the archives and deleting 
lousy questions, I'd sure cut out a pile of mine. Library of Babel.


^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2015-11-27  2:59 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-11-26 18:37 curiosity with here document Ray Andrews
2015-11-26 19:01 ` ZyX
2015-11-26 19:03 ` ZyX
2015-11-26 23:19   ` Ray Andrews
2015-11-27  1:56     ` Bart Schaefer
2015-11-27  2:29       ` Ray Andrews

Code repositories for project(s) associated with this public inbox

	https://git.vuxu.org/mirror/zsh/

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).