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
| Commando | Aantal mappen | Details |
|---|---|---|
if | 0 mappen | Tweede submap bevat de expressie, derde bevat de lijst met commando's |
while | 1 map | Tweede submap bevat de expressie, derde bevat de lijst met commando's |
declare | 2 mappen | Tweede submap bevat het type, derde bevat de variabelenaam (in aantal mappen) |
let | 3 mappen | Tweede bevat de variabelenaam (in aantal mappen), derde bevat de expressie |
print | 4 mappen | Tweede submap bevat de expressie |
input | 5 mappen | Tweede submap bevat de variabelenaam |
Expressies
| Type | Aantal mappen | Details |
|---|---|---|
| variabele | 0 mappen | Tweede submap bevat de variabelenaam |
optellen (add) | 1 map | Tweede submap bevat de eerste expressie, derde de tweede expressie |
aftrekken (subtract) | 2 mappen | Tweede submap bevat de eerste expressie, derde de tweede expressie |
vermenigvuldigen (multiply) | 3 mappen | Tweede submap bevat de eerste expressie, derde de tweede expressie |
delen (divide) | 4 mappen | Tweede submap bevat de eerste expressie, derde de tweede expressie |
letterlijke waarde (literal value) | 5 mappen | Tweede submap bevat het type van de waarde (bijv. twee mappen voor een string), derde bevat de waarde |
gelijk aan (equal to) | 6 mappen | Tweede en derde map bevatten de expressies om te vergelijken |
groter dan (greater than) | 7 mappen | Tweede en derde map bevatten de expressies om te vergelijken |
kleiner dan (less than) | 8 mappen | Tweede en derde map bevatten de expressies om te vergelijken |
Typen
| Type | Aantal mappen |
|---|---|
| float | 1 map |
| string | 2 mappen |
| char | 3 mappen |
De referentie-compiler is beschikbaar op GitHub: https://github.com/rottytooth/Folders
Groetjes,