https://github.com/olekscode/blockclosurelogicaloperations
Extension of Pharo's BlockClosure with basic operations of Boolean algebra
https://github.com/olekscode/blockclosurelogicaloperations
Last synced: 9 months ago
JSON representation
Extension of Pharo's BlockClosure with basic operations of Boolean algebra
- Host: GitHub
- URL: https://github.com/olekscode/blockclosurelogicaloperations
- Owner: olekscode
- License: mit
- Created: 2020-04-17T22:28:47.000Z (over 5 years ago)
- Default Branch: master
- Last Pushed: 2020-04-18T00:18:00.000Z (over 5 years ago)
- Last Synced: 2025-02-11T11:41:43.451Z (11 months ago)
- Language: Smalltalk
- Homepage:
- Size: 29.3 KB
- Stars: 0
- Watchers: 3
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# Logical Operations on Block Closures
[](https://travis-ci.org/olekscode/BlockClosureLogicalOperations)
[](https://ci.appveyor.com/project/olekscode/blockclosurelogicaloperations)
[](https://coveralls.io/github/olekscode/BlockClosureLogicalOperations?branch=master)
[](https://raw.githubusercontent.com/olekscode/BlockClosureLogicalOperations/master/LICENSE)
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.
## How to install it?
To install `BlockClosureLogicalOperations`, go to the Playground (Ctrl+OW) in your [Pharo](https://pharo.org/) image and execute the following Metacello script (select it and press Do-it button or Ctrl+D):
```Smalltalk
Metacello new
baseline: 'BlockClosureLogicalOperations';
repository: 'github://olekscode/BlockClosureLogicalOperations/src';
load.
```
## How to depend on it?
If you want to add a dependency on `BlockClosureLogicalOperations` to your project, include the following lines into your baseline method:
```Smalltalk
spec
baseline: 'BlockClosureLogicalOperations'
with: [ spec repository: 'github://olekscode/BlockClosureLogicalOperations/src' ].
```
If you are new to baselines and Metacello, check out the [Baselines](https://github.com/pharo-open-documentation/pharo-wiki/blob/master/General/Baselines.md) tutorial on Pharo Wiki.
## How to use it?
Let's define several logical blocks closures:
```Smalltalk
isPositive := [ :x | x > 0 ].
isOdd := [ :x | x % 2 = 1 ].
isTestClass := [ :aClass | aClass inheritsFrom: TestCase ].
isEmptyClass := [ :aClass | aClass methods isEmpty ].
```
They evaluate to Boolean values:
```Smalltalk
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:
```Smalltalk
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:
```Smalltalk
isEmptyTestClass value: ConditionTest. "false"
isPositiveOrOdd value: -1. "true".
alwaysTrue value: (Random new next). "true"
```