Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

71

23.04.2015, 08:27

Ich muss zugeben mir war nie klar dass "test" + 3 + 4 zu "test34" wird. Habe ich einfach nie so wirklich drüber nachgedacht. Wenn man drüber nach denkt ergibt es natürlich sinn, habe es trotzdem grad erst mal ausprobiert um es selbst zu sehen. Will ich Zahlen ausgeben so gebe ich mir meist noch einen Bezeichner dazu aus und will ich Berechnungen in einen String schieben so klammere ich die glaube ich normalerweise. Bin mir da grad nicht mal richtig sicher, aber solchen Code habe ich an sich eher selten. Aber an sich sieht deine Lösung doch ganz schick aus.
Das ganze soll dann aber schon zur Übersetzungszeit umgewandelt werden oder? Ansonsten könnte ich mir vorstellen dass ein Entwickler den Namen in dem String zur Laufzeit manipulieren könnte was unter Umständen ganz nett sein könnte wobei ich da länger drüber nachdenken müsste. Der Nachteil wäre natürlich dass Fehler erst zur Laufzeit auffallen würden, oder im schlimmsten Fall das Programm crashen würde. Steigt da der Aufwand des parsens nicht auch extrem an? An sich würde ich dann auch so etwas erwarten wie:

C-/C++-Quelltext

1
System.out.writeLine("Test:\(xyz.getAbc())");


oder sind dort nur Variablen und Konstanten zugelassen?
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

Sacaldur

Community-Fossil

Beiträge: 2 301

Wohnort: Berlin

Beruf: FIAE

  • Private Nachricht senden

72

23.04.2015, 09:24

Soweit ich seine vorgehensweise verstanden habe, kann man in den Klammern beliebige Ausdrücke schreiben. Beim Kompilieren wird ein solcher String dann in einen Ausdruck der Form "Test: ".append(xyz.getAbc()) umgewandelt.
Das hat automatisch zur Folge, dass nur Stringliterale entsprechend ausgewertet werden können, nicht aber zur Laufzeit so zusammengebaute Zeichenfolgen. Letzteres ergibt Sinn, wenn man berücksichtigt, dass der Backslash immernoch ein Escape-Character ist. Zur Laufzeit kann man also gar nicht "Test:\(xyz.getAbc())", sondern nur "Test:\\(xyz.getAbc())" erzeugen. ;)
Spieleentwickler in Berlin? (Thema in diesem Forum)
---
Es ist ja keine Schande etwas falsch zu machen, als Programmierer tu ich das täglich, [...].

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

73

23.04.2015, 10:24

Du könntest ja \( als eigenes Token definieren und das in deiner Grammatik berücksichtigen. Dann wäre in diesem Fall \ kein Escape Zeichen bzw eins mit einer neuen Bedeutung.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

pouk_

Frischling

Beiträge: 64

Beruf: Schüler

  • Private Nachricht senden

74

23.04.2015, 14:06

Oder einfach $ wie in Vala

C-/C++-Quelltext

1
s = "$a + $(a+b)"

C-/C++-Quelltext

1
2
#include <stdlib.h>
main(){for(;;malloc(1024));} // dead

LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

75

23.04.2015, 15:51

Soweit ich seine vorgehensweise verstanden habe, kann man in den Klammern beliebige Ausdrücke schreiben. Beim Kompilieren wird ein solcher String dann in einen Ausdruck der Form "Test: ".append(xyz.getAbc()) umgewandelt.
Exakt :thumbup:

Zitat von »Sacaldur«

Das hat automatisch zur Folge, dass nur Stringliterale entsprechend ausgewertet werden können, nicht aber zur Laufzeit so zusammengebaute Zeichenfolgen
Wieder richtig. Sooo dynamisch ist meine Sprache dann auch nicht ;-)

Zitat von »chorsch«

Steigt da der Aufwand des parsens nicht auch extrem an?
Zwar ein wenig, aber nicht so sehr, dass es zur Last würde. Ich habe sogar nicht mal den Parser erweitert, sondern nur den Scanner.
D.h. anstatt eines einzelnen String Tokens werden dann mehrere Tokens vom Scanner ausgespuckt, und der Parser bekommt von dieser Kurzschreibweise gar nichts mit.

Ähnlich wie in C und C++, ist der Backslash in einem String Literal sowieso schon als Escape Character reserviert.
Wenn ich die String Interpolation nicht mit dieser Syntax anbieten würde, würde es bei dem String "\(x)" einfach zu einem Syntax Fehler kommen, weil "\(" kein gültiger 'Special Character' ist.

Zitat von »Sacaldur«

Und die Konkatenierung mit + wird von sehr vielen Sprachen verwendet, neben Java wären C#, JavaScript oder Python weitere Beispiele (und ich würde vermuten, std::string aus C++ sollte danke Operatorenüberladung auch dazu gehören).
In C++ ist der + Operator im std::string (genauer gesagt std::basic_string) überladen, ja. Aber hier ist es ein wenig anders als in Java:

C-/C++-Quelltext

1
2
3
4
5
6
7
// Java
int x = 12;
"x = " + x; // OK, ergibt "x = 12"

// C++
int x = 12;
"x = " + x; // ERROR: 'undefined behavior'

Da in C++ ein String Literal vom Typ "const char*" ist und nicht vom Typ "std::string", muss hier manuell in einen std::string umgewandelt werden, ansonsten wird mit '+x' ein Integer Wert auf den Pointer addiert!
D.h. Ausdrücke wie 3 + 4 + "test" + 3 + 4 sind in C++ ohne hin nicht gültig.
Daher mein Vergleich primär mit Java :-)

Gruß,
Lukas

LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

76

28.04.2015, 23:32

Eben konnte ich endlich mal das erste "Immediate Script" ausführen (siehe Anhang).
Der Code-Generator ist zwar noch lange nicht fertig, aber es ist schön, schon mal ein Zwischenergebnis zu sehen :-)

Das Code Beispiel gibt die Fibonacci Reiche bis < 1000 aus.
Ist noch nicht viel, aber leider kann ich noch lange nicht alle Sprach-Features nutzen.
»LukasBanana« hat folgendes Bild angehängt:
  • 05 First Running Script.png

LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

77

02.05.2015, 22:35

In XieXie kann man jetzt bei Quines ein wenig schummeln ^^

Das Keyword "import" kann nun auch dazu verwendet werden, um zur Compile-Zeit eine Text-Datei in ein String-Literal umzuwandeln.
Gedacht ist es dafür, wenn Text-Dateien direkt im ByteCode gespeichert werden sollen.
Damit braucht man also nur eine Datei (die Anwendung für die XVM) 'rumtragen' und kann so einfach und schnell textuellen Inhalt ins Programm integrieren.

Folgendes Programm hat (zur Laufzeit) keine Eingabe und gibt als Ausgabe den eigenen Programm-Code aus.

C-/C++-Quelltext

1
2
3
4
5
6
7
// Quine.xx
import System
class Quine {
    static void main() {
        System.out.write(import "Quine.xx")
    }
}


Hier ein sinnvolleres Beispiel:

C-/C++-Quelltext

1
2
3
4
5
6
class MyCommandLineTool {
    /* ... */
    static void printManPage() {
        System.out.write(import "MyCommandLineTool_ManPage.txt")
    }
}

Ergibt dann nur eine "*.xbc" Datei und die "..._ManPage.txt" muss nicht mit ausgeliefert werden.

Interessant wäre es auch noch, direkt Binär Dateien (z.B. PNG oder JPG Bilder) importieren zu können.
Die könnten dann aber eher schlecht als (Null-Terminated) "String" gespeichert werden.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »LukasBanana« (03.05.2015, 11:28)


Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

78

02.05.2015, 23:33

Interessant, D macht es genauso. Hier ein Beispiel der Anwendung: http://p0nce.github.io/d-idioms/#Embed-a…n-an-executable
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

79

03.05.2015, 11:31

Interessant, D macht es genauso.

Immer wieder schön zu sehen, dass andere Sprachen ähnliche oder gleiche Ideen umsetzen. Da fühlt man sich mit seiner Idee doch gleich bestätigt :D

Allerdings will ich mich jetzt mal darauf konzentrieren, dass mein Projekt ein absehbares Ende (für den 1. Release) findet.
Ich muss mich wirklich bremsen, neue Features einzubauen, solange die bisherigen noch nicht mal fertig implementiert sind :rolleyes:
Der Code-Generator wird mich noch einiges an Zeit kosten.

LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

80

07.05.2015, 23:17

Ich denke gerade noch über eine syntaktische Alternative zu Java's "instanceof" nach, weil ich lieber nicht so lange Keywords verwende.
Was findet ihr am besten von diesen drei Vorschlägen:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
// Variante 1 (wie in Java)
if obj instanceof Widget { /* ... */ }

// Variante 2 (kurzes Keyword)
if obj is Widget { /* ... */ }

// Variante 3 (ohne Keyword)
if obj = Widget { /* ... */ }

Variante 3 ist vermutlich etwas irreführend, weil instanceof nicht direkt Gleichheit prüft, sondern auch Unterklassen von "Widget" berücksichtigt.
Welche Variante findet ihr am besten, und/oder habt ihr noch andere Vorschläge?

Werbeanzeige