]> Nishi Git Mirror - gwion.git/commitdiff
:allow curry
authorJérémie Astor <fennecdjay@gmail.com>
Mon, 26 Jul 2021 10:23:48 +0000 (12:23 +0200)
committerJérémie Astor <fennecdjay@gmail.com>
Mon, 26 Jul 2021 10:23:48 +0000 (12:23 +0200)
ast
src/lib/lib_func.c
src/lib/opfunc.c
src/parse/check.c

diff --git a/ast b/ast
index 440d41a1a4ecc73788ffb74ef0558ce99fda6c6f..45c938d4ea5b0c768e1ea9eae671f9c49eaacc08 160000 (submodule)
--- a/ast
+++ b/ast
@@ -1 +1 @@
-Subproject commit 440d41a1a4ecc73788ffb74ef0558ce99fda6c6f
+Subproject commit 45c938d4ea5b0c768e1ea9eae671f9c49eaacc08
index bf7c633227d912296813abc0bb5927500d37d465..ba782e4b2c9268b5d0d4d6e74f29bf05e24745f6 100644 (file)
@@ -16,6 +16,7 @@
 static OP_CHECK(opck_func_call) {
   Exp_Binary *bin  = (Exp_Binary *)data;
   Exp_Call    call = {.func = bin->rhs, .args = bin->lhs};
+  call.allow_curry = true;
   Exp         e    = exp_self(bin);
   e->exp_type      = ae_exp_call;
   memcpy(&e->d.exp_call, &call, sizeof(Exp_Call));
index cd3ee0d072f2dcbdb40f9fa9c640791a20ecf395..79b6c0919a0c073ae162fc82f695cffb72d3c80a 100644 (file)
@@ -99,6 +99,12 @@ ANN Type check_td(const Env env, Type_Decl *td);
 OP_CHECK(opck_new) {
   Exp_Unary *unary = (Exp_Unary *)data;
   DECL_ON(const Type, t, = known_type(env, unary->ctor.td));
+  if (type_ref(t))
+    ERR_N(unary->ctor.td->pos, _("can't use 'new' on ref type '%s'\n"), t->name);
+  if (tflag(t, tflag_infer))
+    ERR_N(unary->ctor.td->pos, _("can't use 'new' on '%s'\n"),
+          t->name);
+  if (unary->ctor.td->array) CHECK_BN(check_subscripts(env, unary->ctor.td->array, 1));
   if(unary->ctor.exp) {
     const Exp self   = exp_self(unary);
     const Exp args   = cpy_exp(env->gwion->mp, unary->ctor.exp);
@@ -108,19 +114,17 @@ base->type = t;
     self->d.exp_call.func = func;
     self->d.exp_call.args = args;
     self->d.exp_call.tmpl = NULL;
+    self->d.exp_call.allow_curry = 0;
     self->exp_type = ae_exp_call;
     CHECK_BN(traverse_exp(env, self));
     return self->type;
 //    unarytype
   }
-  if (isa(t, env->gwion->type[et_object]) < 0)
-    ERR_N(exp_self(unary)->pos, _("can't use 'new' on non-object types...\n"));
-  if (type_ref(t))
-    ERR_N(unary->ctor.td->pos, _("can't use 'new' on ref type '%s'\n"), t->name);
   if (GET_FLAG(t, abstract))
     ERR_N(unary->ctor.td->pos, _("can't use 'new' on abstract type '%s'\n"),
           t->name);
-  if (unary->ctor.td->array) CHECK_BN(check_subscripts(env, unary->ctor.td->array, 1));
+  if (isa(t, env->gwion->type[et_object]) < 0)
+    ERR_N(exp_self(unary)->pos, _("can't use 'new' on non-object types...\n"));
   return t;
 }
 
index 1ee979c552814ad267c4e8019b8f2bffefb6f11b..c8f294200bcb28ddc6e5036d1c38334fe812f1be 100644 (file)
@@ -908,7 +908,7 @@ ANN2(1) static inline bool curried(const Env env, Exp exp) {
 }
 
 ANN static Type check_exp_call(const Env env, Exp_Call *exp) {
-  if (curried(env, exp->args))
+  if (exp->allow_curry && curried(env, exp->args))
     return env->gwion->type[et_curry];
   if (exp->tmpl) {
     DECL_BO(const m_bool, ret, = func_check(env, exp));