[C2hs] [c2hs] #52: Parenthesize types in bindings, to allow function types without parentheses

c2hs cvs-ghc at haskell.org
Mon Oct 8 05:55:27 CEST 2012


#52: Parenthesize types in bindings, to allow function types without parentheses
--------------------+-------------------------------------------------------
 Reporter:  guest   |        Type:  defect 
   Status:  new     |    Priority:  normal 
Milestone:          |   Component:  general
  Version:  0.16.0  |    Keywords:         
--------------------+-------------------------------------------------------
 c2hs allows arbitrary types in function bindings.  However, a function
 type such as {{{T1 -> T2}}} will cause the generated code to parse
 incorrectly; since c2hs does not parenthesize each argument type, the
 argument and return types of the function type will parse as multiple
 arguments of the binding type, rather than as a single argument of
 function type.  The binding can work around this by explicitly
 parenthesizing the function type, but since c2hs already requires quoting
 the entire type, the need for parentheses does not become apparent without
 reading the generated code (or encountering a compile error).

 Add parentheses around the types in bindings, so that unparenthesized
 function types as arguments will parse correctly.

 {{{
 diff -rN -u old-c2hs/src/C2HS/Gen/Bind.hs new-c2hs/src/C2HS/Gen/Bind.hs
 --- old-c2hs/src/C2HS/Gen/Bind.hs       2012-10-07 20:49:16.773294894
 -0700
 +++ new-c2hs/src/C2HS/Gen/Bind.hs       2012-10-07 20:49:16.789294705
 -0700
 @@ -913,8 +913,8 @@
          ctxt   = case octxt of
                     Nothing      -> ""
                     Just ctxtStr -> ctxtStr ++ " => "
 -        argTys = [ty | CHSParm im ty _ _  _ <- parms'      , notVoid im]
 -        resTys = [ty | CHSParm _  ty _ om _ <- parm':parms', notVoid om]
 +        argTys = ["(" ++ ty ++ ")" | CHSParm im ty _ _  _ <- parms'
 , notVoid im]
 +        resTys = ["(" ++ ty ++ ")" | CHSParm _  ty _ om _ <-
 parm':parms', notVoid om]
          resTup = let
                     (lp, rp) = if isPure && length resTys == 1
                                then ("", "")
 }}}

-- 
Ticket URL: <http://hackage.haskell.org/trac/c2hs/ticket/52>
c2hs <http://www.cse.unsw.edu.au/~chak/haskell/c2hs/>
C->Haskell, An Interface Generator for Haskell



More information about the C2hs mailing list