diff --git a/cli.py b/cli.py index 5fa47a2..305a8a3 100755 --- a/cli.py +++ b/cli.py @@ -42,6 +42,8 @@ if len(sys.argv) == 1: # CLI loop res = main.get_rstring(main.run_command(commandstr), errorsonly=False) except goto: res = "Goto is not possible in CLI mode" + except RuntimeError as error: + res = error.args[0] if res != None: print(res) else: # File execution loop @@ -52,8 +54,10 @@ else: # File execution loop del sys.argv[1] if len(sys.argv[1]) == 1: sys.exit(1) + scriptfile = sys.argv[1] + del sys.argv[0] # Save file line-by-line into list - with open(sys.argv[1], mode="r") as f: + with open(scriptfile, mode="r") as f: lines = [] for line in f: if line[-1] == "\n": @@ -66,6 +70,9 @@ else: # File execution loop try: cmdres = main.get_rstring(main.run_command(lines[linenum]), errorsonly=True) linenum += 1 + except RuntimeError as error: + print(f"In line {linenum + 1}:", error.args[0]) + sys.exit(1) except goto as gotoinstr: if gotoinstr.define: markers[gotoinstr.marker] = linenum + 1 diff --git a/examples/gettest2.pil b/examples/gettest2.pil new file mode 100644 index 0000000..7c1bdad --- /dev/null +++ b/examples/gettest2.pil @@ -0,0 +1,34 @@ +#This file is part of pilang. +# +#pilang is free software: you can redistribute it and/or modify +#it under the terms of the GNU General Public License as published by +#the Free Software Foundation, either version 3 of the License, or +#(at your option) any later version. +# +#pilang is distributed in the hope that it will be useful, +#but WITHOUT ANY WARRANTY; without even the implied warranty of +#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +#GNU General Public License for more details. +# +#You should have received a copy of the GNU General Public License +#along with pilang. If not, see . + +catch True +# Get passed arguments as concenated string +set argslen,$len $getargv +set counter,1 +set userin, +marker set,concatloop + append userin,$get "$getargv,$~counter"," " + inc counter + cmp smaller,$~counter,$~argslen,"marker goto,concatloop" + +# Print character for character slowly +set charnum,0 +marker set,printloop + sleep 0.1 + printnnl $get "$~userin,$~charnum" + inc charnum + cmp bigger,$len $~userin,$~charnum,"marker goto,printloop" + +print diff --git a/intern.py b/intern.py index d240b17..56f9b70 100644 --- a/intern.py +++ b/intern.py @@ -62,8 +62,7 @@ class main_class: finally: if environment.catch and iserr: environment.catch = False - print("An exception was catched:", self.get_rstring(robj)) - sys.exit(1) + raise RuntimeError(self.get_rstring(robj)) def import_module(self, path): with open(path) as file: @@ -140,4 +139,5 @@ class main_class: else: pass # Run command + #print([command] + [args]) return module.processor(command, args) diff --git a/modules/builtin.py b/modules/builtin.py index a863d5d..d08ac39 100644 --- a/modules/builtin.py +++ b/modules/builtin.py @@ -27,11 +27,13 @@ class builtin: "len": self.cmd_len, "catch": self.cmd_catch, "exit": self.cmd_exit, + "getargv": self.cmd_getargv, "marker": self.cmd_marker, "printnnl": self.cmd_printnnl, "print": self.cmd_print, "input": self.cmd_input, "set": self.cmd_set, + "append": self.cmd_append, "inc": self.cmd_inc, "dec": self.cmd_dec, "del": self.cmd_del, @@ -83,6 +85,9 @@ class builtin: except IndexError: return errors.badarguments + def cmd_getargv(self, args): + return sys.argv + def cmd_marker(self, args): if len(args) != 2: return errors.badarguments @@ -117,6 +122,15 @@ class builtin: self.environ.variables[args[0]] = args[1] return rtypes.success + def cmd_append(self, args): + if len(args) < 2: + return errors.badarguments + if not str(args[0]) in self.environ.variables: + return errors.nosuchvariable + for arg in args[1:]: + self.environ.variables[str(args[0])] += str(arg) + return rtypes.success + def cmd_inc(self, args): if len(args) == 1: args.append(1) @@ -125,7 +139,7 @@ class builtin: try: self.environ.variables[args[0]] = str(float(self.environ.variables[args[0]]) + float(args[1])) except KeyError: - return errors.badarguments + return errors.nosuchvariable return rtypes.success def cmd_dec(self, args):