diff options
Diffstat (limited to 'neb')
| -rw-r--r-- | neb/__init__.py | 5 | ||||
| -rw-r--r-- | neb/std/core.py | 13 | ||||
| -rw-r--r-- | neb/structs.py | 4 | 
3 files changed, 14 insertions, 8 deletions
| diff --git a/neb/__init__.py b/neb/__init__.py index f5574d1..4ae32a6 100644 --- a/neb/__init__.py +++ b/neb/__init__.py @@ -47,13 +47,14 @@ class Function:          self.args = args          self.many = many          self.type_ = TypeEnum.ANY  # TODO no it's not +        self.return_type = Type(":any")      def describe(self, name=None):          if name is None:              name = self.name          out = [f"({name}"]          out.append(string_args(self.args, self.many)) -        return " ".join(out).strip() + ")" +        return " ".join(out).strip() + f") {self.return_type}"      def arity_check(self, symbol, params):          min_arity = len([a for a in self.args if not a.optional]) @@ -115,7 +116,7 @@ class UserFunction(Function):          super().__init__(name, newparams, body, args, many)      def __str__(self): -        out = f"(func {self.name} (" +        out = f"(func {self.name} {self.return_type} ("          args_list = [f"{a.name} {a.type_}" for a in self.args]          if self.many:              args_list.append(f"{self.many.name} {self.many.type_}") diff --git a/neb/std/core.py b/neb/std/core.py index 83b164c..d9f512e 100644 --- a/neb/std/core.py +++ b/neb/std/core.py @@ -45,10 +45,17 @@ def interpretRedef(symbol, args, env, ns):  CORE.register("redef", Builtin("redef", interpretRedef, [def_name_arg, def_val_arg]))  def interpretLambda(symbol, args, env, ns): -    if len(args[0].args) != 0: -        func = UserFunction("<lambda>", args[0].args, args[1:]) +    new_args = args +    return_type = Type(":any") +    if isinstance(args[0], Type): +        return_type = args[0] +        new_args = args[1:] + +    if len(new_args[0].args) != 0: +        func = UserFunction("<lambda>", new_args[0].args, new_args[1:])      else: -        func = UserFunction("<lambda>", [], args[1:]) +        func = UserFunction("<lambda>", [], new_args[1:]) +    func.return_type = return_type      return func  lambda_args_arg = Arg("args", TypeEnum.ANY, lazy=True) diff --git a/neb/structs.py b/neb/structs.py index fcfa430..f6bd3af 100644 --- a/neb/structs.py +++ b/neb/structs.py @@ -126,9 +126,7 @@ class Arg:          self.lazy = lazy      def __str__(self): -        opt = "?" if self.optional else "" -        lazy = "~" if self.lazy else "" -        return f"{lazy}{opt}{self.name} {self.type_}" +        return f"{self.name} {self.type_}"  def string_args(args, many):      out = [f"{arg}" for arg in args] | 
