mirror of
https://github.com/roc-lang/roc.git
synced 2025-09-28 14:24:45 +00:00
Remove '*'s and make error union nice
This commit is contained in:
parent
00c5d4d0b0
commit
f412ffd2d0
1 changed files with 17 additions and 15 deletions
|
@ -19,7 +19,9 @@ app "false"
|
|||
# This implementation is easy to overflow, either make the input long enough or make a false while loop run long enough.
|
||||
# I assume all of the Task.awaits are the cause of this, but I am not 100% sure.
|
||||
|
||||
main : List Str -> Task {} *
|
||||
InterpreterErrors : [ BadUtf8, DivByZero, EmptyStack, InvalidBooleanValue, InvalidChar Str, NoLambdaOnStack, NoNumberOnStack Context.Data, NoVariableOnStack, OutOfBounds, UnexpectedEndOfData ]
|
||||
|
||||
main : List Str -> Task {} []
|
||||
main = \filenames ->
|
||||
filenames
|
||||
|> List.walk (\filename, task -> Task.await task (\_ -> (interpretFile filename))) (Task.succeed {})
|
||||
|
@ -27,7 +29,7 @@ main = \filenames ->
|
|||
|> Task.onFail (\StringErr e -> Stdout.line "Ran into problem:\n\(e)\n")
|
||||
|
||||
|
||||
interpretFile : Str -> Task {} [ StringErr Str ]*
|
||||
interpretFile : Str -> Task {} [ StringErr Str ]
|
||||
interpretFile = \filename ->
|
||||
{} <- Task.await (Stdout.line "\nInterpreting file: \(filename)\n")
|
||||
ctx <- Context.with filename
|
||||
|
@ -74,7 +76,7 @@ isWhitespace = \char ->
|
|||
|| char == 0x20 # space
|
||||
|| char == 0x9 # tab
|
||||
|
||||
interpretContext : Context -> Task Context [ BadUtf8, DivByZero, EmptyStack, InvalidBooleanValue, InvalidChar Str, NoLambdaOnStack, NoNumberOnStack Context.Data, NoVariableOnStack, OutOfBounds, UnexpectedEndOfData ]*
|
||||
interpretContext : Context -> Task Context InterpreterErrors
|
||||
interpretContext = \ctx ->
|
||||
# If I move this definition below interpretContext it breaks.
|
||||
runLambda = \baseCtx, bytes ->
|
||||
|
@ -321,7 +323,7 @@ interpretContext = \ctx ->
|
|||
# Computation complete.
|
||||
Task.succeed ctx
|
||||
|
||||
unaryOp: Context, (I64 -> I64) -> Task Context [ BadUtf8, DivByZero, EmptyStack, InvalidBooleanValue, InvalidChar Str, NoLambdaOnStack, NoNumberOnStack Context.Data, NoVariableOnStack, OutOfBounds, UnexpectedEndOfData ]*
|
||||
unaryOp: Context, (I64 -> I64) -> Task Context InterpreterErrors
|
||||
unaryOp = \ctx, op ->
|
||||
result =
|
||||
(T popCtx num) <- Result.after (popNumber ctx)
|
||||
|
@ -332,7 +334,7 @@ unaryOp = \ctx, op ->
|
|||
Err e ->
|
||||
Task.fail e
|
||||
|
||||
binaryOp: Context, (I64, I64 -> I64) -> Task Context [ BadUtf8, DivByZero, EmptyStack, InvalidBooleanValue, InvalidChar Str, NoLambdaOnStack, NoNumberOnStack Context.Data, NoVariableOnStack, OutOfBounds, UnexpectedEndOfData ]*
|
||||
binaryOp: Context, (I64, I64 -> I64) -> Task Context InterpreterErrors
|
||||
binaryOp = \ctx, op ->
|
||||
result =
|
||||
(T popCtx1 numR) <- Result.after (popNumber ctx)
|
||||
|
@ -345,7 +347,7 @@ binaryOp = \ctx, op ->
|
|||
Task.fail e
|
||||
|
||||
|
||||
popNumber: Context -> Result [T Context I64] [ BadUtf8, DivByZero, EmptyStack, InvalidBooleanValue, InvalidChar Str, NoLambdaOnStack, NoNumberOnStack Context.Data, NoVariableOnStack, OutOfBounds, UnexpectedEndOfData ]*
|
||||
popNumber: Context -> Result [T Context I64] InterpreterErrors
|
||||
popNumber = \ctx ->
|
||||
when Context.popStack ctx is
|
||||
Ok (T popCtx (Number num)) ->
|
||||
|
@ -355,7 +357,7 @@ popNumber = \ctx ->
|
|||
Err EmptyStack ->
|
||||
Err EmptyStack
|
||||
|
||||
popLambda: Context -> Result [T Context (List U8)] [ BadUtf8, DivByZero, EmptyStack, InvalidBooleanValue, InvalidChar Str, NoLambdaOnStack, NoNumberOnStack Context.Data, NoVariableOnStack, OutOfBounds, UnexpectedEndOfData ]*
|
||||
popLambda: Context -> Result [T Context (List U8)] InterpreterErrors
|
||||
popLambda = \ctx ->
|
||||
when Context.popStack ctx is
|
||||
Ok (T popCtx (Lambda bytes)) ->
|
||||
|
@ -365,7 +367,7 @@ popLambda = \ctx ->
|
|||
Err EmptyStack ->
|
||||
Err EmptyStack
|
||||
|
||||
popVariable: Context -> Result [T Context Variable] [ BadUtf8, DivByZero, EmptyStack, InvalidBooleanValue, InvalidChar Str, NoLambdaOnStack, NoNumberOnStack Context.Data, NoVariableOnStack, OutOfBounds, UnexpectedEndOfData ]*
|
||||
popVariable: Context -> Result [T Context Variable] InterpreterErrors
|
||||
popVariable = \ctx ->
|
||||
when Context.popStack ctx is
|
||||
Ok (T popCtx (Var var)) ->
|
||||
|
@ -377,12 +379,12 @@ popVariable = \ctx ->
|
|||
|
||||
# This has to be a bit more complex than other options because they can be nested.
|
||||
# Also, it puts the lambda on the stack
|
||||
pushLambda: Context -> Task Context [ BadUtf8, DivByZero, EmptyStack, InvalidBooleanValue, InvalidChar Str, NoLambdaOnStack, NoNumberOnStack Context.Data, NoVariableOnStack, OutOfBounds, UnexpectedEndOfData ]*
|
||||
pushLambda: Context -> Task Context InterpreterErrors
|
||||
pushLambda = \ctx ->
|
||||
(T newCtx bytes) <- Task.await (pushLambdaHelper ctx [] 0)
|
||||
Task.succeed (Context.pushStack newCtx (Lambda bytes))
|
||||
|
||||
pushLambdaHelper: Context, List U8, U64 -> Task [ T Context (List U8) ] [ BadUtf8, DivByZero, EmptyStack, InvalidBooleanValue, InvalidChar Str, NoLambdaOnStack, NoNumberOnStack Context.Data, NoVariableOnStack, OutOfBounds, UnexpectedEndOfData ]*
|
||||
pushLambdaHelper: Context, List U8, U64 -> Task [ T Context (List U8) ] InterpreterErrors
|
||||
pushLambdaHelper = \ctx, base, depth ->
|
||||
result <- Task.attempt (Context.getChar ctx)
|
||||
when result is
|
||||
|
@ -398,11 +400,11 @@ pushLambdaHelper = \ctx, base, depth ->
|
|||
Err EndOfData ->
|
||||
Task.fail UnexpectedEndOfData
|
||||
|
||||
pushNumber: Context -> Task Context [ BadUtf8, DivByZero, EmptyStack, InvalidBooleanValue, InvalidChar Str, NoLambdaOnStack, NoNumberOnStack Context.Data, NoVariableOnStack, OutOfBounds, UnexpectedEndOfData ]*
|
||||
pushNumber: Context -> Task Context InterpreterErrors
|
||||
pushNumber = \ctx ->
|
||||
pushNumberHelper ctx 0
|
||||
|
||||
pushNumberHelper: Context, I64 -> Task Context [ BadUtf8, DivByZero, EmptyStack, InvalidBooleanValue, InvalidChar Str, NoLambdaOnStack, NoNumberOnStack Context.Data, NoVariableOnStack, OutOfBounds, UnexpectedEndOfData ]*
|
||||
pushNumberHelper: Context, I64 -> Task Context InterpreterErrors
|
||||
pushNumberHelper = \ctx, accum ->
|
||||
result <- Task.attempt (Context.getChar ctx)
|
||||
when result is
|
||||
|
@ -420,7 +422,7 @@ pushNumberHelper = \ctx, accum ->
|
|||
|
||||
# It seems that I need to specify all error types in every function for some reason.
|
||||
# I feel like this should just need to say UnexpectedEndOfData.
|
||||
printString : Context -> Task Context [ BadUtf8, DivByZero, EmptyStack, InvalidBooleanValue, InvalidChar Str, NoLambdaOnStack, NoNumberOnStack Context.Data, NoVariableOnStack, OutOfBounds, UnexpectedEndOfData ]*
|
||||
printString : Context -> Task Context InterpreterErrors
|
||||
printString = \ctx ->
|
||||
(T afterStringCtx bytes) <- Task.await (printStringHelper ctx [])
|
||||
when Str.fromUtf8 bytes is
|
||||
|
@ -430,7 +432,7 @@ printString = \ctx ->
|
|||
Err _ ->
|
||||
Task.fail BadUtf8
|
||||
|
||||
printStringHelper : Context, List U8 -> Task [ T Context (List U8) ] [ BadUtf8, DivByZero, EmptyStack, InvalidBooleanValue, InvalidChar Str, NoLambdaOnStack, NoNumberOnStack Context.Data, NoVariableOnStack, OutOfBounds, UnexpectedEndOfData ]*
|
||||
printStringHelper : Context, List U8 -> Task [ T Context (List U8) ] InterpreterErrors
|
||||
printStringHelper = \ctx, base ->
|
||||
result <- Task.attempt (Context.getChar ctx)
|
||||
when result is
|
||||
|
@ -442,7 +444,7 @@ printStringHelper = \ctx, base ->
|
|||
Err EndOfData ->
|
||||
Task.fail UnexpectedEndOfData
|
||||
|
||||
consumeComment : Context -> Task Context [ BadUtf8, DivByZero, EmptyStack, InvalidBooleanValue, InvalidChar Str, NoLambdaOnStack, NoNumberOnStack Context.Data, NoVariableOnStack, OutOfBounds, UnexpectedEndOfData ]*
|
||||
consumeComment : Context -> Task Context InterpreterErrors
|
||||
consumeComment = \ctx ->
|
||||
result <- Task.attempt (Context.getChar ctx)
|
||||
when result is
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue