1
1
mirror of https://github.com/kanaka/mal.git synced 2024-09-20 10:07:45 +03:00

Merge pull request #162 from dubek/erlang-fix-nested-equality

erlang: Fix nested list/vector/map equality
This commit is contained in:
Joel Martin 2016-02-01 11:05:38 -06:00
commit cbd961bde6
2 changed files with 28 additions and 5 deletions

View File

@ -84,15 +84,36 @@ equal_q(Args) ->
[{string, S}, {string, T}] -> S == T;
[{keyword, K}, {keyword, J}] -> K == J;
[{symbol, S}, {symbol, T}] -> S == T;
[{list, L1, _M1}, {list, L2, _M2}] -> L1 == L2;
[{vector, L1, _M1}, {vector, L2, _M2}] -> L1 == L2;
[{list, L1, _M1}, {vector, L2, _M2}] -> L1 == L2;
[{vector, L1, _M1}, {list, L2, _M2}] -> L1 == L2;
[{map, M1, _M1}, {map, M2, _M2}] -> M1 == M2;
[{list, L1, _M1}, {list, L2, _M2}] -> equal_seqs(L1, L2);
[{vector, L1, _M1}, {vector, L2, _M2}] -> equal_seqs(L1, L2);
[{list, L1, _M1}, {vector, L2, _M2}] -> equal_seqs(L1, L2);
[{vector, L1, _M1}, {list, L2, _M2}] -> equal_seqs(L1, L2);
[{map, M1, _M1}, {map, M2, _M2}] -> equal_maps(M1, M2);
[_A, _B] -> false;
_ -> {error, "equal? expects two arguments"}
end.
equal_seqs([], []) ->
true;
equal_seqs([X|Xs], [Y|Ys]) ->
equal_q([X, Y]) andalso equal_seqs(Xs, Ys);
equal_seqs(_, _) ->
false.
equal_maps(M1, M2) ->
maps:size(M1) == maps:size(M2) andalso equal_maps_for_keys(maps:keys(M1), M1, M2).
equal_maps_for_keys([], _M1, _M2) ->
true;
equal_maps_for_keys([K|Ks], M1, M2) ->
equal_values_for_key(K, M1, M2) andalso equal_maps_for_keys(Ks, M1, M2).
equal_values_for_key(K, M1, M2) ->
case [maps:find(K, M1), maps:find(K, M2)] of
[{ok, V1}, {ok, V2}] -> equal_q([V1, V2]);
_ -> false
end.
int_op(F, [A0,A1]) ->
case A0 of
{integer, I0} ->

View File

@ -317,6 +317,8 @@
;=>false
(= {:a 11 :b 22} (hash-map :a 11))
;=>false
(= {:a [11 22]} {:a (list 11 22)})
;=>true
(= {:a 11 :b 22} (list :a 11 :b 22))
;=>false
(= {} [])