diff --git a/joy/joy.py b/joy/joy.py index dfa4572..2870f51 100644 --- a/joy/joy.py +++ b/joy/joy.py @@ -27,7 +27,11 @@ from builtins import input from traceback import print_exc from .parser import text_to_expression, ParseError, Symbol from .utils.stack import stack_to_string -from .library import NotAnIntError, StackUnderflowError +from .utils.errors import ( + NotAListError, + NotAnIntError, + StackUnderflowError, + ) class UnknownSymbolError(KeyError): pass @@ -136,6 +140,8 @@ def interp(stack=(), dictionary=None): print('Not enough values on stack.') except NotAnIntError: print('Not an integer.') + except NotAListError: + print('Not a list.') except: print_exc() print(stack_to_string(stack)) diff --git a/joy/library.py b/joy/library.py index 123de6e..72516a0 100644 --- a/joy/library.py +++ b/joy/library.py @@ -30,6 +30,7 @@ import operator, math from .parser import text_to_expression, Symbol from .utils import generated_library as genlib +from .utils.errors import NotAnIntError, StackUnderflowError from .utils.stack import ( concat, expression_to_string, @@ -189,10 +190,6 @@ while == swap [nullary] cons dup dipd concat loop ) -class NotAnIntError(Exception): pass -class StackUnderflowError(Exception): pass - - def FunctionWrapper(f): '''Set name attribute.''' if not f.__doc__: @@ -223,7 +220,11 @@ def BinaryBuiltinWrapper(f): (a, (b, stack)) = stack except ValueError: raise StackUnderflowError - if not isinstance(a, int) or not isinstance(b, int): + if (not isinstance(a, int) + or not isinstance(b, int) + or isinstance(a, bool) # Because bools are ints in Python. + or isinstance(a, bool) + ): raise NotAnIntError result = f(b, a) return (result, stack), expression, dictionary diff --git a/joy/utils/errors.py b/joy/utils/errors.py new file mode 100644 index 0000000..4834ad3 --- /dev/null +++ b/joy/utils/errors.py @@ -0,0 +1,5 @@ +class NotAListError(Exception): pass +class NotAnIntError(Exception): pass +class StackUnderflowError(Exception): pass + +