{-# OPTIONS_GHC -fglasgow-exts -fallow-overlapping-instances #-} module Pugs.Prim.Param ( foldParam ) where import Pugs.AST import Pugs.Internals doFoldParam :: String -> String -> [Param] -> [Param] doFoldParam cxt [] [] = [(buildParam cxt "" "$?1" (Val VUndef)) { isLValue = False }] doFoldParam cxt [] (p:ps) = ((buildParam cxt "" (strInc . cast $ paramName p) (Val VUndef)) { isLValue = False }:p:ps) doFoldParam cxt (s:name) ps = ((buildParam cxt [s] name (Val VUndef)) { isLValue = False } : ps) foldParam :: String -> Params -> Params foldParam "Named" = \ps -> ( (buildParam "Any" "*" "@?0" (Val VUndef)): (buildParam "Any" "*" "%?0" (Val VUndef)):ps) foldParam "List" = doFoldParam "Any" "*@?1" foldParam ('r':'w':'!':"List") = \ps -> ((buildParam "List" "" "@?0" (Val VUndef)) { isLValue = True }:ps) foldParam ('r':'w':'!':str) = \ps -> ((buildParam str "" "$?1" (Val VUndef)) { isLValue = True }:ps) foldParam "" = id foldParam ('?':str) | ('r':'w':'!':typ) <- str = \ps -> ((buildParam typ "?" "$?1" (Val VUndef)) { isLValue = True }:ps) | (('r':'w':'!':typ), "=$_") <- break (== '=') str = \ps -> ((buildParam typ "?" "$?1" (_Var "$_")) { isLValue = True }:ps) | (typ, "=$_") <- break (== '=') str = \ps -> ((buildParam typ "?" "$?1" (_Var "$_")) { isLValue = False }:ps) | (typ, ('=':def)) <- break (== '=') str = let readVal "Num" = Val . VNum . read readVal "Int" = Val . VInt . read readVal "Str" = Val . VStr . read readVal x = error $ "Unknown type: " ++ x in \ps -> ((buildParam typ "?" "$?1" (readVal typ def)) { isLValue = False }:ps) | otherwise = \ps -> (buildParam str "?" "$?1" (Val VUndef):ps) foldParam ('~':str) = \ps -> (((buildParam str "" "$?1" (Val VUndef)) { isLValue = False }) { isLazy = True }:ps) foldParam x = doFoldParam x []