Changeset 17870 for src/Pugs/Prim.hs
- Timestamp:
- 09/16/07 15:05:07 (14 months ago)
- Files:
-
- 1 modified
-
src/Pugs/Prim.hs (modified) (4 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/Pugs/Prim.hs
r17865 r17870 1456 1456 op1Range (VInt int) 1457 1457 1458 {- In the four op2Range* functions below, rationals 1459 have to be handled separately because Haskell ranges 1460 are different from Perl 6 ranges. For example, 1461 in Haskell, [1.1 .. 2] will return [1.1,2.1]. So, we 1462 run the elements through a filter to ensure that the 1463 upper bound is satisfied 1464 -} 1458 1465 op2Range :: Val -> Val -> Eval Val 1459 1466 op2Range (VStr s) y = do … … 1468 1475 op2Range (VRat n) y = do 1469 1476 y' <- fromVal y 1470 return . VList $ map VRat [n .. y']1477 return . VList $ map VRat (filter (<= y') [n .. y']) 1471 1478 op2Range x (VRat n) = do 1472 1479 x' <- fromVal x 1473 return . VList $ map VRat [x' .. n]1480 return . VList $ map VRat (filter (<= n) [x' .. n]) 1474 1481 op2Range x y = do 1475 1482 x' <- fromVal x … … 1477 1484 return . VList $ map VInt [x' .. y'] 1478 1485 1486 -- because the right-exclusivity of a range can leave it 1487 -- with no remaining elements, we need to check before 1488 -- removing an element when enforcing left-exclusivity 1489 removeRangeFirst :: [Val] -> [Val] 1490 removeRangeFirst vals = if null vals then vals else init vals 1491 1479 1492 op2RangeExclRight :: Val -> Val -> Eval Val 1493 op2RangeExclRight (VRat n) y = do 1494 y' <- fromVal y 1495 return . VList $ map VRat (filter (< y') [n .. y']) 1496 op2RangeExclRight x (VRat n) = do 1497 x' <- fromVal x 1498 return . VList $ map VRat (filter (< n) [x' .. n]) 1480 1499 op2RangeExclRight x y = do 1481 1500 VList vals <- op2Range x y 1482 return . VList $ init vals1501 return . VList $ removeRangeFirst vals 1483 1502 1484 1503 op2RangeExclLeft :: Val -> Val -> Eval Val 1504 op2RangeExclLeft (VRat n) y = do 1505 y' <- fromVal y 1506 return . VList $ map VRat (filter (\v -> n < v && v <= y') [n .. y']) 1507 op2RangeExclLeft x (VRat n) = do 1508 x' <- fromVal x 1509 return . VList $ map VRat (filter (\v -> x' < v && v <= n) [x' .. n]) 1485 1510 op2RangeExclLeft x y = do 1486 1511 VList vals <- op2Range x y … … 1488 1513 1489 1514 op2RangeExclBoth :: Val -> Val -> Eval Val 1515 op2RangeExclBoth (VRat n) y = do 1516 y' <- fromVal y 1517 return . VList $ map VRat (filter (\v -> n < v && v < y') [n .. y']) 1518 op2RangeExclBoth x (VRat n) = do 1519 x' <- fromVal x 1520 return . VList $ map VRat (filter (\v -> x' < v && v < n) [x' .. n]) 1490 1521 op2RangeExclBoth x y = do 1491 1522 VList vals <- op2Range x y 1492 return . VList $ init (tail vals)1523 return . VList $ removeRangeFirst (tail vals) 1493 1524 1494 1525 op2ChainedList :: Val -> Val -> Val
