Buddha Buck:
# My impression was that ~> and <~ were more general than that, 
# and mainly 
# did syntax-rewriting.

Correct.

# So (4) above was translated in the parsing stage to be 
# exactly identical 
# to (1), by the following conversions:
# 
#    # original (4)
#    @in ~> map { ... } ~> grep { ... } -> @out;
# 
#    # Fully Parenthesized
#    (((@in ~> map { ... } ) ~> grep { ... } ) -> @out
# 
#    # "@a ~> function " becomes " function @a
#    ((map { ... } @in) ~> grep { ... } ) ~> @out
# 
#    # @a ~> function ===> function @a
#    (grep { ... } (map { ... } @in)) ~> @out
# 
#    # @a ~> @b  ===> @b = @a
#    @out = (grep { ... } (map { ... } @in))
# 
#    # removal of duplicate parenthesis
#    @out = grep { ... } map { ... } @in
# 
# So the syntax in (1) is still valid.

Incorrect.  The translation sequence is:

        @in ~> map { ... } ~> grep { ... } ~> @out
        ((@in ~> map { ... }) ~> grep { ... }) ~> @out
        ((@in.map({ ... })).grep({ ... })) ~> @out
        @out=((@in.map({ ... })).grep({ ... }))
        @[EMAIL PROTECTED]({ ... }).grep({ ... })

The only difference between '~>' and '.' is that '~>' is taken as the
terminator of an unparenthesized argument list, while '.' is taken as
binding to the last term.

# With (2) and (3), the situation is different, because they get 
# syntax-converted into a different form:
# 
#    # Original (3)
#    @out <~ grep { ... } <~ map { ... } <~ @in;
# 
#    # fully parenthesized
#    @out <- ( grep { ... } <~ ( map { ... } <~ @in));
# 
#    # function <~ @a  ====> function :@a
#    @out <- { grep { ... } <- { map { ... } :@in ));
# 
#    # function <~ @a =====> function :@a
#    @out <~ grep { ... } :(map { ... } :@in)
# 
#    # @a <~ @b =====> @a = @b
#    @out = grep { ... } :(map { ... } :@in)
# 
# which is horrible, and no one would want to use that directly 
# as opposed 
# to syntax (1).  But I can see beauty in (2) or (3).
# 
# Of course, since indirect-object syntax is syntactic sugar 
# itself, this 
# goes on to be:
# 
#    # function :@a ===> @a.function, applied repeatedly
#    @out = @in.map({...}).grep({...});
# 
# which is yet another L2R syntax.

Correct.

# But it also implies that map(&block) and grep(&block) are methods on 
# arrays (or Arrays).

Correct again.

--Brent Dax <[EMAIL PROTECTED]>
@roles=map {"Parrot $_"} qw(embedding regexen Configure)

"If you want to propagate an outrageously evil idea, your conclusion
must be brazenly clear, but your proof unintelligible."
    --Ayn Rand, explaining how today's philosophies came to be


Reply via email to