This repository contains a simple extension of Pharo's BlockClosure
with basic operations of Boolean algebra. It allows us to decompose complex logical queries into meaningful parts that can be reused.
To install BlockClosureLogicalOperations
, go to the Playground (Ctrl+OW) in your Pharo image and execute the following Metacello script (select it and press Do-it button or Ctrl+D):
Metacello new
baseline: 'BlockClosureLogicalOperations';
repository: 'github://olekscode/BlockClosureLogicalOperations/src';
load.
If you want to add a dependency on BlockClosureLogicalOperations
to your project, include the following lines into your baseline method:
spec
baseline: 'BlockClosureLogicalOperations'
with: [ spec repository: 'github://olekscode/BlockClosureLogicalOperations/src' ].
If you are new to baselines and Metacello, check out the Baselines tutorial on Pharo Wiki.
Let's define several logical blocks closures:
isPositive := [ :x | x > 0 ].
isOdd := [ :x | x % 2 = 1 ].
isTestClass := [ :aClass | aClass inheritsFrom: TestCase ].
isEmptyClass := [ :aClass | aClass methods isEmpty ].
They evaluate to Boolean values:
isOdd value: 2. "false"
isTestClass value: ConditionTest. "true"
We can manipulate and combine those blocks using all basic operations of boolean algebra: AND, OR, NOT, XOR, IMPLIES, and EQUALS:
isPositiveOrOdd := isPositive or: isOdd.
isEmptyTestClass := isTestClass and: isEmptyClass.
alwaysTrue := (isOdd not or: isPositive) logicalEquals: (isOdd implies: isPositive).
Any combination of logical block closures is also a logical block closure:
isEmptyTestClass value: ConditionTest. "false"
isPositiveOrOdd value: -1. "true".
alwaysTrue value: (Random new next). "true"