De Folders-taal

Waar mappen code zijn en schijfruimte oneindig is.

Voorbeeld: HelloWorld

HelloWorld
└── New Folder
├── New Folder
│   ├── New Folder
│   ├── New Folder (2)
│   ├── New Folder (3)
│   └── New Folder (4)
└── New Folder (2)
├── New Folder
│   ├── New Folder
│   ├── New Folder (2)
│   ├── New Folder (3)
│   ├── New Folder (4)
│   └── New Folder (5)
├── New Folder (2)
│   ├── New Folder
│   └── New Folder (2)
└── New Folder (3)
├── New Folder
│   ├── New Folder
│   │   ├── New Folder
│   │   ├── New Folder (2)
│   │   │   └── New Folder
│   │   ├── New Folder (3)
│   │   └── New Folder (4)
│   └── New Folder (2)
│       ├── New Folder
│       │   └── New Folder
│       ├── New Folder (2)
│       ├── New Folder (3)
│       └── New Folder (4)
├── New Folder (10)
│   ├── New Folder
│   │   ├── New Folder
│   │   ├── New Folder (2)
│   │   │   └── New Folder
│   │   ├── New Folder (3)
│   │   │   └── New Folder
│   │   └── New Folder (4)
│   │       └── New Folder
│   └── New Folder (2)
│       ├── New Folder
│       ├── New Folder (2)
│       ├── New Folder (3)
│       │   └── New Folder
│       └── New Folder (4)
├── New Folder (11)
│   ├── New Folder
│   │   ├── New Folder
│   │   ├── New Folder (2)
│   │   │   └── New Folder
│   │   ├── New Folder (3)
│   │   │   └── New Folder
│   │   └── New Folder (4)
│   └── New Folder (2)
│       ├── New Folder
│       │   └── New Folder
│       ├── New Folder (2)
│       │   └── New Folder
│       ├── New Folder (3)
│       └── New Folder (4)
├── New Folder (12)
│   ├── New Folder
│   │   ├── New Folder
│   │   ├── New Folder (2)
│   │   │   └── New Folder
│   │   ├── New Folder (3)
│   │   │   └── New Folder
│   │   └── New Folder (4)
│   └── New Folder (2)
│       ├── New Folder
│       ├── New Folder (2)
│       │   └── New Folder
│       ├── New Folder (3)
│       └── New Folder (4)
├── New Folder (13)
│   ├── New Folder
│   │   ├── New Folder
│   │   ├── New Folder (2)
│   │   ├── New Folder (3)
│   │   │   └── New Folder
│   │   └── New Folder (4)
│   └── New Folder (2)
│       ├── New Folder
│       ├── New Folder (2)
│       ├── New Folder (3)
│       └── New Folder (4)
│           └── New Folder
├── New Folder (2)
│   ├── New Folder
│   │   ├── New Folder
│   │   ├── New Folder (2)
│   │   │   └── New Folder
│   │   ├── New Folder (3)
│   │   │   └── New Folder
│   │   └── New Folder (4)
│   └── New Folder (2)
│       ├── New Folder
│       ├── New Folder (2)
│       │   └── New Folder
│       ├── New Folder (3)
│       └── New Folder (4)
│           └── New Folder
├── New Folder (3)
│   ├── New Folder
│   │   ├── New Folder
│   │   ├── New Folder (2)
│   │   │   └── New Folder
│   │   ├── New Folder (3)
│   │   │   └── New Folder
│   │   └── New Folder (4)
│   └── New Folder (2)
│       ├── New Folder
│       │   └── New Folder
│       ├── New Folder (2)
│       │   └── New Folder
│       ├── New Folder (3)
│       └── New Folder (4)
├── New Folder (4)
│   ├── New Folder
│   │   ├── New Folder
│   │   ├── New Folder (2)
│   │   │   └── New Folder
│   │   ├── New Folder (3)
│   │   │   └── New Folder
│   │   └── New Folder (4)
│   └── New Folder (2)
│       ├── New Folder
│       │   └── New Folder
│       ├── New Folder (2)
│       │   └── New Folder
│       ├── New Folder (3)
│       └── New Folder (4)
├── New Folder (5)
│   ├── New Folder
│   │   ├── New Folder
│   │   ├── New Folder (2)
│   │   │   └── New Folder
│   │   ├── New Folder (3)
│   │   │   └── New Folder
│   │   └── New Folder (4)
│   └── New Folder (2)
│       ├── New Folder
│       │   └── New Folder
│       ├── New Folder (2)
│       │   └── New Folder
│       ├── New Folder (3)
│       │   └── New Folder
│       └── New Folder (4)
│           └── New Folder
├── New Folder (6)
│   ├── New Folder
│   │   ├── New Folder
│   │   ├── New Folder (2)
│   │   ├── New Folder (3)
│   │   │   └── New Folder
│   │   └── New Folder (4)
│   └── New Folder (2)
│       ├── New Folder
│       │   └── New Folder
│       ├── New Folder (2)
│       │   └── New Folder
│       ├── New Folder (3)
│       └── New Folder (4)
├── New Folder (7)
│   ├── New Folder
│   │   ├── New Folder
│   │   ├── New Folder (2)
│   │   ├── New Folder (3)
│   │   │   └── New Folder
│   │   └── New Folder (4)
│   └── New Folder (2)
│       ├── New Folder
│       ├── New Folder (2)
│       ├── New Folder (3)
│       └── New Folder (4)
├── New Folder (8)
│   ├── New Folder
│   │   ├── New Folder
│   │   ├── New Folder (2)
│   │   │   └── New Folder
│   │   ├── New Folder (3)
│   │   └── New Folder (4)
│   │       └── New Folder
│   └── New Folder (2)
│       ├── New Folder
│       ├── New Folder (2)
│       │   └── New Folder
│       ├── New Folder (3)
│       │   └── New Folder
│       └── New Folder (4)
│           └── New Folder
└── New Folder (9)
├── New Folder
│   ├── New Folder
│   ├── New Folder (2)
│   │   └── New Folder
│   ├── New Folder (3)
│   │   └── New Folder
│   └── New Folder (4)
└── New Folder (2)
├── New Folder
│   └── New Folder
├── New Folder (2)
│   └── New Folder
├── New Folder (3)
│   └── New Folder
└── New Folder (4)
└── New Folder

209 mappen, 0 bestanden

Over Folders

Folders is een niet-tekstuele taal, waarbij code uitsluitend wordt uitgedrukt in containment (insluiting) en volgorde. De namen van de mappen worden genegeerd, behalve voor de alfabetische sortering. In andere woorden: het gaat om pure geordende bomen.

Geïnspireerd door de taal Whitespace, is Folders gewijd aan het idee van gedematerialiseerde code. Het begon met de vraag: "Wat is leger dan een bestand zonder zichtbare tekst?". Een lege map is overbodig, een aanhangsel zonder doel. In git wordt zo'n map volledig genegeerd (om die reden wordt aangeraden dat Folders-programma's .gitignore-bestanden in hun diepste lagen plaatsen).

Folders begon als een Windows-taal. In Windows is de leegte nog extremer: mappen nemen helemaal geen schijfruimte in beslag. Ter bewijs kun je 352.449 mappen aanmaken en de eigenschappen ervan bekijken. Op deze manier biedt Folders niet alleen een gedematerialiseerde benadering van code, maar ook een oneindige opslagcapaciteit. Door alle data te coderen in mapnamen, hoef je je nooit meer zorgen te maken over een tekort aan ruimte.

Voor gebruikers van andere besturingssystemen biedt de emulator een ervaring van hoe Folders data en code beheert. De originele implementatie is te vinden op GitHub.

Codering

Elke commandomap heeft ten minste één kindmap. Het aantal submappen in de eerste map (alfabetisch) geeft het type commando aan. Eventuele argumenten worden aangegeven in een tweede map; sommige commando's vereisen een derde map. Expressies werken op dezelfde manier: het aantal mappen in de eerste submap bepaalt welk type expressie het is. De volledige taalspecificatie staat hieronder.

Tijdelijke data wordt opgeslagen als mappen. In tegenstelling tot de Folders-code, is het hier juist de naam van de map die de data opslaat.

Folders FS

De Folders-interpreter maakt geen tijdelijke bestanden aan; alles wat niet direct in het geheugen wordt gehouden, wordt opgeslagen als een set tijdelijke mappen. In tegenstelling tot Folders-code, slaat de naam van de map de data zelf op.

De voorkeurs-I/O van Folders is een andere set mappen. Dit betekent dat je al je data in mappen kunt coderen, waardoor je het "materiële rijk" van bestanden volledig omzeilt en oneindige schijfruimte verkrijgt (op eigen risico). Folders-lang wordt gebruikt voor code, Folders FS voor dataopslag.

Visualisaties

Een Folders-programma is een nil-terminated nested list. De eenvoudigste vorm is pure insluiting en volgorde, zoals in deze JSON-array:

[[[[],[]],[],[[]]],[[[],[]],[],[[],[]]],[[[],[]],[],[[],[],[]]],[[[],[]],[],[[],[],[],[]]],[[[],[],[]],[[]],[[[],[],[],[],[]],[],[[[],[],[],[]]]]],[[[],[],[]],[[],[]],[[[],[],[],[],[]],[],[[[],[],[],[[]]]]]],[[[],[],[]],[[],[],[],[]],[[[],[],[],[],[]],[],[[[],[],[],[]]]]],[[[]],[[[],[],[],[],[],[],[],[]],[[],[[],[],[],[]]],[[[],[],[],[],[]],[],[[[],[],[],[[]]],[[[]],[[]],[[]],[]]]]],[[[[],[],[],[]],[[],[[]]]],[[[],[],[],[]],[[[],[],[],[],[]],[[],[],[]],[[[[]],[],[[]],[]]]]],[[[],[],[]],[[],[],[]],[[[]],[[],[[]]],[[],[[],[]]]]],[[[],[],[]],[[]],[[],[[],[]]]],[[[],[],[]],[[],[]],[[],[[],[],[]]]],[[[],[],[]],[[],[],[],[]],[[[]],[[],[[],[],[],[]]],[[[],[],[],[],[]],[],[[[],[],[],[[]]]]]]]]]]

(Voorbeeld van een Fibonacci-programma)

Dit is ook de manier waarop de JS-emulator Folders-programma's opslaat en leest. Er zijn echter andere visualisaties mogelijk, aangezien Folders-programma's inhoud zijn als structuur en kunnen worden toegepast op ruwe data van elk type.

Voorbeelden van alternatieve visualisaties zijn:

  • Contourkaarten: Waarbij dikkere lijnen containers zijn en de volgorde van de mappen wordt gelezen vanaf de linkerbovenhoek (NW), tegen de klok in. (Bijv. een Truth Machine).
  • Stambomen: Met uitsluitend één ouder per element.
  • Botanische vertakkingsstructuren: Zoals een splitsende korenhalm.
  • Paden door een doolhof.

Rode stippen in visualisaties kunnen een drempel aangeven van een container naar een enkel kindelement.

Taalspecificaties

De taal is een eenvoudige declaratieve taal met een korte lijst semantische regels. Voor zowel commando's als expressies bepaalt het aantal mappen in de eerste kindmap het gebruik. Typen worden direct gebruikt.

Commando's

CommandoAantal mappenDetails
if0 mappenTweede submap bevat de expressie, derde bevat de lijst met commando's
while1 mapTweede submap bevat de expressie, derde bevat de lijst met commando's
declare2 mappenTweede submap bevat het type, derde bevat de variabelenaam (in aantal mappen)
let3 mappenTweede bevat de variabelenaam (in aantal mappen), derde bevat de expressie
print4 mappenTweede submap bevat de expressie
input5 mappenTweede submap bevat de variabelenaam

Expressies

TypeAantal mappenDetails
variabele0 mappenTweede submap bevat de variabelenaam
optellen (add)1 mapTweede submap bevat de eerste expressie, derde de tweede expressie
aftrekken (subtract)2 mappenTweede submap bevat de eerste expressie, derde de tweede expressie
vermenigvuldigen (multiply)3 mappenTweede submap bevat de eerste expressie, derde de tweede expressie
delen (divide)4 mappenTweede submap bevat de eerste expressie, derde de tweede expressie
letterlijke waarde (literal value)5 mappenTweede submap bevat het type van de waarde (bijv. twee mappen voor een string), derde bevat de waarde
gelijk aan (equal to)6 mappenTweede en derde map bevatten de expressies om te vergelijken
groter dan (greater than)7 mappenTweede en derde map bevatten de expressies om te vergelijken
kleiner dan (less than)8 mappenTweede en derde map bevatten de expressies om te vergelijken

Typen

TypeAantal mappen
float1 map
string2 mappen
char3 mappen

De referentie-compiler is beschikbaar op GitHub: https://github.com/rottytooth/Folders