berp-0.0.1: src/Berp/Compile/PrimName.hs
-----------------------------------------------------------------------------
-- |
-- Module : Berp.Compile.PrimName
-- Copyright : (c) 2010 Bernie Pope
-- License : BSD-style
-- Maintainer : florbitous@gmail.com
-- Stability : experimental
-- Portability : ghc
--
-- Names for primtive functions used in the output of the compiler.
--
-----------------------------------------------------------------------------
module Berp.Compile.PrimName where
import Language.Haskell.Exts.Syntax as Hask
import Language.Python.Common.AST as Py
import Prelude hiding (read, init)
import Language.Haskell.Exts.Build
import Berp.Compile.Utils
preludeModuleName, berpModuleName :: ModuleName
berpModuleName = ModuleName "Berp.Base"
preludeModuleName = ModuleName "Prelude"
prim :: String -> Exp
prim = var . name
tailCall :: Exp
tailCall = prim "tailCall"
dict :: Exp
dict = prim "dictionary"
unaryPlus :: Exp
unaryPlus = prim "unaryPlus"
unaryMinus :: Exp
unaryMinus = prim "unaryMinus"
invert :: Exp
invert = prim "invert"
mkGenerator :: Exp
mkGenerator = prim "mkGenerator"
yield :: Exp
yield = prim "yield"
for :: Exp
for = prim "for"
forElse :: Exp
forElse = prim "forElse"
break :: Exp
break = prim "break"
continue :: Exp
continue = prim "continue"
raise :: Exp
raise = prim "raise"
raiseFrom :: Exp
raiseFrom = prim "raiseFrom"
reRaise :: Exp
reRaise = prim "reRaise"
exceptDefault :: Exp
exceptDefault = prim "exceptDefault"
except :: Exp
except = prim "except"
exceptAs :: Exp
exceptAs = prim "exceptAs"
stmt :: Exp
stmt = prim "stmt"
list :: Exp
list = prim "list"
try :: Exp
try = prim "try"
tryElse :: Exp
tryElse = prim "tryElse"
tryFinally :: Exp
tryFinally = prim "tryFinally"
tryElseFinally :: Exp
tryElseFinally = prim "tryElseFinally"
subscript :: Exp
subscript = prim "subs"
pure :: Exp
pure = prim "pure"
pureObj :: Exp
pureObj = prim "pureObject"
primOp :: String -> QOp
primOp = op . sym
assignOp :: QOp
assignOp = primOp "=:"
setAttr :: Exp
setAttr = prim "setattr"
while :: Exp
while = prim "while"
global :: Exp
global = prim "global"
globalRef :: Exp
globalRef = prim "globalRef"
topVar :: Exp
topVar = prim "topVar"
variable :: Exp
variable = prim "var"
globalVariable :: Exp
globalVariable = prim "globalVar"
tuple :: Exp
tuple = prim "tuple"
whileElse :: Exp
whileElse = prim "whileElse"
runStmt :: Exp
runStmt = prim "runStmt"
interpretStmt :: Exp
interpretStmt = prim "interpretStmt"
initName :: Name
initName = name "init"
init :: Exp
init = var initName
ret :: Exp
ret = prim "ret"
ite :: Exp
ite = prim "ifThenElse"
ifThen :: Exp
ifThen = prim "ifThen"
def :: Exp
def = prim "def"
klass :: Exp
klass = prim "klass"
lambda :: Exp
lambda = prim "lambda"
call :: Exp
call = prim "call"
apply :: QOp
apply = primOp "@@"
read :: Exp
read = prim "read"
integer :: Integer -> Exp
integer i = app (prim "integer") (intE i)
bool :: Bool -> Exp
bool b = if b then true else false
true,false :: Exp
true = prim "true"
false = prim "false"
none :: Exp
none = prim "none"
pass :: Exp
pass = prim "pass"
string :: String -> Exp
string s = app (prim "string") (strE s)
opExp :: Py.OpSpan -> Hask.QOp
opExp (And {}) = op $ name "and"
opExp (Or {}) = op $ name "or"
opExp (Exponent {}) = primOp "**"
opExp (LessThan {}) = primOp "<"
opExp (GreaterThan {}) = primOp ">"
opExp (Equality {}) = primOp "=="
opExp (GreaterThanEquals {}) = primOp ">=" -- not sure if this is official
opExp (LessThanEquals {}) = primOp "<="
opExp (NotEquals {}) = primOp "!="
opExp (BinaryOr {}) = primOp "||"
opExp (Xor {}) = primOp "^"
opExp (BinaryAnd {}) = primOp "&"
opExp (ShiftLeft {}) = primOp "<<"
opExp (ShiftRight {}) = primOp ">>"
opExp (Multiply {}) = primOp "*"
opExp (Plus {}) = primOp "+"
opExp (Minus {}) = primOp "-"
opExp (Divide {}) = primOp "/"
opExp (FloorDivide {}) = primOp "//"
opExp (Invert {}) = primOp "~"
opExp (Modulo {}) = primOp "%"
opExp (Dot {}) = primOp "."
opExp other = unsupported $ "opExp: " ++ show other