Comments (16)
So, we need a special treatement when dealing with logical operators. Agree?
from ruler.
Is it considered as a bug?
from ruler.
The common way when we use the "and" operator as php does is to not evaluate the seconds condition. By allow it, we need to change our code regarding what we should do with PHP.
Example:
if (isset($value) && checkSomething($value)) ? echo 'true' : echo 'false';
In this example, until $value is false checkSomething() will never be interpreted!
For someone this could be considered as a bug or an improvement.
from ruler.
Who want to address this issue? /cc @hoaproject/hoackers
Design and algorithm
We are speaking about introducing lazy evaluation in operators.
Reminder: functions and operators are strictly the same. An operator is just a function with 2 arguments.
The algorithm is the following:
- we evaluate arguments one after the other,
- if one is evaluated as
X
then weY
the evaluation,
where X
can be anything and Y
can be break
or continue
.
How to solve?
This can be done in 2 steps:
- inside
Hoa\Ruler\Model\Operator
, we can add a lazy evaluation flag (on or off) and a lazy evaluation condition (X
andY
); flag would be turned off by default, on if the operator isand
oror
, - inside
Hoa\Ruler\Visitor\Asserter
, in thevisitOperator
method, the received$element
is of kindHoa\Ruler\Model\Operator
, so regarding the lazy evaluation flag and condition, we can visit arguments and apply the above algorithm.
Thoughts?
from ruler.
This is a good improvement indeed.
from ruler.
👍 I think this is a good improvement... To me, this is not really a bug just a missing feature.
BTW, reading your comments, it seems you only talk about the and
operator but this should also apply to the logical or
: http://3v4l.org/FPMFp
-- EDIT --
My bad, I just saw the or
mentioned in @Hywan's last comment:
flag would be turned off by default, on if the operator is and or or,
from ruler.
@jubianchi 👍
@Hywan 👍
from ruler.
@Hywan 👍 and yes should not be tagged as a bug, it's a design consideration (not even sur if it's a feature, should be benchmarked agains more or less complex expressions and if the lazy version wins all time this is not even an option that you can switch on or off).
from ruler.
Any volunteers for a PR :-)?
from ruler.
Let's go, I will try it!
from ruler.
@vonglasow w00t! Excellent initiative 👍.
from ruler.
technically speaking, i think this is called boolean short circuit evaluation. Here is a stackoverflow question on this topic http://stackoverflow.com/q/1232603/80353 I think this will be a good feature especially for use cases with 1000s of rules that require assertions.
I think the lazy evaluation or short circuit evaluation should be turned on by default just like most modern languages.
from ruler.
@simkimsia It will be enabled by default ;-). Thanks for the link!
from ruler.
👍 Woot Woot!
from ruler.
I think is done ;)
from ruler.
@vonglasow Thanks for the clean up ;-).
from ruler.
Related Issues (20)
- Precedence of logical operators HOT 4
- How could I combine different existing rules? HOT 1
- How can I check that array contain sub array? HOT 6
- Maybe an issue in `identifier` definition ? HOT 2
- Access to an array returned by a method property HOT 4
- Still maintained? HOT 3
- Space or no-space in expressions HOT 10
- Interface for writing rules
- Invert operator HOT 2
- Matching values in an Array? HOT 2
- I want to get all variable appear in string rule. Example "q1 != 8 and q2 != 12", i need ["q1", "q2"] How ? HOT 3
- Removing existing operators HOT 2
- Wrong use of instanceof HOT 3
- Incorrect condition on disassembly HOT 3
- Match any in array? HOT 5
- Error "Failed to open stream hoa://Library/Ruler/Grammar.pp" wich seems related to case sensitivity HOT 8
- Is this project still actively maintained? HOT 4
- Why operator cast to lowercase ? HOT 4
- Produce results in response of rule evaluations HOT 5
- Matches operator does not match HOT 1
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from ruler.