Binary Math Ops

This commit is contained in:
sforman 2023-07-29 07:32:56 -07:00
parent dc065d1943
commit b6b3acf350
1 changed files with 15 additions and 4 deletions

View File

@ -2,6 +2,7 @@ module Joy exposing (doit)
import String exposing (replace, words) import String exposing (replace, words)
import Result exposing (andThen) import Result exposing (andThen)
import Bitwise
type JoyType type JoyType
@ -33,21 +34,31 @@ joy stack expression =
joy_eval : String -> (List JoyType) -> (List JoyType) -> Result String (List JoyType, List JoyType) joy_eval : String -> (List JoyType) -> (List JoyType) -> Result String (List JoyType, List JoyType)
joy_eval symbol stack expression = joy_eval symbol stack expression =
case symbol of case symbol of
"+" -> joy_add stack expression "+" -> joy_binary_math_op (+) stack expression
"-" -> joy_binary_math_op (-) stack expression
"*" -> joy_binary_math_op (*) stack expression
"/" -> joy_binary_math_op (//) stack expression
"%" -> joy_binary_math_op (modBy) stack expression
"and" -> joy_binary_math_op (Bitwise.and) stack expression
"or" -> joy_binary_math_op (Bitwise.or) stack expression
"xor" -> joy_binary_math_op (Bitwise.xor) stack expression
_ -> Err ("Unknown word: " ++ symbol) _ -> Err ("Unknown word: " ++ symbol)
joy_add : (List JoyType) -> (List JoyType) -> Result String (List JoyType, List JoyType) joy_binary_math_op : (Int -> Int -> Int) -> (List JoyType) -> (List JoyType) -> Result String (List JoyType, List JoyType)
joy_add stack expression = joy_binary_math_op op stack expression =
case pop_int(stack) of case pop_int(stack) of
Ok (a, s0) -> Ok (a, s0) ->
case pop_int(s0) of case pop_int(s0) of
Ok (b, s1) -> Ok (b, s1) ->
Ok ((push_int ((+) a b) s1), expression) Ok ((push_int (op b a) s1), expression)
Err msg -> Err msg Err msg -> Err msg
Err msg -> Err msg Err msg -> Err msg
push_int : Int -> (List JoyType) -> (List JoyType) push_int : Int -> (List JoyType) -> (List JoyType)
push_int i stack = (JoyInt i) :: stack push_int i stack = (JoyInt i) :: stack