Changeset 2248 for src/Pugs/Bind.hs
- Timestamp:
- 04/23/05 19:36:55 (4 years ago)
- svk:copy_cache_prev:
- 3669
- Files:
-
- 1 modified
-
src/Pugs/Bind.hs (modified) (5 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/Pugs/Bind.hs
r2221 r2248 36 36 37 37 bindHash :: [Exp] -> [Param] -> MaybeError Bindings 38 bindHash _ [] = return []38 bindHash _ [] = return [] 39 39 bindHash [] [p] = return [ (p, emptyHashExp) ] 40 40 bindHash vs (p:ps@(_:_))= do … … 43 43 bindHash vs [p] = return [ (p, Syn "\\{}" vs) ] -- XXX cast to Hash 44 44 45 bindArray :: [Exp] -> [Param] -> MaybeError Bindings 46 bindArray vs ps = do 47 case foldM (doBindArray (Syn "*" [Syn "," vs])) ([],0) prms of 48 Left errMsg -> fail errMsg 49 Right (bound,_) -> return $ reverse bound 45 bindArray :: [Exp] -> [Param] -> SlurpLimit -> MaybeError (Bindings, SlurpLimit) 46 bindArray vs ps oldLimit = do 47 let exp = Syn "*" [Syn "," vs] 48 case foldM (doBindArray exp) ([], 0) prms of 49 Left errMsg -> fail errMsg 50 Right (bound, n) -> do 51 let newLimit = case prms of 52 ((_, '@'):_) -> oldLimit 53 _ -> (n, exp) : oldLimit 54 return (reverse bound, newLimit) 50 55 where 51 56 prms = map (\p -> (p, (head (paramName p)))) ps … … 130 135 bindSomeParams :: VCode -> [Exp] -> [Exp] -> MaybeError VCode 131 136 bindSomeParams sub invsExp argsExp = do 132 let params = subParams sub 133 bindings = subBindings sub 137 let params = subParams sub 138 bindings = subBindings sub 139 slurpLimit = subSlurpLimit sub 134 140 (invPrms, argPrms) = span isInvocant params 135 141 (givenInvs, givenArgs) = if null invPrms … … 146 152 -- Bind slurpy arrays and hashes 147 153 let (slurpNamed, slurpPos) = partition (('%' ==) . head . paramName) slurpyPrms 148 defaultPos = if hasDefaultArray then [] else [defaultArrayParam]154 -- defaultPos = if hasDefaultArray then [] else [defaultArrayParam] 149 155 defaultNamed = if hasDefaultHash then [] else [defaultHashParam] 150 156 defaultScalar = if hasDefaultScalar then [] else [] -- XXX - fetch from *@_ 151 hasDefaultArray = isJust (find (("@_" ==) . paramName) slurpPos)152 || null slurpPos153 157 hasDefaultHash = isJust (find (("%_" ==) . paramName) slurpNamed) 154 158 hasDefaultScalar= isJust (find (("$_" ==) . paramName) params) 155 159 156 160 boundHash <- bindHash namedForSlurp (slurpNamed ++ defaultNamed) -- put leftover named args in %_ 157 boundArray <- bindArray posForSlurp (slurpPos ++ defaultPos) -- put leftover positional args in @_161 (boundArray, newSlurpLimit) <- bindArray posForSlurp slurpPos slurpLimit 158 162 boundScalar <- return $ defaultScalar `zip` (givenInvs ++ givenArgs) -- put, uh, something in $_ 159 163 … … 162 166 163 167 return sub 164 { subBindings = newBindings 165 , subParams = newParams 168 { subBindings = newBindings 169 , subParams = newParams 170 , subSlurpLimit = newSlurpLimit 166 171 } 167 172
