}
}
+impl DomainError for FunctorStub {
+ fn domain_error(
+ self,
+ machine_st: &mut MachineState,
+ valid_type: DomainErrorType,
+ ) -> MachineError {
+ let stub = functor!(
+ atom!("domain_error"),
+ [atom(valid_type.as_atom()), str(machine_st.heap.len(), 0)],
+ [self]
+ );
+
+ MachineError {
+ stub,
+ location: None,
+ from: ErrorProvenance::Constructed,
+ }
+ }
+}
+
impl DomainError for Number {
fn domain_error(self, machine_st: &mut MachineState, error: DomainErrorType) -> MachineError {
let stub = functor!(
InvalidOpDeclSpecValue(Atom),
InvalidOpDeclPrecType(Term),
InvalidOpDeclPrecDomain(Fixnum),
+ ShallNotCreate(Atom),
+ ShallNotModify(Atom),
}
impl From<ArithmeticError> for CompilationError {
StreamOrAlias,
OperatorSpecifier,
OperatorPriority,
+ Declaration,
}
impl DomainErrorType {
DomainErrorType::StreamOrAlias => atom!("stream_or_alias"),
DomainErrorType::OperatorSpecifier => atom!("operator_specifier"),
DomainErrorType::OperatorPriority => atom!("operator_priority"),
+ DomainErrorType::Declaration => atom!("declaration"),
}
}
}
atom_as_cell!(atom!("todo_insert_invalid_term_here")),
),
DeclarationError::InvalidDecl(name, arity) => {
- self.existence_error(ExistenceError::Declaration(name, arity))
+ self.domain_error(DomainErrorType::Declaration, functor_stub(name, arity))
}
DeclarationError::InvalidOpDeclNameType(_term) => self.type_error(
ValidType::List,
DeclarationError::InvalidOpDeclPrecDomain(num) => {
self.domain_error(DomainErrorType::OperatorPriority, fixnum_as_cell!(num))
}
+ DeclarationError::ShallNotCreate(atom) => {
+ self.permission_error(Permission::Create, atom!("operator"), atom)
+ }
+ DeclarationError::ShallNotModify(atom) => {
+ self.permission_error(Permission::Modify, atom!("operator"), atom)
+ }
}
}
}
}
};
+ if name == "[]" || name == "{}" {
+ return Err(CompilationError::InvalidDecl(
+ DeclarationError::ShallNotCreate(name),
+ ));
+ }
+
+ if name == "," {
+ return Err(CompilationError::InvalidDecl(
+ DeclarationError::ShallNotModify(name),
+ ));
+ }
+
+ if name == "|" && (prec < 1001 || !spec.is_infix()) {
+ return Err(CompilationError::InvalidDecl(
+ DeclarationError::ShallNotCreate(name),
+ ));
+ }
+
Ok(to_op_decl(prec, spec, name))
}
--- /dev/null
+:- op(500, xfy, {}).
\ No newline at end of file
--- /dev/null
+:- op(500, xfy, [{}]).
\ No newline at end of file
--- /dev/null
+:- op(1000, xfy, '|').
\ No newline at end of file
--- /dev/null
+:- op(1150, fx, '|').
\ No newline at end of file
--- /dev/null
+:- op(500, yfx, ',').
\ No newline at end of file
```trycmd
$ scryer-prolog -f --no-add-history tests-pl/invalid_decl4.pl -g halt
- error(existence_error(declaration,op/4),load/1).
+ error(domain_error(declaration,op/4),load/1).
```
```trycmd
$ scryer-prolog -f --no-add-history tests-pl/invalid_decl5.pl -g halt
- error(existence_error(declaration,(;)/2),load/1).
+ error(domain_error(declaration,(;)/2),load/1).
```
> % Warning: singleton variables Var at line 0 of invalid_decl11.pl
> error(instantiation_error,load/1).
> ```
+
+```trycmd
+$ scryer-prolog -f --no-add-history tests-pl/invalid_decl12.pl -g halt
+ error(permission_error(create,operator,{}),load/1).
+
+```
+
+```trycmd
+$ scryer-prolog -f --no-add-history tests-pl/invalid_decl13.pl -g halt
+ error(permission_error(create,operator,{}),load/1).
+
+```
+
+```trycmd
+$ scryer-prolog -f --no-add-history tests-pl/invalid_decl14.pl -g halt
+ error(permission_error(create,operator,'|'),load/1).
+
+```
+
+```trycmd
+$ scryer-prolog -f --no-add-history tests-pl/invalid_decl15.pl -g halt
+ error(permission_error(create,operator,'|'),load/1).
+
+```
+
+```trycmd
+$ scryer-prolog -f --no-add-history tests-pl/invalid_decl16.pl -g halt
+ error(permission_error(modify,operator,','),load/1).
+
+```