]> Nishi Git Mirror - gwion.git/commitdiff
:bug: Fix uncurry
authorJérémie Astor <fennecdjay@gmail.com>
Sun, 15 May 2022 18:28:10 +0000 (20:28 +0200)
committerJérémie Astor <fennecdjay@gmail.com>
Sun, 15 May 2022 18:28:10 +0000 (20:28 +0200)
src/lib/lib_func.c
src/parse/check.c
src/parse/partial.c

index c6992f6dca6d19870ffadc08909984f30f97da77..5d5cf21134232e806413439e29f2ff0f8b0ebfa6 100644 (file)
@@ -28,8 +28,8 @@ ANN static Exp uncurry(const Env env, const Exp_Binary *bin) {
       args->next = NULL;
       if(tmp) tmp = (tmp->next = cpy_exp(env->gwion->mp, args));
       else base = (tmp = cpy_exp(env->gwion->mp, args));
-        args->next = next;
-      } else {
+      args->next = next;
+    } else {
       if(!lhs) {
         free_exp(env->gwion->mp, base);
         return NULL;
@@ -62,8 +62,8 @@ static OP_CHECK(opck_func_call) {
   if(!strncmp(bin->rhs->type->name, "partial:", 8)) {
     const Stmt stmt = mp_vector_at(bin->rhs->type->info->func->def->d.code->d.stmt_code.stmt_list, struct Stmt_, 0);
     const Exp_Call *call = &stmt->d.stmt_exp.val->d.exp_call;
-    const Exp args = uncurry(env, bin);
-    if(args) return mk_call(env, exp_self(bin), call->func, args);
+    DECL_ON(const Exp, args, = uncurry(env, bin));
+    return mk_call(env, exp_self(bin), call->func, args);
   }
   return mk_call(env, exp_self(bin), bin->rhs, bin->lhs);
 }
index 978ba4c6add605735870718e3a1f7ef1be700431..2366510dc8a2ebf3933f9429d60a85d75d8a9635 100644 (file)
@@ -357,7 +357,7 @@ ANN static Type prim_id_non_res(const Env env, const Symbol *data) {
   const Value  v   = check_non_res_value(env, data);
   if (!v || !vflag(v, vflag_valid) || (v->from->ctx && v->from->ctx->error)) {
     const m_str name = s_name(*data);
-    if (!isalpha(*name) && *name != '_') { /* && *name != '@' ???*/
+    if (!isalpha(*name) && *name != '_') {
       prim_self(data)->value = env->gwion->type[et_op]->info->value;
       return env->gwion->type[et_op];
     }
index 9979a787ab13f0b1fc40e49bc7093c052c84eae6..039cbbf21ea11dc54889d2ac952619cf3c7f4532 100644 (file)
@@ -49,7 +49,11 @@ ANN static Exp partial_exp(const Env env, Exp e, const uint i) {
   if(is_hole(env, e) || is_typed_hole(env, e)) {
     char c[256];
     sprintf(c, "@%u", i);
-    return new_prim_id(env->gwion->mp, insert_symbol(c), e->pos);
+    const Exp exp = new_prim_id(env->gwion->mp, insert_symbol(c), e->pos);
+    exp->type = e->type;
+    exp->d.prim.value = new_value(env, e->type, c, e->pos);
+    valid_value(env, insert_symbol(c), exp->d.prim.value);
+    return exp;
   }
   const Exp next = e->next;
   e->next = NULL;
@@ -212,11 +216,13 @@ ANN Type partial_type(const Env env, Exp_Call *const call) {
     }
     ERR_O(call->func->pos, _("no match found for partial application"));
   }
+  nspc_push_value(env->gwion->mp, env->curr);
   Func_Base *const fbase = partial_base(env, f->def->base, call->args, call->func->pos);
   const Stmt code = partial_code(env, call->func, call->args);
   const Exp exp = exp_self(call);
   exp->d.exp_lambda.def = new_func_def(env->gwion->mp, fbase, code);
   exp->exp_type = ae_exp_lambda;
   CHECK_OO(traverse_func_def(env, exp->d.exp_lambda.def));
+  nspc_pop_value(env->gwion->mp, env->curr);
   return exp->d.exp_lambda.def->base->func->value_ref->type;
 }