This page focuses on simplicity—one of the key attributes of TOO that makes it viable for citizens.
Always remember, however, that there’s usually a simpler and better way to do something than the first way that pops into your head.
Donald Knuth Tweet
Compact languages like Python, C, and Go typically consist of around 90 syntax rules, 30 operators, and 30 keywords. In contrast, TOO is simplified to the bare minimum, aiming to be the world’s simplest practical general-purpose language (GPL), with just 12 syntax rules, 5 operators, and no keywords. This minimalism accelerates both learning and development. The table below provides a comparison.
Language | Keywords | Operators | Syntax rules | Year |
---|---|---|---|---|
Fortran | 39 | 16 | 170 | 1957 |
C | 32 | 27 | 90 | 1970 |
C++ | 90 | 35 | 200 | 1979 |
Python | 33 | 39 | 90 | 1991 |
Java | 51 | 34 | 250 | 1995 |
Ruby | 13 | 28 | 60 | 1995 |
C# | 78 | 41 | 220 | 2000 |
Go | 25 | 34 | 100 | 2009 |
Typescript | 50 | 35 | 150 | 2012 |
Rust | 35 | 45 | 250 | 2015 |
TOO | 0 | 5 | 12 | 2022 |
TOO syntax rules
A carefully designed language with just 12 syntax rules can be remarkably powerful. This minimal syntax emerges organically from a thoughtful approach to maintain simplicity and readability, rather than being the result of artificial condensation. In fact, one could easily reduce this syntax to just 8 rules without compromising functionality.
thing ::= Id “{” (declare|event|when|func)* “}”
event ::= Id params
when ::= source+ Id params “{” action* “}”
func ::= Id params “→” params [“{” action* “}”]
action ::= [“*”] expr [“?” “{” action* “}” [“{” action* “}”]]
source ::= Id [“[” declare “]”])
arg ::= expr|“*”
expr ::= sub+
sub ::= (Id|Const|call) [“[” arg “]”] [“→” (declare|params)]
call ::= Id “(” [(arg “,”)* arg] “)”
params ::= “(” [(declare “,”)* (declare [“…”])] “)”
declare ::= [“[]”] [Id “:”] (Id “.”)* Id [“=” Const] [Const]
TOO 5 operators
It is assumed that citizens are familiar with spreadsheets and this reassures the use of functions (e.g., AND(x,y), IF(x,y,z)) together with fluent style chaining that is natural for citizens, refraining completely from infix binary operators that might be difficult to remember (e.g., “<<=”), solving precedence of operations and simplifying readability.
The redirect operator implements a right-hand side assignment, which is uncommon in programming (most languages use left-hand side assignment). While this form of assignment might seem unusual to experienced programmers, it can be more intuitive for citizen developers without prior knowledge of programming. This is because the right-hand side assignment aligns more naturally with the structure of spoken language, where the subject is often introduced at the end of a sentence. This design choice could therefore feel more familiar and accessible for non-programmers.
→ Redirect
[ ] Subscript
? Decision point
* Wildcard and iteration
= Initial value for thing in declaration
The following is the full specification of the TOO language.
Expert systems especially, and rule-based systems in general, present a simplified approach to flow control that is human-friendly and easy to master. In such systems, the logic is structured in rules with a trigger and a list of sequential actions.
While most GPLs advocate loops that considerably increase citizen incomprehension, TOO provides many ways to create an iterative logic but it is loop-free. The algorithms in TOO may only contain downstream branching. This means that rule actions (or function actions) are executed in a sequential order and there is no way to go back and re-execute an action that was already executed. This is illustrated in the flowchart below.
TOO flowcharts feature only downstream branching. Action details are shown on hover.
Editing a TOO program requires only a mouse:
(a) The data structure is created by point and click – moving instances from the INVENTORY to the MEMBERS section.
(b) The flowchart skeleton is created by dragging and dropping a box over an edge, and there are only two types of boxes to choose from: rectangle and diamond.
(c) Editing a flowchart box only requires selection from a dropdown menu with fairly limited alternatives and only at specific points where the expression can grow or shrink. In the example below, there are two edit points marked by the blue “+” symbols.
Editing a flowchart box is limited to specific points.
Example 1: Redirect Operator (→)
radius squared times math π → area times height → cylinder
Explanation:
The redirect operator (→) is used to assign the byproduct(s) of a sub-expression to a temporary variable(s). These temporary variables can be used later in the code, allowing for clear and concise expressions. This unique type of assignment on the right-hand side combined with the fluent-style chaining makes expressions more readable, close to a spoken language: “radius squared times pi goes to area, times height goes to cylinder”.
Example 2: Spawning lightweight threads
go run(fixtures, schedule[*], *)
Explanation:
The star operator (*) acts as a wildcard, effectively creating a loop that iterates over the array elements. The “go run” function spawns a lightweight thread for each element in the array, with each thread handling one schedule. See also the homepage demo video where this expression is illustrated.
Example 3: Loop within a loop
* fixtures control(schedule split(“,”)[*], name)
Explanation:
Effectively, in this single action we have a loop within a loop.
Simplicity is the ultimate sophistication. It takes a lot of hard work to make something simple, to truly understand the underlying challenges and come up with elegant solutions. [...] It's not just minimalism or the absence of clutter. It involves digging through the depth of complexity. To be truly simple, you have to go really deep. [...] You have to deeply understand the essence of a product in order to be able to get rid of the parts that are not essential.
Steve Jobs Tweet
.