Elm version using BigNums.

This went pretty smoothly, I just followed the compiler errors after
substituting Integer for Int in the type definition.

The only tricky thing is that the div and mod functions for Integer
return Maybe Integer rather than just Integer, so I need to wrap those
or something?  (For now I just put in add to get it to compile.)

Oh, and "not equal" is not correct? The compiler didn't complain.
This commit is contained in:
sforman 2023-09-02 11:30:18 -07:00
parent 10c1d6ccde
commit 68488cc9d2
1 changed files with 26 additions and 46 deletions

View File

@ -4,11 +4,12 @@ import Bitwise
import Dict exposing (Dict, get, insert) import Dict exposing (Dict, get, insert)
import Result exposing (andThen) import Result exposing (andThen)
import String exposing (lines, replace, words) import String exposing (lines, replace, words)
import Integer exposing (Integer)
type JoyType type JoyType
= JoySymbol String = JoySymbol String
| JoyInt Int | JoyInt Integer
| JoyList (List JoyType) | JoyList (List JoyType)
| JoyTrue | JoyTrue
| JoyFalse | JoyFalse
@ -151,46 +152,46 @@ joy_function_eval symbol stack expression =
joy_loop stack expression joy_loop stack expression
"+" -> "+" ->
joy_binary_math_op (+) stack expression joy_binary_math_op (Integer.add) stack expression
"-" -> "-" ->
joy_binary_math_op (-) stack expression joy_binary_math_op (Integer.sub) stack expression
"*" -> "*" ->
joy_binary_math_op (*) stack expression joy_binary_math_op (Integer.mul) stack expression
"/" -> "/" ->
joy_binary_math_op (//) stack expression joy_binary_math_op (Integer.add) stack expression
"%" -> "%" ->
joy_binary_math_op (swap_args remainderBy) stack expression joy_binary_math_op (swap_args Integer.add) stack expression
"add" -> "add" ->
joy_binary_math_op (+) stack expression joy_binary_math_op (Integer.add) stack expression
"sub" -> "sub" ->
joy_binary_math_op (-) stack expression joy_binary_math_op (Integer.sub) stack expression
"mul" -> "mul" ->
joy_binary_math_op (*) stack expression joy_binary_math_op (Integer.mul) stack expression
"div" -> "div" ->
joy_binary_math_op (//) stack expression joy_binary_math_op (Integer.add) stack expression
"mod" -> "mod" ->
joy_binary_math_op (swap_args remainderBy) stack expression joy_binary_math_op (swap_args Integer.add) stack expression
"<" -> "<" ->
joy_comparison_op (<) stack expression joy_comparison_op (Integer.lt) stack expression
">" -> ">" ->
joy_comparison_op (>) stack expression joy_comparison_op (Integer.gt) stack expression
"<=" -> "<=" ->
joy_comparison_op (<=) stack expression joy_comparison_op (Integer.lt) stack expression
">=" -> ">=" ->
joy_comparison_op (>=) stack expression joy_comparison_op (Integer.gte) stack expression
"<>" -> "<>" ->
joy_comparison_op (/=) stack expression joy_comparison_op (/=) stack expression
@ -199,28 +200,7 @@ joy_function_eval symbol stack expression =
joy_comparison_op (/=) stack expression joy_comparison_op (/=) stack expression
"=" -> "=" ->
joy_comparison_op (==) stack expression joy_comparison_op (Integer.eq) stack expression
"&&" ->
joy_binary_math_op Bitwise.and stack expression
"||" ->
joy_binary_math_op Bitwise.or stack expression
"xor" ->
joy_binary_math_op Bitwise.xor stack expression
"lshift" ->
joy_binary_math_op (swap_args Bitwise.shiftLeftBy) stack expression
"<<" ->
joy_binary_math_op (swap_args Bitwise.shiftLeftBy) stack expression
"rshift" ->
joy_binary_math_op (swap_args Bitwise.shiftRightBy) stack expression
">>" ->
joy_binary_math_op (swap_args Bitwise.shiftRightBy) stack expression
"/\\" -> "/\\" ->
joy_logical_op (&&) stack expression joy_logical_op (&&) stack expression
@ -360,7 +340,7 @@ joy_loop stack expression =
Err msg Err msg
joy_binary_math_op : (Int -> Int -> Int) -> JoyFunction joy_binary_math_op : (Integer -> Integer -> Integer) -> JoyFunction
joy_binary_math_op op 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 ) ->
@ -375,12 +355,12 @@ joy_binary_math_op op stack expression =
Err msg Err msg
swap_args : (Int -> Int -> Int) -> (Int -> Int -> Int) swap_args : (Integer -> Integer -> Integer) -> (Integer -> Integer -> Integer)
swap_args op = swap_args op =
\a b -> op b a \a b -> op b a
joy_comparison_op : (Int -> Int -> Bool) -> JoyFunction joy_comparison_op : (Integer -> Integer -> Bool) -> JoyFunction
joy_comparison_op op stack expression = joy_comparison_op op stack expression =
case pop_int stack of case pop_int stack of
Ok ( a, s0 ) -> Ok ( a, s0 ) ->
@ -532,7 +512,7 @@ joy_truthy stack expression =
Ok ( stack, expression ) Ok ( stack, expression )
JoyInt i -> JoyInt i ->
if 0 == i then if Integer.eq Integer.zero i then
Ok ( JoyFalse :: s0, expression ) Ok ( JoyFalse :: s0, expression )
else else
@ -561,7 +541,7 @@ push_bool flag stack =
JoyFalse :: stack JoyFalse :: stack
push_int : Int -> JList -> JList push_int : Integer -> JList -> JList
push_int i stack = push_int i stack =
JoyInt i :: stack JoyInt i :: stack
@ -576,7 +556,7 @@ push_any j stack =
j :: stack j :: stack
pop_int : JList -> Result JoyErr ( Int, JList ) pop_int : JList -> Result JoyErr ( Integer, JList )
pop_int stack = pop_int stack =
pop_any stack |> andThen isnt_int pop_any stack |> andThen isnt_int
@ -601,7 +581,7 @@ pop_any stack =
Ok ( item, rest ) Ok ( item, rest )
isnt_int : ( JoyType, JList ) -> Result JoyErr ( Int, JList ) isnt_int : ( JoyType, JList ) -> Result JoyErr ( Integer, JList )
isnt_int ( item, stack ) = isnt_int ( item, stack ) =
case item of case item of
JoyInt i -> JoyInt i ->
@ -645,7 +625,7 @@ joyTermToString term =
name name
JoyInt n -> JoyInt n ->
String.fromInt n Integer.toString n
JoyTrue -> JoyTrue ->
"true" "true"
@ -680,7 +660,7 @@ tokenator tok =
JoyFalse JoyFalse
_ -> _ ->
case String.toInt tok of case Integer.fromString tok of
Just i -> Just i ->
JoyInt i JoyInt i