git.fiddlerwoaroof.com
progs/prelude/PreludePrims.hi
4e987026
 -- interface.scm -- define interface to primitives
 --
 -- author :  Sandra & John
 -- date   :  24 Apr 1992
 --
 -- This file declares the interface to the runtime system primitives.
 -- The actual definitions for the Lisp functions all appear elsewhere;
 -- they all have names like prim.xxx.  (They can actually be macros
 -- instead of functions since they're never referenced by name.)
 
 interface PreludePrims where
 
 {-# Prelude #-}
 
 import PreludeCore(Int,Integer,Float,Double,Char,Bool)
 import PreludeRational(Rational)
 
 error :: String -> a
 primCharToInt :: Char -> Int
 primIntToChar :: Int -> Char
 primEqChar, primNeqChar, primLeChar, primGtChar, primLsChar, primGeChar
   :: Char -> Char -> Bool
 primMaxChar :: Int
 primEqFloat, primNeqFloat, primLeFloat, primGtFloat, primLsFloat, primGeFloat
   :: Float -> Float -> Bool
 primFloatMax, primFloatMin :: Float -> Float -> Float
 primEqDouble, primNeqDouble, primLeDouble, primGtDouble, 
               primLsDouble, primGeDouble
   :: Double -> Double -> Bool
 primDoubleMax, primDoubleMin :: Double -> Double -> Double
 primPlusFloat, primMinusFloat, primMulFloat, primDivFloat
   :: Float -> Float -> Float
 primPlusDouble, primMinusDouble, primMulDouble, primDivDouble
   :: Double -> Double -> Double
 primNegFloat, primAbsFloat :: Float -> Float
 primNegDouble, primAbsDouble :: Double -> Double
 primExpFloat, primLogFloat, primSqrtFloat, primSinFloat, primCosFloat,
   primTanFloat, primAsinFloat, primAcosFloat, primAtanFloat, primSinhFloat,
   primCoshFloat, primTanhFloat, primAsinhFloat, primAcoshFloat, primAtanhFloat
   :: Float -> Float
 primExpDouble, primLogDouble, primSqrtDouble, primSinDouble, primCosDouble,
   primTanDouble, primAsinDouble, primAcosDouble, primAtanDouble, primSinhDouble,
   primCoshDouble, primTanhDouble, primAsinhDouble, primAcoshDouble, primAtanhDouble
   :: Double -> Double
 primPiFloat :: Float
 primPiDouble :: Double
 primRationalToFloat :: Rational -> Float
 primRationalToDouble :: Rational -> Double
 primFloatToRational :: Float -> Rational
 primDoubleToRational :: Double -> Rational
 primFloatDigits :: Int
 primFloatRadix :: Integer
 primFloatMinExp :: Int
 primFloatMaxExp :: Int
 primFloatRange :: Float -> (Int, Int)
 primDecodeFloat :: Float -> (Integer, Int)
 primEncodeFloat :: Integer -> Int -> Float
 primDoubleDigits :: Int
 primDoubleRadix :: Integer
 primDoubleMinExp :: Int
 primDoubleMaxExp :: Int
 primDoubleRange :: Double -> (Int, Int)
 primDecodeDouble :: Double -> (Integer, Int)
 primEncodeDouble :: Integer -> Int -> Double
 primEqInt, primNeqInt, primLeInt, primGtInt, primLsInt, primGeInt
   :: Int -> Int -> Bool
 primIntMax, primIntMin :: Int -> Int -> Int
 primEqInteger, primNeqInteger, primLeInteger, primGtInteger,
   primLsInteger, primGeInteger
     :: Integer -> Integer -> Bool
 primIntegerMax, primIntegerMin :: Integer -> Integer -> Integer
 primPlusInt, primMinusInt, primMulInt :: Int -> Int -> Int 
 primMinInt,primMaxInt :: Int
 primNegInt, primAbsInt :: Int -> Int
 primPlusInteger, primMinusInteger, primMulInteger :: Integer -> Integer -> Integer 
 primNegInteger, primAbsInteger :: Integer -> Integer
 primQuotRemInt :: Int -> Int -> (Int, Int)
 primQuotRemInteger :: Integer -> Integer -> (Integer, Integer)
 primIntegerToInt :: Integer -> Int
 primIntToInteger :: Int -> Integer
 primNullBin :: Bin
 primIsNullBin :: Bin -> Bool
 primShowBinInt :: Int -> Bin -> Bin
 primShowBinInteger :: Integer -> Bin -> Bin
 primShowBinFloat :: Float -> Bin -> Bin
 primShowBinDouble :: Double -> Bin -> Bin
 primReadBinInt :: Bin -> (Int,Bin)
 primReadBinInteger :: Bin -> (Integer,Bin)
 primReadBinFloat :: Bin -> (Float,Bin)
 primReadBinDouble :: Bin -> (Double,Bin)
 primReadBinSmallInt :: Bin -> Int -> (Int,Bin)
 primAppendBin :: Bin -> Bin -> Bin
 
 primStringEq  :: [Char] -> [Char] -> Bool
 
 primAppend :: [a] -> [a] -> [a]
 primTake :: Int -> [a] -> [a]
 
 foldr :: (a -> b -> b) -> b -> [a] -> b
 build :: ((a -> [a] -> [a]) -> [b] -> [c]) -> [c]
 
 
 
 -- I've assigned complexities for arithmetic primitives as follows:
 -- Int and Char comparisons and arithmetic are very cheap (complexity 1).
 -- Double and Float comparsions are also cheap, but most implementations
 --   need to box the results of floating-point arithmetic so I have given
 --   them a complexity of 3.
 -- Integer operations need to do an extra bignum check that has a fixed
 --   overhead.  I assume that actual bignums will be rare and give them
 --   all a complexity of 2.
 
 {-#
 error :: LispName("prim.abort")
 primCharToInt ::    LispName("prim.char-to-int"), Complexity(0),NoConversion
 primIntToChar ::    LispName("prim.int-to-char"), Complexity(0),NoConversion
 primEqChar ::       LispName("prim.eq-char"), Complexity(1), NoConversion
 primNeqChar::       LispName("prim.not-eq-char"), Complexity(1), NoConversion
 primLeChar ::       LispName("prim.le-char"), Complexity(1), NoConversion
 primGtChar ::       LispName("prim.not-le-char"), Complexity(1), NoConversion
 primLsChar ::       LispName("prim.lt-char"), Complexity(1), NoConversion
 primGeChar ::       LispName("prim.not-lt-char"), Complexity(1), NoConversion
 primMaxChar ::      LispName("prim.max-char"), NoConversion
 primEqFloat ::      LispName("prim.eq-float"), Complexity(1)
 primNeqFloat ::     LispName("prim.not-eq-float"), Complexity(1)
 primLeFloat  ::     LispName("prim.le-float"), Complexity(1)
 primGtFloat  ::     LispName("prim.not-le-float"), Complexity(1)
 primLsFloat  ::     LispName("prim.lt-float"), Complexity(1)
 primGeFloat  ::     LispName("prim.not-lt-float"), Complexity(1)
 primFloatMax ::     LispName("prim.float-max"), Complexity(3)
 primFloatMin ::     LispName("prim.float-min"), Complexity(3)
 primEqDouble  ::    LispName("prim.eq-double"), Complexity(1)
 primNeqDouble ::    LispName("prim.not-eq-double"), Complexity(1)
 primLeDouble  ::    LispName("prim.le-double"), Complexity(1)
 primGtDouble  ::    LispName("prim.not-le-double"), Complexity(1)
 primLsDouble  ::    LispName("prim.lt-double"), Complexity(1)
 primGeDouble  ::    LispName("prim.not-lt-double"), Complexity(1)
 primDoubleMax ::    LispName("prim.double-max"), Complexity(3)
 primDoubleMin ::    LispName("prim.double-min"), Complexity(3)
 primPlusFloat  ::   LispName("prim.plus-float"), Complexity(3)
 primMinusFloat ::   LispName("prim.minus-float"), Complexity(3)
 primMulFloat   ::   LispName("prim.mul-float"), Complexity(3)
 primDivFloat   ::   LispName("prim.div-float"), Complexity(3)
 primPlusDouble  ::  LispName("prim.plus-double"), Complexity(3)
 primMinusDouble ::  LispName("prim.minus-double"), Complexity(3)
 primMulDouble   ::  LispName("prim.mul-double"), Complexity(3)
 primDivDouble   ::  LispName("prim.div-double"), Complexity(3)
 primNegFloat ::     LispName("prim.neg-float"), Complexity(3)
 primAbsFloat ::     LispName("prim.abs-float"), Complexity(3)
 primNegDouble ::    LispName("prim.neg-double"), Complexity(3)
 primAbsDouble ::    LispName("prim.abs-double"), Complexity(3)
 primExpFloat   ::   LispName("prim.exp-float")
 primLogFloat   ::   LispName("prim.log-float")
 primSqrtFloat  ::   LispName("prim.sqrt-float")
 primSinFloat   ::   LispName("prim.sin-float")
 primCosFloat   ::   LispName("prim.cos-float")
 primTanFloat   ::   LispName("prim.tan-float")
 primAsinFloat  ::   LispName("prim.asin-float")
 primAcosFloat  ::   LispName("prim.acos-float")
 primAtanFloat  ::   LispName("prim.atan-float")
 primSinhFloat  ::   LispName("prim.sinh-float")
 primCoshFloat  ::   LispName("prim.cosh-float")
 primTanhFloat  ::   LispName("prim.tanh-float")
 primAsinhFloat ::   LispName("prim.asinh-float")
 primAcoshFloat ::   LispName("prim.acosh-float")
 primAtanhFloat ::   LispName("prim.atanh-float")
 primExpDouble   ::  LispName("prim.exp-double")
 primLogDouble   ::  LispName("prim.log-double")
 primSqrtDouble  ::  LispName("prim.sqrt-double")
 primSinDouble   ::  LispName("prim.sin-double")
 primCosDouble   ::  LispName("prim.cos-double")
 primTanDouble   ::  LispName("prim.tan-double")
 primAsinDouble  ::  LispName("prim.asin-double")
 primAcosDouble  ::  LispName("prim.acos-double")
 primAtanDouble  ::  LispName("prim.atan-double")
 primSinhDouble  ::  LispName("prim.sinh-double")
 primCoshDouble  ::  LispName("prim.cosh-double")
 primTanhDouble  ::  LispName("prim.tanh-double")
 primAsinhDouble ::  LispName("prim.asinh-double")
 primAcoshDouble ::  LispName("prim.acosh-double")
 primAtanhDouble ::  LispName("prim.atanh-double")
 primPiFloat ::      LispName("prim.pi-float")
 primPiDouble ::     LispName("prim.pi-double")
 primRationalToFloat  :: LispName("prim.rational-to-float"), Complexity(3)
 primRationalToDouble :: LispName("prim.rational-to-double"), Complexity(3)
 primFloatToRational  :: LispName("prim.float-to-rational"), Complexity(3)
 primDoubleToRational :: LispName("prim.double-to-rational"), Complexity(3)
 primFloatDigits ::  LispName("prim.float-digits")
 primFloatRadix ::   LispName("prim.float-radix")
 primFloatMinExp ::  LispName("prim.float-min-exp")
 primFloatMaxExp ::  LispName("prim.float-max-exp")
 primFloatRange ::   LispName("prim.float-range")
 primDecodeFloat ::  LispName("prim.decode-float")
 primEncodeFloat ::  LispName("prim.encode-float")
 primDoubleDigits :: LispName("prim.double-digits")
 primDoubleRadix ::  LispName("prim.double-radix")
 primDoubleMinExp :: LispName("prim.double-min-exp")
 primDoubleMaxExp :: LispName("prim.double-max-exp")
 primDoubleRange ::  LispName("prim.double-range")
 primDecodeDouble :: LispName("prim.decode-double")
 primEncodeDouble :: LispName("prim.encode-double")
 primEqInt ::        LispName("prim.eq-int"), Complexity(1)
 primNeqInt::        LispName("prim.not-eq-int"), Complexity(1)
 primLeInt ::        LispName("prim.le-int"), Complexity(1)
 primGtInt ::        LispName("prim.not-le-int"), Complexity(1)
 primLsInt ::        LispName("prim.lt-int"), Complexity(1)
 primGeInt ::        LispName("prim.not-lt-int"), Complexity(1)
 primIntMax ::       LispName("prim.int-max"), Complexity(1)
 primIntMin ::       LispName("prim.int-min"), Complexity(1)
 primEqInteger ::    LispName("prim.eq-integer"), Complexity(2)
 primNeqInteger::    LispName("prim.not-eq-integer"), Complexity(2)
 primLeInteger ::    LispName("prim.le-integer"), Complexity(2)
 primGtInteger ::    LispName("prim.not-le-integer"), Complexity(2)
 primLsInteger ::    LispName("prim.lt-integer"), Complexity(2)
 primGeInteger ::    LispName("prim.not-lt-integer"), Complexity(2)
 primIntegerMax ::   LispName("prim.integer-max"), Complexity(2)
 primIntegerMin ::   LispName("prim.integer-min"), Complexity(2)
 primPlusInt  ::     LispName("prim.plus-int"), Complexity(1)
 primMinusInt ::     LispName("prim.minus-int"), Complexity(1)
 primMulInt   ::     LispName("prim.mul-int"), Complexity(1)
 primMinInt ::       LispName("prim.minint")
 primMaxInt ::       LispName("prim.maxint")
 primNegInt ::       LispName("prim.neg-int"), Complexity(1)
 primAbsInt ::       LispName("prim.abs-int"), Complexity(1)
 primPlusInteger  :: LispName("prim.plus-integer"), Complexity(2)
 primMinusInteger :: LispName("prim.minus-integer"), Complexity(2)
 primMulInteger   :: LispName("prim.mul-integer"), Complexity(2)
 primNegInteger ::   LispName("prim.neg-integer"), Complexity(2)
 primAbsInteger ::   LispName("prim.abs-integer"), Complexity(2)
 primQuotRemInt ::   LispName("prim.div-rem-int")
 primQuotRemInteger :: LispName("prim.div-rem-integer")
 primIntegerToInt :: LispName("prim.integer-to-int"), Complexity(1)
 primIntToInteger :: LispName("prim.int-to-integer"), Complexity(0)
 primNullBin ::      LispName("prim.nullbin")
 primIsNullBin ::    LispName("prim.is-null-bin"), Complexity(1)
 primShowBinInt ::   LispName("prim.show-bin-int"), Complexity(2)
 primShowBinInteger :: LispName("prim.show-bin-integer"), Complexity(2)
 primShowBinFloat ::   LispName("prim.show-bin-float"), Complexity(2)
 primShowBinDouble ::  LispName("prim.show-bin-double"), Complexity(2)
 primReadBinInt ::     LispName("prim.read-bin-int")
 primReadBinInteger :: LispName("prim.read-bin-integer")
 primReadBinFloat ::   LispName("prim.read-bin-float")
 primReadBinDouble ::  LispName("prim.read-bin-double")
 primReadBinSmallInt :: LispName("prim.read-bin-small-int")
 primAppendBin ::      LispName("prim.append-bin")
 primStringEq :: LispName("prim.string-eq"), Strictness("S,S"), NoConversion
 primAppend :: LispName("prim.append"), Strictness("S,N"), NoConversion
 primTake   :: LispName("prim.take"), Strictness("S,S"), NoConversion
 foldr   :: LispName("prim.foldr"), Strictness("N,N,S"), NoConversion
 build   :: LispName("prim.build"), Strictness("S"), NoConversion
 
 #-}