match (self, key_type) {
(OptArgIndexKey::Constant(..), OptArgIndexKeyType::Constant)
| (OptArgIndexKey::Structure(..), OptArgIndexKeyType::Structure)
- // | (OptArgIndexKey::List(..), OptArgIndexKeyType::List)
+ // | (OptArgIndexKey::List(..), OptArgIndexKeyType::List)
=> true,
_ => false,
}
constants.insert(constant.clone(), constant_ptr);
}
_ => {
- unreachable!()
+ if let IndexingCodePtr::DynamicExternal(_) = constant_ptr {
+ // this must be a defunct clause, because it's been deleted
+ // from the skeleton.
+ } else {
+ unreachable!()
+ }
}
}
structures.insert((name.clone(), *arity), structure_ptr);
}
_ => {
- unreachable!()
+ if let IndexingCodePtr::DynamicExternal(_) = structure_ptr {
+ // this must be a defunct clause, because it's been deleted
+ // from the skeleton.
+ } else {
+ unreachable!()
+ }
}
}
; callable(Head), functor(Head, Name, Arity) ->
( '$head_is_dynamic'(Module, Head) ->
call_asserta(Head, Body, Name, Arity, Module)
+ ; '$no_such_predicate'(Module, Head) ->
+ call_asserta(Head, Body, Name, Arity, Module)
; throw(error(permission_error(modify, static_procedure, Name/Arity), asserta/1))
)
; throw(error(type_error(callable, Head), asserta/1))
; throw(error(type_error(callable, Head), asserta/1))
).
+:- meta_predicate asserta(0).
+
asserta(Clause) :-
( Clause \= (_ :- _) ->
Head = Clause,
; throw(error(type_error(callable, Head), assertz/1))
).
+:- meta_predicate assertz(0).
+
assertz(Clause) :-
( Clause \= (_ :- _) ->
Head = Clause,
; throw(error(type_error(callable, Head), retract/1))
).
+:- meta_predicate retract(0).
+
retract(Clause) :-
( Clause \= (_ :- _) ->
Head = Clause,
).
+:- meta_predicate retractall(0).
+
+retractall(Head) :-
+ retract((Head :- _)),
+ false.
+retractall(_).
+
+
module_abolish(Pred, Module) :-
( var(Pred) ->
throw(error(instantiation_error), abolish/1)
throw(error(domain_error(not_less_than_zero, Arity), abolish/1))
; max_arity(N), Arity > N ->
throw(error(representation_error(max_arity), abolish/1))
- ; callable(Head), functor(Head, Name, Arity) ->
+ ; functor(Head, Name, Arity) ->
( '$head_is_dynamic'(Module, Head) ->
'$abolish_clause'(Module, Name, Arity)
; throw(error(permission_error(modify, static_procedure, Pred), abolish/1))
; throw(error(type_error(predicate_indicator, Module:Pred), abolish/1))
).
+
+:- meta_predicate abolish(0).
+
abolish(Pred) :-
( var(Pred) ->
throw(error(instantiation_error), abolish/1)
throw(error(domain_error(not_less_than_zero, Arity), abolish/1))
; max_arity(N), Arity > N ->
throw(error(representation_error(max_arity), abolish/1))
- ; callable(Head), functor(Head, Name, Arity) ->
+ ; functor(Head, Name, Arity) ->
( '$head_is_dynamic'(user, Head) ->
'$abolish_clause'(user, Name, Arity)
; '$no_such_predicate'(user, Head) ->
true
; false
).
-
-retractall(Head) :-
- retract((Head :- _)),
- false.
-retractall(_).
'$add_discontiguous_predicate'(Module, Name, Arity, Evacuable).
compile_declaration(initialization(Goal), Evacuable) :-
prolog_load_context(module, Module),
- '$add_dynamic_predicate'(Module, '$initialization_goals', 1, Evacuable),
assertz(Module:'$initialization_goals'(Goal)).
compile_declaration(set_prolog_flag(Flag, Value), _) :-
set_prolog_flag(Flag, Value).