]> Repositorios git - scryer-prolog.git/commitdiff
copy attribute list in get_atts
authorMark Thom <[email protected]>
Sun, 3 Feb 2019 23:10:12 +0000 (16:10 -0700)
committerMark Thom <[email protected]>
Sun, 3 Feb 2019 23:10:12 +0000 (16:10 -0700)
src/prolog/lib/atts.pl
src/prolog/machine/machine_state_impl.rs
src/tests.rs

index 036b23185ff7304ca70f9b9fe488fa632d4b355d..b2d845d42af74d170bc14ecb22fe16011e2d78ff 100644 (file)
@@ -1,6 +1,7 @@
-:- module(atts, [attribute/1, '$absent_attr'/2, '$get_attr'/2, '$put_attr'/2,
-                '$absent_from_list'/2, '$get_from_list'/2, '$add_to_list'/2,
-                '$del_attr'/3, '$del_attr_step'/2, '$del_attr_buried'/3]).
+:- module(atts, [attribute/1, '$absent_attr'/2, '$copy_attr_list'/2,
+                '$get_attr'/2, '$put_attr'/2, '$absent_from_list'/2,
+                '$get_from_list'/2, '$add_to_list'/2, '$del_attr'/3,
+                '$del_attr_step'/2, '$del_attr_buried'/3]).
 
 :- use_module(library(control)).
 :- use_module(library(dcgs)).
     ).
 '$del_attr_buried'(_, _, _).
 
+'$copy_attr_list'(L, []) :- var(L), !.
+'$copy_attr_list'([Att|Atts], [Att|CopiedAtts]) :-
+    '$copy_attr_list'(Atts, CopiedAtts).
+
 user:term_expansion(Term0, Terms) :-
     nonvar(Term0),
     Term0 = (:- attribute Atts),
@@ -75,13 +80,14 @@ put_attrs_var_check -->
      (put_atts(Var, Attr) :- var(Attr), throw(error(instantiation_error, put_atts/2)))].
 
 get_attrs_var_check -->
-    { numbervars([Var, Attr], 0, _) },
+    { numbervars([Var, Ls, Attr], 0, _) },
     [(get_atts(Var, Attr) :- nonvar(Var), throw(error(type_error(variable, Var), get_atts/2))),
-     (get_atts(Var, Attr) :- var(Attr), !, '$get_attr_list'(Var, Attr))].
+     (get_atts(Var, Attr) :- var(Attr), !, '$get_attr_list'(Var, Ls), nonvar(Ls),
+                            '$copy_attr_list'(Ls, Attr))].
 
 put_attrs(Name/Arity) -->
     put_attr(Name, Arity),
-    { numbervars([Var, Attr], 0, _) }, 
+    { numbervars([Var, Attr], 0, _) },
     [(put_atts(Var, Attr) :- lists:maplist(put_atts(Var), Attr))].
 put_attrs((Name/Arity, Atts)) -->
     { nonvar(Atts) },
index 6c1374bf58348700e16c6e77c4a6795424f8c397..a6a59f1f6381280a45cfed46112647569648cc3f 100644 (file)
@@ -97,8 +97,6 @@ impl MachineState {
         };
     }
 
-    // from the assumptions active at the call site in bind, we know:
-    //   if addr is a Ref, it precedes h in the heap.
     fn bind_attr_var(&mut self, h: usize, addr: Addr) {
         match addr.as_var() {
             Some(Ref::HeapCell(hc)) => {
index 646e8f9bff7ef4ed8cc9f9a9d6824bf0da5498ce..637192cbc074117656154e42264885fe8573bff7 100644 (file)
@@ -2147,33 +2147,33 @@ fn test_queries_on_attributed_variables()
 
     assert_prolog_success!(&mut wam, "?- ( put_atts(V, my_mod, dif(1)) ; put_atts(V, my_mod, dif(2)) ),
                                          get_atts(V, my_mod, L).",
-                           [["L = [dif(1) | _16]", "V = _12"],
-                            ["L = [dif(2) | _16]", "V = _12"]]);
+                           [["L = [dif(1)]", "V = _12"],
+                            ["L = [dif(2)]", "V = _12"]]);
 
     assert_prolog_success!(&mut wam, "?- put_atts(V, my_mod, frozen(a)),
                                       ( put_atts(V, my_mod, dif(1))
                                       ; put_atts(V, my_mod, -frozen(a)), put_atts(V, my_mod, dif(2))
                                       ; put_atts(V, my_mod, dif(different)) ),
                                       get_atts(V, my_mod, Ls).",
-                           [["Ls = [frozen(a), dif(1) | _36]", "V = _12"],
-                            ["Ls = [dif(2) | _50]", "V = _12"],
-                            ["Ls = [frozen(a), dif(different) | _36]", "V = _12"]]);
+                           [["Ls = [frozen(a), dif(1)]", "V = _12"],
+                            ["Ls = [dif(2)]", "V = _12"],
+                            ["Ls = [frozen(a), dif(different)]", "V = _12"]]);
 
     assert_prolog_success!(&mut wam, "?- put_atts(V, my_mod, [dif(1), dif(2), frozen(a)]),
                                       ( put_atts(V, my_mod, -dif(2)); put_atts(V, my_mod, -frozen(A)) ),
                                         get_atts(V, my_mod, L).",
-                           [["A = _69", "L = [dif(1), frozen(a) | _67]", "V = _27"],
-                            ["A = _69", "L = [dif(1), dif(2) | _67]", "V = _27"]]);
+                           [["A = _69", "L = [dif(1), frozen(a)]", "V = _27"],
+                            ["A = _69", "L = [dif(1), dif(2)]", "V = _27"]]);
     assert_prolog_success!(&mut wam, "?- put_atts(V, my_mod, [dif(1), dif(2), frozen(a)]),
                                       ( put_atts(V, my_mod, -dif(2)), V = f(a)
                                        ; put_atts(V, my_mod, -frozen(_)), get_atts(V, my_mod, L) ).",
                            [["L = _69", "V = f(a)"],
-                            ["L = [dif(1), dif(2) | _67]", "V = _27"]]);
+                            ["L = [dif(1), dif(2)]", "V = _27"]]);
     assert_prolog_success!(&mut wam, "?- put_atts(V, my_mod, [dif(1), dif(2), frozen(a), frozen(b)]),
                                       ( put_atts(V, my_mod, -dif(2)) ; put_atts(V, my_mod, -frozen(A)) ),
                                         get_atts(V, my_mod, L).",
-                           [["A = _97", "L = [dif(1), frozen(a), frozen(b) | _95]", "V = _31"],
-                            ["A = _97", "L = [dif(1), dif(2) | _95]", "V = _31"]]);
+                           [["A = _97", "L = [dif(1), frozen(a), frozen(b)]", "V = _31"],
+                            ["A = _97", "L = [dif(1), dif(2)]", "V = _31"]]);
     assert_prolog_failure!(&mut wam, "?- put_atts(V, my_mod, [dif(1), dif(2), frozen(a), frozen(b)]),
                                          get_atts(V, my_mod, -dif(1)).");
     assert_prolog_success!(&mut wam, "?- put_atts(V, my_mod, [dif(1), dif(2), frozen(a), frozen(b)]),
@@ -2184,8 +2184,8 @@ fn test_queries_on_attributed_variables()
                             ["X = 2", "V = _31"]]);
     assert_prolog_success!(&mut wam, "?- put_atts(V, my_mod, [dif(1), dif(2), frozen(a), frozen(b)]),
                                          put_atts(V, my_mod, -dif(A)), get_atts(V, my_mod, Ls).",
-                           [["A = _98", "Ls = [frozen(a), frozen(b) | _95]", "V = _31"]]);
+                           [["A = _98", "Ls = [frozen(a), frozen(b)]", "V = _31"]]);
     assert_prolog_success!(&mut wam, "?- put_atts(V, my_mod, [dif(1), frozen(a), dif(2), frozen(b)]),
                                          put_atts(V, my_mod, -dif(A)), get_atts(V, my_mod, Ls).",
-                           [["A = _98", "Ls = [frozen(a), frozen(b) | _95]", "V = _31"]]);
+                           [["A = _98", "Ls = [frozen(a), frozen(b)]", "V = _31"]]);
 }