| | 291 | |
| | 292 | op1HyperPrefix :: VCode -> Val -> Eval Val |
| | 293 | op1HyperPrefix sub (VRef ref) = do |
| | 294 | x <- readRef ref |
| | 295 | op1HyperPrefix sub x |
| | 296 | op1HyperPrefix sub x |
| | 297 | | VList x' <- x |
| | 298 | = fmap VList $ hyperList x' |
| | 299 | | otherwise |
| | 300 | = fail "Hyper OP only works on lists" |
| | 301 | where |
| | 302 | doHyper x |
| | 303 | | VRef x' <- x |
| | 304 | = doHyper =<< readRef x' |
| | 305 | | otherwise |
| | 306 | = enterEvalContext cxtItemAny $ App (Val $ VCode sub) Nothing [Val x] |
| | 307 | hyperList [] = return [] |
| | 308 | hyperList (x:xs) = do |
| | 309 | val <- doHyper x |
| | 310 | rest <- hyperList xs |
| | 311 | return (val:rest) |
| | 312 | |
| | 313 | op1HyperPostfix :: VCode -> Val -> Eval Val |
| | 314 | op1HyperPostfix = op1HyperPrefix |
| | 315 | |
| | 316 | op2Hyper :: VCode -> Val -> Val -> Eval Val |
| | 317 | op2Hyper sub (VRef ref) y = do |
| | 318 | x <- readRef ref |
| | 319 | op2Hyper sub x y |
| | 320 | op2Hyper sub x (VRef ref) = do |
| | 321 | y <- readRef ref |
| | 322 | op2Hyper sub x y |
| | 323 | op2Hyper sub x y |
| | 324 | | VList x' <- x, VList y' <- y |
| | 325 | = fmap VList $ hyperLists x' y' |
| | 326 | | VList x' <- x |
| | 327 | = fmap VList $ mapM ((flip doHyper) y) x' |
| | 328 | | VList y' <- y |
| | 329 | = fmap VList $ mapM (doHyper x) y' |
| | 330 | | otherwise |
| | 331 | = fail "Hyper OP only works on lists" |
| | 332 | where |
| | 333 | doHyper x y = enterEvalContext cxtItemAny $ App (Val $ VCode sub) Nothing [Val x, Val y] |
| | 334 | hyperLists [] [] = return [] |
| | 335 | hyperLists xs [] = return xs |
| | 336 | hyperLists [] ys = return ys |
| | 337 | hyperLists (x:xs) (y:ys) = do |
| | 338 | val <- doHyper x y |
| | 339 | rest <- hyperLists xs ys |
| | 340 | return (val:rest) |
| | 341 | |