Differences between SETL implementations
From the SETL Wiki
There are some subtle differences between the various implementations of SETL, that are likely to confuse a programmer attempting to port code from one implementation to another. This page is an incomplete list of such differences. If you discover more please add them!
Implementation-specific features (e.g. language extensions, extra built-in functions) are covered elsewhere.
Contents |
Syntactic differences
Starting with the obvious ones...
Strings
In CIMS SETL and SETL-S, string literals are enclosed in single quotes, e.g. 'Hello, World'.
In SETL2, string literals are enclosed in double quotes, e.g. "Hello, World!".
In GNU SETL, both are valid.
Procedures
- In SETL-S all procedure must be forward-declared at the beginning of a program. All other implementations make 2 or more passes through the source code and scan for procedure names on the first pass, thus they do not require these forward declarations.
- In CIMS SETL, SETL-S and GNU SETL, proc is a synonym for procedure. In SETL2, it isn't.
from and similar operators
CIMS SETL and SETL2 allow an assignment using the from, fromb or frome operator to be used in an expression context, e.g.
t := [1, 2, 3]; print(x fromb t); print(x); print(t);
outputs:
1 1 [2 3]
SETL-S and GNU SETL do not permit this syntax.
Types
Sets
It is not normally possible to construct a set that has om as an element. For example "{om}" and "{} with om" both evaluate to the empty set. However in SETL2 the range operator can return a set containing om, if given a map containing a one-element tuple, e.g. "range({[1], [2, 3]})" yields {om, 3}.
Primitives
Overloading of primitives
- SETL2 permits the argument of arb to be a tuple. None of the other implementations permit anything other than a set.
Redefinition of primitives
In SETL2, most of SETL's unary operators are demoted to (predefined) procedures. These include all of the standard math functions, e.g. sin, abs, even etc. The built-in definitions can be overridden by the programmer defining a procedure of the same name. Exceptions are pow, not, arb, domain and range, which are still unary operators in SETL2.
Run-time behavioural differences
There are some slight differences in the implementations of some of the set primitives, regarding their behaviour when given om as an argument:
| Operator / function | Expression | Results | Alternative | ||
|---|---|---|---|---|---|
| SETL-S | SETL2 | GNU SETL | |||
| {} (set former) | {om} | error | {} | {} | {e: e in [x]} |
| with | s with om | error | s | s | s with/ [x] |
| less | s less om | s | s | error | s less/ [x] |
| in | om in [1, om, 2] | error | true | true | (exists i in [1 .. #t] | t(i) = x) |
| om in {} | error | false | false | x /= om and x in s | |
The "alternative" column above gives an expression which may be used instead if it is unknown whether x is om or not.

