BeRsErKeR hat geschrieben:Verblüffenderweise sieht deine Syntax für Funktionen fast exakt wie mein Entwurf aus.
Ich habe lange versucht, eine einheitliche Deklarationssyntax sowohl für Daten als auch für Funktionen hinzukriegen, aber bisher mit wenig Erfolg.
BeRsErKeR hat geschrieben:Was mir auch wichtig ist, ist Nebenwirkungen so gut es geht zu minimieren. Bei mir sollen alle Funktionen von Haus aus "pur" sein, man kann also weder I/O durchführen, noch globale Variablen ändern.
Meinst du mit
von Haus aus müssen pur sein oder
sind pur so lange nicht anders angegeben? Keine Ahnung, ob Erstes so eine gute Idee ist – für eine Skriptsprache mit Sicherheit; für eine vollwertige Programmiersprache wäre es mir schon wieder zu utopisch. Pascal hat eine Unterscheidung zwischen Funktionen (Parameter zu Rückgabewert; letzterer
muss vom Aufrufer behandelt werden) und Prozeduren (Wirkung; Rückgabewert optional); das wäre für mich ein brauchbarer Kompromiss.
BeRsErKeR hat geschrieben:hab mich da teilweise an D orientiert, genau wie bei der Syntax von Arrays
Array-Syntax ist ein interessantes Thema … ich hasse C(++)-Arrays. Im Augenblick löse ich in meinen C++-Projekten alles über
range-Strukturen, die auf Anfang und Ende von Feldern zeigen, und das fließt wie Butter – abgesehen von dem winzigen Detail, dass der Compiler es nicht ausreichend optimiert, weil es keine Wurzel in der Sprache selber hat; und dass mir bei String-Literalen immer die automatisch angehängte Null zum Verhängnis wird (for teh luv of gawd,
WHY!). Ich muss mir auch unbedingt nochmal Gos Slices ansehen, falls ich irgendwann mal Zeit habe. Und dann wären da noch Strings, die ja auch ein Thema für sich sind (Rein in die Sprache oder nicht? Nur Literale? Nullterminiert oder nicht? …).
BeRsErKeR hat geschrieben:globale Variablen / statische Member soll es höchstwahrscheinlich gar nicht erst geben (allerdings globale Funktionen und eventuell statische Methoden, wobei mit global dann modul-lokal bzw. namespace-lokal gemeint ist).
Gegen globale Variablen spricht für mich nur der eine Grund, dass sie nicht mit dem Konzept von Threads und Fibers vereinbar sind. Ich würde
definitiv statische (vorberechnete) globale Variablen für sowas wie Nachschlagtabellen erlauben; wohl auch einige bei Programmstart initialisierte Instanzen (mit automatisch korrekter Initialisierungsreihenfolge, da ich die Abhängigkeiten sowieso zur Typauflösen ausklamüsern muss), weil man sich ohne einfach zu weit von der Praxis entfernen würde. (Beispiel Spiele-Sandbox: Wo nähmst du freien Speicher manueller Lebenszeit her, falls du weder I/O aufrufen, noch einen globalen Zeiger anlegen könntest? Du müsstest alles auf esoterische, wahrscheinlich halb rekursive Gebilde umschrauben … das würde es für den Compiler-Entwickler vereinfachen, aber sicher nicht für den Programmierer.) Aber bei mit dem Prozess initialisierten Variablen würden dann wieder Leute alles aushebeln, indem sie ihr ganzes Programm in einen K’tor packen (MFC).
BeRsErKeR hat geschrieben:Bei deinem Beispiel fällt mir das Schlüsselwort instance auf. Ich vermute du unterscheidest dadurch zwischen Stack und Heap?
Nein; das benötige ich für Template-Metaprogrammierung. Genau genommen benötigt C++ es (in Form von
typename vor den Namen abhängiger Typen in Templates), um beim Parsen zwischen den Fällen
a * i; // Multiplikation; a: int; i: int
a * i; // Zeigerdeklaration; a: typedef für int; i: Name des Zeigers
unterscheiden zu können. Ich brauche es
immer, weil ich ja keine Deklarationen habe und der Compiler sonst beim Parsen dieser Stelle nicht wissen könnte, um welchen der Fälle es sich handelt. Mit einer ausreichend klaren Deklarationssyntax wäre das am Ende sicher obsolet; aber um es mir selber zu vereinfachen, habe ich es erstmal dringelassen. Was die Unterscheidung zwischen Stack / Heap angeht (sehr unglückliche Begriffe; nennen wir sie
automatische und
manuelle Speicherverwaltung), würde ich nur eine Placement-Syntax bauen (d.h., Byte-Array aus beliebiger Quelle zu Objekt initialisieren) und die vor ein paar Tagen erwähnte Array-Initialisierung irgendwie reinboxen.