Add hole expressions
This commit is contained in:
parent
31fd8fe24f
commit
7cdd2de6e4
@ -1843,6 +1843,8 @@ infer_expr(_Env, Body={contract_pubkey, As, _}) ->
|
|||||||
{typed, As, Body, Con};
|
{typed, As, Body, Con};
|
||||||
infer_expr(_Env, Body={id, As, "_"}) ->
|
infer_expr(_Env, Body={id, As, "_"}) ->
|
||||||
{typed, As, Body, fresh_uvar(As)};
|
{typed, As, Body, fresh_uvar(As)};
|
||||||
|
infer_expr(_Env, Body={id, As, "???"}) ->
|
||||||
|
{typed, As, Body, {id, As, "hole"}};
|
||||||
infer_expr(Env, Id = {Tag, As, _}) when Tag == id; Tag == qid ->
|
infer_expr(Env, Id = {Tag, As, _}) when Tag == id; Tag == qid ->
|
||||||
{QName, Type} = lookup_name(Env, As, Id),
|
{QName, Type} = lookup_name(Env, As, Id),
|
||||||
{typed, As, QName, Type};
|
{typed, As, QName, Type};
|
||||||
@ -2939,6 +2941,12 @@ unify1(_Env, _A, {id, _, "void"}, Variance, _When)
|
|||||||
unify1(_Env, {id, _, "void"}, _B, Variance, _When)
|
unify1(_Env, {id, _, "void"}, _B, Variance, _When)
|
||||||
when Variance == contravariant orelse Variance == bivariant ->
|
when Variance == contravariant orelse Variance == bivariant ->
|
||||||
true;
|
true;
|
||||||
|
unify1(_Env, {id, Ann, "hole"}, B, _Variance, _When) ->
|
||||||
|
type_error({hole_found, Ann, B}),
|
||||||
|
true;
|
||||||
|
unify1(_Env, A, {id, Ann, "hole"}, _Variance, _When) ->
|
||||||
|
type_error({hole_found, Ann, A}),
|
||||||
|
true;
|
||||||
unify1(_Env, {id, _, Name}, {id, _, Name}, _Variance, _When) ->
|
unify1(_Env, {id, _, Name}, {id, _, Name}, _Variance, _When) ->
|
||||||
true;
|
true;
|
||||||
unify1(Env, A = {con, _, NameA}, B = {con, _, NameB}, Variance, When) ->
|
unify1(Env, A = {con, _, NameA}, B = {con, _, NameB}, Variance, When) ->
|
||||||
@ -3396,6 +3404,9 @@ mk_error({cannot_unify, A, B, Cxt, When}) ->
|
|||||||
[pp(instantiate(A)), pp(instantiate(B))]),
|
[pp(instantiate(A)), pp(instantiate(B))]),
|
||||||
{Pos, Ctxt} = pp_when(When),
|
{Pos, Ctxt} = pp_when(When),
|
||||||
mk_t_err(Pos, Msg, Ctxt);
|
mk_t_err(Pos, Msg, Ctxt);
|
||||||
|
mk_error({hole_found, Ann, Type}) ->
|
||||||
|
Msg = io_lib:format("Found a hole of type `~s`", [pp(instantiate(Type))]),
|
||||||
|
mk_t_err(pos(Ann), Msg);
|
||||||
mk_error({unbound_variable, Id}) ->
|
mk_error({unbound_variable, Id}) ->
|
||||||
Msg = io_lib:format("Unbound variable `~s`", [pp(Id)]),
|
Msg = io_lib:format("Unbound variable `~s`", [pp(Id)]),
|
||||||
case Id of
|
case Id of
|
||||||
|
@ -359,9 +359,12 @@ exprAtom() ->
|
|||||||
, ?RULE(tok('['), Expr, binop('..'), Expr, tok(']'), _3(_2, _4))
|
, ?RULE(tok('['), Expr, binop('..'), Expr, tok(']'), _3(_2, _4))
|
||||||
, ?RULE(keyword('('), comma_sep(Expr), tok(')'), tuple_e(_1, _2))
|
, ?RULE(keyword('('), comma_sep(Expr), tok(')'), tuple_e(_1, _2))
|
||||||
, letpat()
|
, letpat()
|
||||||
|
, hole()
|
||||||
])
|
])
|
||||||
end).
|
end).
|
||||||
|
|
||||||
|
hole() -> ?RULE(token('???'), {id, get_ann(_1), "???"}).
|
||||||
|
|
||||||
comprehension_exp() ->
|
comprehension_exp() ->
|
||||||
?LAZY_P(choice(
|
?LAZY_P(choice(
|
||||||
[ comprehension_bind()
|
[ comprehension_bind()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user