On Sun, Jul 25, 2010 at 1:00 PM, Mark Bradley <barkmadley@gmail.com> wrote:
On Sun, Jul 25, 2010 at 3:40 AM, Michael Snoyman <michael@snoyman.com> wrote:
> Implementing that feature was amazingly simple. I'm still not 100% sold on
> the syntax, as I'm worried it's complicated Hamlet too much. But having the
> feature available probably isn't too dangerous. It also doesn't cause any
> problems with existing code as far as my tests go.
> As a bonus, the $forall/$maybe issue was very easy to solve: just surround
> it with parentheses.
> [$hamlet|
> $forall ((foo bar) baz) bin
>    $bin$
> |]

well done on being so quick.  I didn't even get a chance to try and
implement it myself.

The code looks very clean and accurate.  Should the spaces allowed
argument be propagated to the sub expression parser derefParens?

It's not necessary; the only reason to disallow spaces is when dealing with a $forall et al. However, once inside parentheses, we can allow the spaces without ambiguity.

Also doesn't parsec have a between combinator?

i.e.
   derefParens as = between (char '(') (char ')') (deref as)
   derefSingle as = derefParens as <|> fmap DerefLeaf ident
   deref spaceAllowed = do
       let delim = if spaceAllowed
                       then (char '.' <|> (many1 (char ' ') >> return ' '))
                       else char '.'
       x <- derefSingle spaceAllowed
       xs <- many $ delim >> derefSingle
       return $ foldr1 DerefBranch $ x : xs

I wasn't aware of between, cleaned up the code nicely. Thanks! Unless there's objections, I'll release the new code as Hamlet 0.4.1.

Michael