Changeset 3906

Show
Ignore:
Timestamp:
05/26/05 12:37:22 (4 years ago)
Author:
autrijus
svk:copy_cache_prev:
5482
Message:

* starting single-invocant feature branch.

(maybe laso do multi-level MMD param here?)

Location:
src
Files:
13 modified

Legend:

Unmodified
Added
Removed
  • src/Main.hs

    r3879 r3906  
    203203    return () 
    204204    where 
    205     exp = App (Var "&require") [] [Val $ VStr fn] 
     205    exp = App (Var "&require") Nothing [Val $ VStr fn] 
    206206 
    207207doRunSingle :: TVar Env -> RunOptions -> String -> IO () 
  • src/Pugs/AST.hs

    r3866 r3906  
    125125mergeStmts (Pad scope lex x) y = Pad scope lex (mergeStmts x y) 
    126126mergeStmts x@(Pos pos (Syn syn _)) y | (syn ==) `any` words "subst match //"  = 
    127     mergeStmts (Pos pos (App (Var "&infix:~~") [Var "$_", x] [])) y 
     127    mergeStmts (Pos pos (App (Var "&infix:~~") Nothing [Var "$_", x])) y 
    128128mergeStmts x y@(Pos pos (Syn syn _)) | (syn ==) `any` words "subst match //"  = 
    129     mergeStmts x (Pos pos (App (Var "&infix:~~") [Var "$_", y] [])) 
     129    mergeStmts x (Pos pos (App (Var "&infix:~~") Nothing [Var "$_", y])) 
    130130mergeStmts (Pos pos (Syn "sub" [Val (VCode sub)])) y 
    131131    | subType sub >= SubBlock, isEmptyParams (subParams sub) = 
    132132    -- bare Block in statement level; annul all its parameters and run it! 
    133     mergeStmts (Pos pos $ App (Val $ VCode sub{ subParams = [] }) [] []) y 
     133    mergeStmts (Pos pos $ App (Val $ VCode sub{ subParams = [] }) Nothing []) y 
    134134mergeStmts x (Pos pos (Syn "sub" [Val (VCode sub)])) 
    135135    | subType sub >= SubBlock, isEmptyParams (subParams sub) = 
    136136    -- bare Block in statement level; annul all its parameters and run it! 
    137     mergeStmts x (Pos pos $ App (Val $ VCode sub{ subParams = [] }) [] []) 
     137    mergeStmts x (Pos pos $ App (Val $ VCode sub{ subParams = [] }) Nothing []) 
    138138mergeStmts x (Stmts y Noop) = mergeStmts x y 
    139139mergeStmts x (Stmts Noop y) = mergeStmts x y 
     
    149149    [ Var (':':'*':name) 
    150150    , App (Var "&new") 
    151         [ Val (VType $ mkType "Class") ] 
    152         [ App (Var "&infix:=>") 
     151        (Just $ Val (VType $ mkType "Class")) 
     152        [ App (Var "&infix:=>") Nothing 
    153153            [ Val (VStr "traits") 
    154154            , Val (VList $ map VStr traits) 
    155             ] [] 
    156         , App (Var "&infix:=>") 
     155            ] 
     156        , App (Var "&infix:=>") Nothing 
    157157            [ Val (VStr "name") 
    158158            , Val (VStr name) 
    159             ] [] 
     159            ] 
    160160        ] 
    161161    ] 
  • src/Pugs/AST/Internals.hs

    r3901 r3906  
    775775data Exp 
    776776    = Noop                              -- ^ No-op 
    777     | App !Exp ![Exp] ![Exp]            -- ^ Function application 
     777    | App !Exp !(Maybe Exp) ![Exp]      -- ^ Function application 
    778778                                        --     e.g. myfun($invocant: $arg) 
    779779    | Syn !String ![Exp]                -- ^ Syntactic construct that cannot 
     
    834834    where 
    835835    (n', vs')      = extract n vs 
    836     (invs', vs'')  = foldr extractExp ([], vs') invs 
     836    (invs', vs'')  = maybe (invs, vs') (\inv -> let (x, y) = extract inv vs' in (Just x, y)) invs 
    837837    (args', vs''') = foldr extractExp ([], vs'') args 
    838838extract (Stmts exp1 exp2) vs = (Stmts exp1' exp2', vs'') 
  • src/Pugs/Bind.hs

    r3565 r3906  
    150150isPair (Cxt _ exp) = isPair exp 
    151151isPair (Syn "=>" [(Val _), _])   = True 
    152 isPair (App (Var "&infix:=>") [(Cxt _ (Val _)), _] [])   = True 
    153 isPair (App (Var "&infix:=>") [(Val _), _] [])   = True 
     152isPair (App (Var "&infix:=>") Nothing [(Cxt _ (Val _)), _])   = True 
     153isPair (App (Var "&infix:=>") Nothing [(Val _), _])   = True 
    154154isPair _                         = False 
    155155 
     
    162162unPair (Cxt _ exp) = unPair exp 
    163163unPair (Syn "=>" [(Val k), exp]) = (vCast k, exp) 
    164 unPair (App (Var "&infix:=>") [(Cxt _ (Val k)), exp] []) = (vCast k, exp) 
    165 unPair (App (Var "&infix:=>") [(Val k), exp] []) = (vCast k, exp) 
     164unPair (App (Var "&infix:=>") Nothing [(Cxt _ (Val k)), exp]) = (vCast k, exp) 
     165unPair (App (Var "&infix:=>") Nothing [(Val k), exp]) = (vCast k, exp) 
    166166unPair x                                = error ("Not a pair: " ++ show x) 
    167167 
     
    181181-} 
    182182bindParams :: VCode -- ^ A code object to perform bindings on 
    183            -> [Exp] -- ^ List of invocants to bind 
     183           -> (Maybe Exp) -- ^ List of invocants to bind 
    184184           -> [Exp] -- ^ List of arguments (actual params) to bind 
    185185           -> MaybeError VCode -- ^ Returns either a new 'VCode' with all the 
     
    232232-} 
    233233bindSomeParams :: VCode -- ^ Code object to perform bindings on 
    234                -> [Exp] -- ^ List of invocant expressions 
     234               -> (Maybe Exp) -- ^ List of invocant expressions 
    235235               -> [Exp] -- ^ List of argument expressions 
    236236               -> MaybeError VCode -- ^ A new 'VCode' structure, augmented 
     
    242242        (invPrms, argPrms) = span isInvocant params 
    243243        (givenInvs, givenArgs) = if null invPrms 
    244             then ([], (invsExp++argsExp)) 
    245             else (invsExp, argsExp) 
     244            then ([], (maybeToList invsExp++argsExp)) 
     245            else (maybeToList invsExp, argsExp) 
    246246 
    247247    let boundInv                = invPrms `zip` givenInvs -- invocants are just bound, params to given 
  • src/Pugs/Compile/Haskell.hs

    r3678 r3906  
    5050    argC = compile stmt 
    5151    argRest = compile rest 
    52 compile (App (Var op) [] []) = [| op0 op [] |] 
    53 compile (App (Var op) [] args) = compile (App (Var op) args []) 
    54 compile (App (Var ('&':op)) [arg] []) = [| do 
     52compile (App (Var op) Nothing []) = [| op0 op [] |] 
     53compile (App (Var ('&':op)) Nothing [arg]) = [| do 
    5554        val <- $(argC) 
    5655        op1 op val 
    5756    |] where 
    5857    argC = compile arg 
    59 compile (App (Var ('&':op)) [arg1, arg2] []) = [| do 
     58compile (App (Var ('&':op)) Nothing [arg1, arg2]) = [| do 
    6059        val1 <- $(argC1) 
    6160        val2 <- $(argC2) 
  • src/Pugs/Compile/Parrot.hs

    r3750 r3906  
    202202    -- XXX "module" is handled in glob, need stub here to avoid compile error 
    203203    compile (Syn "module" [Val (VStr _)]) = return empty 
    204     compile (App (Var "&return") [val] []) = do 
     204    compile (App (Var "&return") Nothing [val]) = do 
    205205        (valC, p) <- compileArg val 
    206206        return $ valC $+$ text ".return" <+> parens p 
    207207    compile (App (Var "&last") _ _) = return $ text "invoke last" 
    208     compile (App (Var "&substr") [str, idx, len] []) 
     208    compile (App (Var "&substr") Nothing [str, idx, len]) 
    209209        | Val v <- unwrap len, vCast v == (1 :: VNum) = do 
    210210        (strC, p1) <- enterLValue $ compileArg str 
     
    212212        rv         <- constPMC $ hcat [ p1, text "[" , p2, text "]"] 
    213213        return $ vcat [strC, idxC, rv] 
    214     compile (App (Var "&postfix:++") [inv] []) = do 
     214    compile (App (Var "&postfix:++") Nothing [inv]) = do 
    215215        (invC, p) <- enterLValue $ compileArg inv 
    216216        return $ invC $+$ text "inc" <+> p 
    217     compile (App (Var "&postfix:--") [inv] []) = do 
     217    compile (App (Var "&postfix:--") Nothing [inv]) = do 
    218218        (invC, p) <- enterLValue $ compileArg inv 
    219219        return $ invC $+$ text "dec" <+> p 
    220220    -- compile (App "&infix:~" [exp, Val (VStr "")] []) = compile exp 
    221     compile (App (Var "&infix:~") [exp1, exp2] []) = do 
     221    compile (App (Var "&infix:~") Nothing [exp1, exp2]) = do 
    222222        tmp <- currentStash 
    223223        (arg1, p1) <- compileArg exp1 
     
    229229            , text "concat" <+> tmp <> comma <+> p1 <> comma <+> p2 
    230230            ] 
    231     compile (App (Var ('&':'i':'n':'f':'i':'x':':':op)) [lhs, rhs] []) = do 
     231    compile (App (Var ('&':'i':'n':'f':'i':'x':':':op)) Nothing [lhs, rhs]) = do 
    232232        (lhsC, p1) <- compileArg lhs 
    233233        (rhsC, p2) <- compileArg rhs 
     
    244244        return $ vcat [ lhsC, rhsC, rv ] 
    245245    -- XXX store return code in $@, whereever that may be in Parrotland 
    246     compile (App (Var "&system") [cmd] []) = do 
     246    compile (App (Var "&system") Nothing [cmd]) = do 
    247247        (arg, p) <- compileArg cmd 
    248248        rc <- constPMC (text "$I10") 
     
    255255            , rc 
    256256            ] 
    257     compile (App (Var "&require_parrot") [arg] []) = do 
     257    compile (App (Var "&require_parrot") Nothing [arg]) = do 
    258258        (path, p) <- compileArg arg 
    259259        return $ vcat $ 
     
    265265        compile $ App (Var "&print") invs (args ++ [Val $ VStr "\n"]) 
    266266    compile (App (Var "&print") invs args) = do 
    267         actions <- fmap vcat $ mapM (compileWith (text "print" <+>)) (invs ++ args) 
     267        actions <- fmap vcat $ mapM (compileWith (text "print" <+>)) (maybeToList invs ++ args) 
    268268        rv      <- compile (Val (VBool True)) 
    269269        return $ actions $+$ rv 
    270     compile (App (Var ('&':method)) [(Var ('$':obj))] [arg]) = do 
     270    compile (App (Var ('&':method)) (Just (Var ('$':obj))) [arg]) = do 
    271271        lhsC <- askPMC 
    272272        compileWith (\tmp -> text lhsC <+> text "=" <+> varText ("$" ++ obj) <> text "." <> text ("'" ++ method ++ "'") <> parens tmp) arg 
    273     compile (App (Var ('&':name)) [arg] _) = do 
     273    compile (App (Var ('&':name)) Nothing [arg]) = do 
    274274        lhsC <- askPMC 
    275275        compileWith (\tmp -> text lhsC <+> text "=" <+> text name <> parens tmp) arg 
    276     compile (App (Var "&not") [] []) = return $ text "new PerlUndef" 
    277     compile (App (Var ('&':name)) [] []) = do 
     276    compile (App (Var "&not") Nothing []) = return $ text "new PerlUndef" 
     277    compile (App (Var ('&':name)) Nothing []) = do 
    278278        lhsC <- askPMC 
    279279        return $ text lhsC <+> text "=" <+> text name <> text "()" 
     
    315315    compile (Syn "," things) = fmap vcat $ mapM compile things 
    316316    compile (Syn syn [lhs, exp]) | last syn == '=' = 
    317         compile $ Syn "=" [lhs, App (Var ("&infix:" ++ init syn)) [lhs, exp] []] 
     317        compile $ Syn "=" [lhs, App (Var ("&infix:" ++ init syn)) Nothing [lhs, exp]] 
    318318    compile (Cxt _ exp) = compile exp 
    319319    compile (Pos pos exp) = do 
  • src/Pugs/Eval.hs

    r3904 r3906  
    109109    initSubs <- fromVals initAV 
    110110    enterContext CxtVoid $ do 
    111         mapM_ evalExp [ App (Val sub) [] [] | sub <- initSubs ] 
     111        mapM_ evalExp [ App (Val sub) Nothing [] | sub <- initSubs ] 
    112112    -- The main runtime 
    113113    val      <- resetT $ evaluate exp 
     
    116116    endSubs  <- fromVals endAV 
    117117    enterContext CxtVoid $ do 
    118         mapM_ evalExp [ App (Val sub) [] [] | sub <- endSubs ] 
     118        mapM_ evalExp [ App (Val sub) Nothing [] | sub <- endSubs ] 
    119119    return val 
    120120 
     
    190190    case rv of 
    191191        Nothing  -> case name of 
    192             ('&':_) -> maybeM (findSub name [] []) $ \sub -> do 
     192            ('&':_) -> maybeM (findSub name Nothing []) $ \sub -> do 
    193193                return $ codeRef sub 
    194194            _ -> return Nothing 
     
    404404                genSymCC "&next" $ \symNext -> do 
    405405                    genSymPrim "&redo" (const $ runBody vs sub') $ \symRedo -> do 
    406                         apply (updateSubPad sub' (symRedo . symNext)) [] $ 
     406                        apply (updateSubPad sub' (symRedo . symNext)) Nothing $ 
    407407                            map (Val . VRef . MkRef) these 
    408408                runBody rest sub' 
     
    417417        av      <- newArray [] 
    418418        symTake <- genSym "@?TAKE" (MkRef av) 
    419         apply (updateSubPad sub symTake) [] [] 
     419        apply (updateSubPad sub symTake) Nothing [] 
    420420        fmap VList $ readIVar av 
    421421    "loop" -> do 
     
    444444        break  <- evalVar "&?BLOCK_EXIT" 
    445445        vbreak <- fromVal break 
    446         result <- reduce (App (Var "&infix:~~") [(Var "$_"), match] []) 
     446        result <- reduce (App (Var "&infix:~~") Nothing [(Var "$_"), match]) 
    447447        rb     <- fromVal result 
    448448        if rb 
    449             then enterWhen (subBody vbreak) $ apply vbreak [body] [] 
     449            then enterWhen (subBody vbreak) $ apply vbreak Nothing [body] 
    450450            else retVal undef 
    451451    "default" -> do 
     
    453453        break  <- evalVar "&?BLOCK_EXIT" 
    454454        vbreak <- fromVal break 
    455         enterWhen (subBody vbreak) $ apply vbreak [body] [] 
     455        enterWhen (subBody vbreak) $ apply vbreak Nothing [body] 
    456456    "while" -> doWhileUntil id 
    457457    "until" -> doWhileUntil not 
     
    534534    -- XXX evil hack for infinite slices 
    535535    "[]" | [lhs, App (Var "&postfix:...") invs args] <- unwrap exps 
    536          , [idx] <- invs ++ args 
     536         , [idx] <- maybeToList invs ++ args 
    537537--       , not (envLValue env) 
    538538         -> reduce (Syn "[...]" [lhs, idx]) 
    539539    "[]" | [lhs, App (Var "&infix:..") invs args] <- unwrap exps 
    540          , [idx, Val (VNum n)] <- invs ++ args 
     540         , [idx, Val (VNum n)] <- maybeToList invs ++ args 
    541541         , n == 1/0 
    542542--       , not (envLValue env) 
     
    661661        let [lhs, exp] = exps 
    662662            op = "&infix:" ++ init syn 
    663         evalExp $ Syn "=" [lhs, App (Var op) [lhs, exp] []] 
     663        evalExp $ Syn "=" [lhs, App (Var op) Nothing [lhs, exp]] 
    664664    _ -> retError "Unknown syntactic construct" exp 
    665665    where 
     
    690690-- XXX absolutely evil bloody hack for context hinters 
    691691reduce (App (Var "&hash") invs args) = 
    692     enterEvalContext cxtItemAny $ Syn "\\{}" [Syn "," $ invs ++ args] 
     692    enterEvalContext cxtItemAny $ Syn "\\{}" [Syn "," $ maybeToList invs ++ args] 
    693693 
    694694reduce (App (Var "&list") invs args) = 
    695     enterEvalContext cxtSlurpyAny $ case invs ++ args of 
     695    enterEvalContext cxtSlurpyAny $ case maybeToList invs ++ args of 
    696696        []    -> Val (VList []) 
    697697        [exp] -> exp 
     
    699699 
    700700reduce (App (Var "&scalar") invs args) 
    701     | [exp] <- invs ++ args = enterEvalContext cxtItemAny exp 
    702     | otherwise = enterEvalContext cxtItemAny $ Syn "," (invs ++ args) 
     701    | [exp] <- maybeToList invs ++ args = enterEvalContext cxtItemAny exp 
     702    | otherwise = enterEvalContext cxtItemAny $ Syn "," (maybeToList invs ++ args) 
    703703 
    704704-- XXX absolutely evil bloody hack for "zip" 
    705705reduce (App (Var "&zip") invs args) = do 
    706     vals <- mapM (enterRValue . enterEvalContext (cxtItem "Array")) (invs ++ args) 
     706    vals <- mapM (enterRValue . enterEvalContext (cxtItem "Array")) (maybeToList invs ++ args) 
    707707    val  <- op0Zip vals 
    708708    retVal val 
    709709 
    710710-- XXX absolutely evil bloody hack for "goto" 
    711 reduce (App (Var "&not") [] []) = retEmpty 
     711reduce (App (Var "&not") Nothing []) = retEmpty 
    712712 
    713713reduce (App (Var "&not") invs args) = do 
    714     bool <- fromVal =<< evalExp (last $ invs ++ args) 
     714    bool <- fromVal =<< evalExp (last $ maybeToList invs ++ args) 
    715715    retVal $ VBool (not bool) 
    716716 
    717717-- XXX absolutely evil bloody hack for "goto" 
    718 reduce (App (Var "&goto") (subExp:invs) args) = do 
     718reduce (App (Var "&goto") invs@(Just subExp) args) = do 
    719719    vsub <- enterEvalContext (cxtItem "Code") subExp 
    720720    sub <- fromVal vsub 
     
    732732 
    733733-- XXX absolutely evil bloody hack for "assuming" 
    734 reduce (App (Var "&assuming") (subExp:invs) args) = do 
     734reduce (App (Var "&assuming") invs@(Just subExp) args) = do 
    735735    vsub <- enterEvalContext (cxtItem "Code") subExp 
    736736    sub <- fromVal vsub 
     
    739739        Right curriedSub -> retVal $ castV $ curriedSub 
    740740 
    741 reduce (App (Var "&infix:=>") invs args) = reduce (Syn "=>" (invs ++ args)) 
     741reduce (App (Var "&infix:=>") invs args) = reduce (Syn "=>" (maybeToList invs ++ args)) 
    742742 
    743743reduce (App (Var name@('&':_)) invs args) = do 
     
    745745    case sub of 
    746746        Just sub    -> applySub sub invs args 
    747         _ | [Syn "," invs'] <- unwrap invs, null args -> do 
    748             sub <- findSub name invs' [] 
     747        _ | [Syn "," args'] <- unwrap args -> do 
     748            sub <- findSub name invs args' 
    749749            if isNothing sub then err else do 
    750750            fail $ "Extra space found after " ++ name ++ " (...) -- did you mean " ++ name ++ "(...) instead?" 
     
    752752    where 
    753753    err = retError "No compatible subroutine found" name 
    754     applySub :: VCode -> [Exp] -> [Exp] -> Eval Val 
     754    applySub :: VCode -> (Maybe Exp) -> [Exp] -> Eval Val 
    755755    applySub sub invs args 
    756756        -- list-associativity 
    757757        | MkCode{ subAssoc = "list" }      <- sub 
    758         , (App (Var name') invs' []):rest  <- invs 
     758        , (App (Var name') Nothing args'):rest  <- args 
    759759        , name == name' 
    760         = applySub sub (invs' ++ rest)  [] 
     760        = applySub sub invs (args' ++ rest) 
    761761        -- fix subParams to agree with number of actual arguments 
    762762        | MkCode{ subAssoc = "list", subParams = (p:_) }   <- sub 
    763         , null args 
    764         = apply sub{ subParams = (length invs) `replicate` p } invs [] 
     763        = apply sub{ subParams = (length args) `replicate` p } invs args 
    765764        -- chain-associativity 
    766765        | MkCode{ subAssoc = "chain" }  <- sub 
    767         , (App _ _ []):_                <- invs 
    768         , null args 
    769         = mungeChainSub sub invs 
     766        , (App _ _ []):_                <- args 
     767        = mungeChainSub sub args 
    770768        | MkCode{ subAssoc = "chain", subParams = (p:_) }   <- sub 
    771         = apply sub{ subParams = (length invs) `replicate` p } invs [] 
     769        = apply sub{ subParams = (length args) `replicate` p } invs args 
    772770        -- normal application 
    773771        | otherwise 
    774772        = apply sub invs args 
    775773    mungeChainSub :: VCode -> [Exp] -> Eval Val 
    776     mungeChainSub sub invs = do 
     774    mungeChainSub sub args = do 
    777775        let MkCode{ subAssoc = "chain", subParams = (p:_) } = sub 
    778             (App (Var name') invs' args'):rest = invs 
     776            (App (Var name') invs' args'):rest = args 
    779777        theSub   <- findSub name' invs' args' 
    780778        case theSub of 
    781             Just sub'    -> applyChainSub sub invs sub' invs' args' rest 
    782             Nothing      -> apply sub{ subParams = (length invs) `replicate` p } invs [] -- XXX Wrong 
    783     applyChainSub :: VCode -> [Exp] -> VCode -> [Exp] -> [a] -> [Exp] -> Eval Val 
    784     applyChainSub sub invs sub' invs' args' rest 
     779            Just sub'    -> applyChainSub sub args sub' args' rest 
     780            Nothing      -> apply sub{ subParams = (length args) `replicate` p } Nothing args -- XXX Wrong 
     781    applyChainSub :: VCode -> [Exp] -> VCode -> [Exp] -> [Exp] -> Eval Val 
     782    applyChainSub sub args sub' args' rest 
    785783        | MkCode{ subAssoc = "chain", subBody = fun, subParams = prm }   <- sub 
    786784        , MkCode{ subAssoc = "chain", subBody = fun', subParams = prm' } <- sub' 
    787         , null args' 
    788         = applySub sub{ subParams = prm ++ tail prm', subBody = Prim $ chainFun prm' fun' prm fun } (invs' ++ rest) [] 
     785        = applySub sub{ subParams = prm ++ tail prm', subBody = Prim $ chainFun prm' fun' prm fun } Nothing (args' ++ rest) 
    789786        | MkCode{ subAssoc = "chain", subParams = (p:_) }   <- sub 
    790         = apply sub{ subParams = (length invs) `replicate` p } invs [] -- XXX Wrong 
     787        = apply sub{ subParams = (length args) `replicate` p } Nothing args -- XXX Wrong 
    791788        | otherwise 
    792789        = internalError "applyChainsub did not match a chain subroutine" 
     
    834831cxtOfExp _                      = return cxtSlurpyAny 
    835832 
    836 findSub :: String -> [Exp] -> [Exp] -> Eval (Maybe VCode) 
     833findSub :: String -> Maybe Exp -> [Exp] -> Eval (Maybe VCode) 
    837834findSub name' invs args = do 
    838835    let name = possiblyFixOperatorName name' 
    839836    case invs of 
    840         [exp] | not (':' `elem` drop 2 name) -> do 
     837        Just exp | not (':' `elem` drop 2 name) -> do 
    841838            typ     <- evalExpType exp 
    842839            if typ == mkType "Scalar::Perl5" then runPerl5Sub name else do 
     
    860857                svs     <- fromVals args 
    861858                found   <- liftIO $ canPerl5 sv (tail name) `mplus` canPerl5 sv "AUTOLOAD" 
    862                 if not found then evalExp (App (Var name) [] (map (Val . PerlSV) (sv:svs))) else do 
     859                if not found then evalExp (App (Var name) Nothing (map (Val . PerlSV) (sv:svs))) else do 
    863860                cxt     <- asks envContext 
    864861                rv      <- liftIO $ callPerl5 (tail name) (sv:svs) (enumCxt cxt) 
     
    871868        -- We use the first two elements of invs as invocants, as these are the 
    872869        -- types of the op. 
    873             rv = findSub ("&infix:" ++ op) (take 2 (invs ++ [Val undef, Val undef])) [] 
     870            rv = findSub ("&infix:" ++ op) Nothing (take 2 (maybeToList invs ++ [Val undef, Val undef])) 
    874871        maybeM rv $ \code -> return $ mkPrim 
    875872            { subName     = "&prefix:[" ++ op ++ "]" 
     
    888885    possiblyBuildMetaopVCode op' | "&prefix:" `isPrefixOf` op', "<<" `isSuffixOf` op' = do  
    889886        let op = drop 8 (init (init op')) 
    890             rv = findSub ("&prefix:" ++ op) [head $ invs ++ [Val undef]] [] 
     887            rv = findSub ("&prefix:" ++ op) Nothing [head $ maybeToList invs ++ [Val undef]] 
    891888        maybeM rv $ \code -> return $ mkPrim 
    892889            { subName     = "&prefix:" ++ op ++ "<<" 
     
    903900    possiblyBuildMetaopVCode op' | "&postfix:>>" `isPrefixOf` op' = do 
    904901        let op = drop 11 op' 
    905             rv = findSub ("&postfix:" ++ op) [head $ invs ++ [Val undef]] [] 
     902            rv = findSub ("&postfix:" ++ op) Nothing [head $ maybeToList invs ++ [Val undef]] 
    906903        maybeM rv $ \code -> return $ mkPrim 
    907904            { subName     = "&postfix:>>" ++ op 
     
    918915    possiblyBuildMetaopVCode op' | "&infix:>>" `isPrefixOf` op', "<<" `isSuffixOf` op' = do  
    919916        let op = drop 9 (init (init op')) 
    920             rv = findSub ("&infix:" ++ op) (take 2 (invs ++ [Val undef, Val undef])) [] 
     917            rv = findSub ("&infix:" ++ op) Nothing (take 2 (maybeToList invs ++ [Val undef, Val undef])) 
    921918        maybeM rv $ \code -> return $ mkPrim 
    922919            { subName     = "&infix:>>" ++ op ++ "<<" 
     
    951948    findSub' name = do 
    952949        subSyms     <- findSyms name 
    953         lens        <- mapM argSlurpLen (unwrap $ invs ++ args) 
     950        lens        <- mapM argSlurpLen (unwrap $ maybeToList invs ++ args) 
    954951        doFindSub (sum lens) subSyms 
    955952    argSlurpLen (Val listMVal) = do 
     
    972969        sub@(MkCode{ subType = subT, subReturns = ret, subParams = prms }) <- fromVal val 
    973970        let isGlobal = '*' `elem` n 
    974         let rv = return $ arityMatch sub (length (invs ++ args)) slurpLen 
     971        let rv = return $ arityMatch sub (length (maybeToList invs ++ args)) slurpLen 
    975972        maybeM rv $ \fun -> do 
    976973            -- if deltaFromCxt ret == 0 then return Nothing else do 
    977974            let pairs = map (typeOfCxt . paramContext) prms 
    978                             `zip` (map unwrap $ invs ++ args) 
     975                            `zip` (map unwrap $ maybeToList invs ++ args) 
    979976            deltaCxt    <- deltaFromCxt ret 
    980977            deltaArgs   <- mapM deltaFromPair pairs 
     
    1000997    sub <- fromVal val 
    1001998    return $ subReturns sub 
    1002 evalExpType (App (Var "&new") [(Val (VType typ))] _) = return typ 
    1003 evalExpType (App (Var "&new") [(Var (':':name))] _) = return $ mkType name 
     999evalExpType (App (Var "&new") (Just (Val (VType typ))) _) = return typ 
     1000evalExpType (App (Var "&new") (Just (Var (':':name))) _) = return $ mkType name 
    10041001evalExpType (App (Var name) invs args) = do 
    10051002    sub <- findSub name invs args 
     
    10511048Mostly delegates to 'doApply' after explicitly retrieving the local 'Env'. 
    10521049-} 
    1053 apply :: VCode -- ^ The sub to apply 
    1054       -> [Exp] -- ^ List of invocants 
    1055       -> [Exp] -- ^ List of arguments (non-invocant) 
     1050apply :: VCode       -- ^ The sub to apply 
     1051      -> (Maybe Exp) -- ^ invocant 
     1052      -> [Exp]       -- ^ List of arguments (non-invocant) 
    10561053      -> Eval Val 
    10571054apply sub invs args = do 
     
    10671064doApply :: Env   -- ^ Environment to evaluate in 
    10681065        -> VCode -- ^ Code to apply 
    1069         -> [Exp] -- ^ Invocants (arguments before the colon) 
     1066        -> (Maybe Exp) -- ^ Invocants (arguments before the colon) 
    10701067        -> [Exp] -- ^ Arguments (not including invocants) 
    10711068        -> Eval Val 
  • src/Pugs/Lexer.hs

    r3612 r3906  
    144144        = homogenConcat (Val (VStr (x ++ y)) : xs) 
    145145    homogenConcat (x:xs) 
    146         = App (Var "&infix:~") [x, homogenConcat xs] [] 
     146        = App (Var "&infix:~") Nothing [x, homogenConcat xs] 
    147147     
    148148    stringList = do 
  • src/Pugs/Parser.hs

    r3878 r3906  
    474474    val <- unsafeEvalExp $ 
    475475        if (map toLower author) == "-perl5" 
    476             then Stmts (Sym SGlobal (':':'*':pkg) (Syn ":=" [ Var (':':'*':pkg), App (Var "&require_perl5") [Val . VStr $ concat (intersperse "::" names)] [] ])) (Syn "env" []) 
    477