forked from extern/nushell
Add logical xor
operator (#7242)
We already have the binary `bit-xor` and the shortcircuiting logical `or`(`||`) and `and`(`&&`). This introduces `xor` as a compact form for both brevity and clarity. You can express the operation through `not`/`and`/`or` with a slight risk of introducing bugs through typos. Operator precedence `and` > `xor` > `or` Added logic and precedence tests.
This commit is contained in:
committed by
GitHub
parent
3e76ed9122
commit
2ccb91dc6a
@ -2865,6 +2865,25 @@ impl Value {
|
||||
}
|
||||
}
|
||||
|
||||
pub fn xor(&self, op: Span, rhs: &Value, span: Span) -> Result<Value, ShellError> {
|
||||
match (self, rhs) {
|
||||
(Value::Bool { val: lhs, .. }, Value::Bool { val: rhs, .. }) => Ok(Value::Bool {
|
||||
val: (*lhs && !*rhs) || (!*lhs && *rhs),
|
||||
span,
|
||||
}),
|
||||
(Value::CustomValue { val: lhs, span }, rhs) => {
|
||||
lhs.operation(*span, Operator::Boolean(Boolean::Xor), op, rhs)
|
||||
}
|
||||
_ => Err(ShellError::OperatorMismatch {
|
||||
op_span: op,
|
||||
lhs_ty: self.get_type(),
|
||||
lhs_span: self.span()?,
|
||||
rhs_ty: rhs.get_type(),
|
||||
rhs_span: rhs.span()?,
|
||||
}),
|
||||
}
|
||||
}
|
||||
|
||||
pub fn pow(&self, op: Span, rhs: &Value, span: Span) -> Result<Value, ShellError> {
|
||||
match (self, rhs) {
|
||||
(Value::Int { val: lhs, .. }, Value::Int { val: rhs, .. }) => {
|
||||
|
Reference in New Issue
Block a user