[C++] Syntax stoeien, Javascript syntax in c++

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Arjan
  • Registratie: Juni 2001
  • Niet online

Arjan

copyright is wrong

Topicstarter
Mijn 'eerste' programmeertaal was Javascript en nog steeds vind ik de syntax en mogelijkheden van de taal erg mooi. Onlangs moest ik weer eens wat met JS doen en toen begon het idee dat het in C++ ( mijn 'huidige' taal ) mogelijk moest zijn om veel van JS te simuleren.

Nu begrijp ik dat dit niet echt een praktisch nut heeft, maar om iets dergelijks op te zetten dwingt je creatief te kijken naar een taal en levert vaak inzichten op die je anders nooit zou krijgen. Vandaar dat ik aan het stoeien was geslagen om te proberen JS in C++ te implementeren.

Nu heb ik een groot deel werkend, maar met name de function pointers die in JS goddelijk eenvoudig zijn krijg ik nog niet geïmplementeerd. Hierover zou ik graag met jullie discussiëren.

Ik heb het volgende bijvoorbeeld werkend:
C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
struct Document
{
    void write( const Undefined &object )
    {
        std::cout << object << std::endl;
    }
} document;

int main( int argc, char **argv )
{
    var aap;

    document.write( aap );

    aap = 2;

    document.write( aap );

    aap = 3;

    document.write( aap );

    aap = "apen";

    document.write( aap );

    var beer = null;

    document.write( 3 + 2 + aap + 2e-3 + beer );

    var a;
    var b = null;
    var c = Object();
    var d = String();
    var e = Array();
    var f = Date();

    document.write( a );
    document.write( b );
    document.write( c );
    document.write( d );
    document.write( e );
    document.write( f );

    for ( var i = 0; i <= 5; ++i )
    {
        document.write( "The number is " + i );
    }

    return 0;
}

Dit heeft als output:
undefined
2
3
apen
5apen0.002null
undefined
null
[object Object]

[nog niet geimplementeerd]
[nog niet geimplementeerd]
The number is 0
The number is 1
The number is 2
The number is 3
The number is 4
The number is 5


Voor diegene die niet met JS bekend zijn, het volgende is mogelijk in JS:
JavaScript:
1
2
3
4
5
var a = function()
{
    alert( this );
}
a();

Graag zou ik zien hoe dicht ik hierbij in de buurt kan komen.
Ik kwam zelf niet verder dan het volgende:
C++:
1
2
3
4
5
6
7
8
struct Function : public Undefined { Undefined operator()()
    {
        alert( this );
        return 0;
    }
};
var a = Function();
a();

Dat zou je met wat preprocessor magic nog iets mooier kunnen maken, maar echte prijzen win je er natuurlijk niet mee... Daarnaast zitten er ook behoorlijke lastigheden aan vast wanneer je met verschillende parameters gaat werken.

Nu weet ik dat er hier genoeg mensen rondlopen die de mooiste dingen kunnen bedenken in C++, dus ik hoop dat hier een leuke oplossing uit voorkomt :)

oprecht vertrouwen wordt nooit geschaad


Acties:
  • 0 Henk 'm!

Verwijderd

C++:
1
2
int b(int x, int y) { return x + y; }
int (*a)(int, int) = b;

http://codepad.org/w3SsFpMJ

Zou gewoon moeten werken. Function pointers zaten al in C. :P

In C++0x zitten zelfs lambda's, waarmee je als het goed is het volgende zou kunnen doen:

C++:
1
int (*b)(int, int) = [](int x, int y) { return x + y; }

[ Voor 58% gewijzigd door Verwijderd op 02-04-2011 13:43 ]


Acties:
  • 0 Henk 'm!

  • Nvidiot
  • Registratie: Mei 2003
  • Laatst online: 03-06 16:38

Nvidiot

notepad!

Je zou kunnen kijken naar Lambda functies in C++0x:
Wikipedia: C++0x

What a caterpillar calls the end, the rest of the world calls a butterfly. (Lao-Tze)


Acties:
  • 0 Henk 'm!

Verwijderd

Oh, en over 'var' gesproken: C++0x heeft daar 'auto' voor. ;)

Acties:
  • 0 Henk 'm!

  • Gamebuster
  • Registratie: Juli 2007
  • Laatst online: 15-09 23:08
Hoe kom je aan die var's?
Is dat een standaard feature van C++?

Ik krijg opeens enorm veel zin in C++ :P

Let op: Mijn post bevat meningen, aannames of onwaarheden


Acties:
  • 0 Henk 'm!

Verwijderd

Ik gok dat hij een soort preparser gebruikt, aangezien volgens mij 'var' niet in C++ zit. :P
Dat, of er is magie met klassen.

Acties:
  • 0 Henk 'm!

  • Gamebuster
  • Registratie: Juli 2007
  • Laatst online: 15-09 23:08
Wat het ook is, ik wil het ook :9

Let op: Mijn post bevat meningen, aannames of onwaarheden


Acties:
  • 0 Henk 'm!

  • Arjan
  • Registratie: Juni 2001
  • Niet online

Arjan

copyright is wrong

Topicstarter
Verwijderd schreef op zaterdag 02 april 2011 @ 13:39:
C++:
1
2
int b(int x, int y) { return x + y; }
int (*a)(int, int) = b;

http://codepad.org/w3SsFpMJ

Zou gewoon moeten werken. Function pointers zaten al in C. :P
Dat is mij bekend ;)
Ik zoek echter naar een manier om deze zoals bij JS te gebruiken.
In C++0x zitten zelfs lambda's, waarmee je als het goed is het volgende zou kunnen doen:

C++:
1
int (*b)(int, int) = [](int x, int y) { return x + y; }
Dat komt al een stuk meer in de richting, aanvankelijk wilde ik het echter nog met de 'oude' c++ standaard oplossen, dat is echter verder geen vereiste natuurlijk :)
Verwijderd schreef op zaterdag 02 april 2011 @ 13:45:
Oh, en over 'var' gesproken: C++0x heeft daar 'auto' voor. ;)
Tja, hier geldt hetzelfde, al kun je met auto niet precies hetzelfde bereiken, omdat verschillende types in JS bijvoorbeeld anders reageren als ze als string uitgelezen worden.
Gamebuster schreef op zaterdag 02 april 2011 @ 13:47:
Hoe kom je aan die var's?
Is dat een standaard feature van C++?

Ik krijg opeens enorm veel zin in C++ :P
Verwijderd schreef op zaterdag 02 april 2011 @ 13:49:
Ik gok dat hij een soort preparser gebruikt, aangezien volgens mij 'var' niet in C++ zit. :P
Dat, of er is magie met klassen.
Dan kies ik voor de optie van 'magie met klassen' ;)

Wat ik nu doe;

Er is een class genaamd 'BaseObject' Dit is het basis object waar alle andere klassen van afgeleid zijn. Dan is er de Undefined class, deze heeft een pointer naar een BaseObject als member.

De Undefined klasse fungeert als interface, alle operaties komen hier eerst op binnen en worden via polymorfisme naar de daadwerkelijke implementatie gestuurd.

oh, en typedef Undefined var; ;)

oprecht vertrouwen wordt nooit geschaad


Acties:
  • 0 Henk 'm!

Verwijderd

I see, netjes. :P

Om 'echte' javascript syntax te nabootsen, kun je ook gewoon het volgende doen:
C++:
1
#define function []

Zo kun je het volgende doen:
C++:
1
int (*a)(int, int) = function(int x, int y) { return x + y; }

Acties:
  • 0 Henk 'm!

  • MLM
  • Registratie: Juli 2004
  • Laatst online: 12-03-2023

MLM

aka Zolo

Verwijderd schreef op zaterdag 02 april 2011 @ 18:27:
I see, netjes. :P

Om 'echte' javascript syntax te nabootsen, kun je ook gewoon het volgende doen:
C++:
1
#define function []

Zo kun je het volgende doen:
C++:
1
int (*a)(int, int) = function(int x, int y) { return x + y; }
Als we dan toch de C++0x gaan doen:
C++:
1
2
#define function []
#define var auto

Zo kun je het volgende doen:
C++:
1
var a = function(int x, int y) { return x + y; }

-niks-


Acties:
  • 0 Henk 'm!

  • Gamebuster
  • Registratie: Juli 2007
  • Laatst online: 15-09 23:08
Houd je dit project voor jezelf of zou je het willen delen?

Let op: Mijn post bevat meningen, aannames of onwaarheden


Acties:
  • 0 Henk 'm!

  • Arjan
  • Registratie: Juni 2001
  • Niet online

Arjan

copyright is wrong

Topicstarter
Gamebuster schreef op zaterdag 02 april 2011 @ 18:47:
Houd je dit project voor jezelf of zou je het willen delen?
al mijn eigen projectjes zijn open source, ik zet vanavond een eerste versie online, maakt meedenken wat makkelijker :)

oprecht vertrouwen wordt nooit geschaad


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03:42

.oisyn

Moderator Devschuur®

Demotivational Speaker

Verwijderd schreef op zaterdag 02 april 2011 @ 13:45:
Oh, en over 'var' gesproken: C++0x heeft daar 'auto' voor. ;)
'var' zoals gepresenteerd door Arjan en 'auto' van C++0x zijn echt twee compleet verschillende dingen. 'var' is een loosely typed variabele, 'auto' is static type inference.

.edit: oh wacht dat was al duidelijk 8)7

Wat functies betreft, het wordt lastig denk ik. Overload var::operator() die 0 of meer vars accepteert, en reroute de call naar de virtual BaseObject::Call(). Die implementatie is voor een functor is dan een template die werkt op het type wat aan de var geassigned is, waarvoor je dus een generieke operator=(T) nodig hebt, wat wellicht voor een hoop kopzorgen gaat zorgen - en je moet zorgen dat de implementatie van Call() wel compilet als je op die T helemaal geen operator() hebt.

C++ Concepts had je hier enorm kunnen helpen, maar helaas :/. Wat ik écht een gemisten kans vind van lambda's is dat de signature niet deduceerbaar is.

[ Voor 51% gewijzigd door .oisyn op 03-04-2011 02:17 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

Verwijderd

.oisyn schreef op zondag 03 april 2011 @ 01:05:
[...]

'var' zoals gepresenteerd door Arjan en 'auto' van C++0x zijn echt twee compleet verschillende dingen. 'var' is een loosely typed variabele, 'auto' is static type inference.
Klopt, dat was my bad. Excuses. :P

Acties:
  • 0 Henk 'm!

  • Arjan
  • Registratie: Juni 2001
  • Niet online

Arjan

copyright is wrong

Topicstarter
Arjan schreef op zaterdag 02 april 2011 @ 19:59:
[...]

al mijn eigen projectjes zijn open source, ik zet vanavond een eerste versie online, maakt meedenken wat makkelijker :)
Dit duurt even iets langer, ik wil nog wat aanpassingen maken alvorens 'm publiek te gooien.
.oisyn schreef op zondag 03 april 2011 @ 01:05:
[...]
Wat functies betreft, het wordt lastig denk ik. Overload var::operator() die 0 of meer vars accepteert, en reroute de call naar de virtual BaseObject::Call(). Die implementatie is voor een functor is dan een template die werkt op het type wat aan de var geassigned is, waarvoor je dus een generieke operator=(T) nodig hebt, wat wellicht voor een hoop kopzorgen gaat zorgen - en je moet zorgen dat de implementatie van Call() wel compilet als je op die T helemaal geen operator() hebt.
[...]
Ik snap niet precies wat je bedoeld, wat mij persoonlijk het grootste probleem lijkt is het feit dat het aantal parameters niet vaststaat. var heeft al een = operator die built-ins accepteerd, of bedoel je dat niet?

oprecht vertrouwen wordt nooit geschaad


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03:42

.oisyn

Moderator Devschuur®

Demotivational Speaker

Ik bedoel zoiets:

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
class BaseObject
{
    // ...

    virtual var Call(const std::vector<var> & vars) = 0;
};

template<class T, class SIG>
class FunctionObject;

/* voorbeeld voor 2 params, de overige moet je ook maken, en rekening houden
met het feit dat een functie ook void kan returnen */
template<class T, class R, class P1, class P2>
class FunctionObject<T, R(P1, P2)>
{
    FunctionObject(T func) : m_func(func) { }

    // ...

    virtual var Call(const std::vector<var> & vars)
    {
        if (vars.size() != 2)
            throw NotEnoughArgumentsException();

        return m_func(static_cast<P1>(vars[0]), static_cast<P2>(vars[1]));
    }

private:
    T m_func;
};

class var
{
    // ...

    var operator()(var v1, var v2) const
    {
        std::vector<var> vars(2);
        vars[0] = v1;
        vars[1] = v2;
        return m_pBaseObject->Call(vars);
    }

    template<class T> var & operator=(T func)
    {
        typedef typename een_constructie_die_de_sig_van_T_bepaalt<T>::type SIG;
        m_pBaseObject = new FunctionObject<T, SIG>(func);
        return *this;
    }
};


Nadeel is dus de operator= die ineens alles accepteert (al zou dat op te lossen zijn met enable_if), en de lastigheid van het bepalen van signatures gegeven generieke functors. Je zou ervoor kunnen kiezen om alleen function pointers en std::function<SIG> te accepteren en geen generieke functors, maar dat betekent dat je voor lambda's expliciet moet casten.

[ Voor 18% gewijzigd door .oisyn op 03-04-2011 23:47 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • Arjan
  • Registratie: Juni 2001
  • Niet online

Arjan

copyright is wrong

Topicstarter
Volgens mij kan het nog makkelijker door alleen var's te accepteren, ik heb mijn broncode online gegooid via git:
git://houbenweb.nl/JS++

Voor functies zit er momenteel nog niets in, behalve een () operator die 10 optionele var's ( Undefined ) accepteert.

Ik heb naar aanleiding van .oisyn's code een idee voor een mogelijke implementatie, morgen maar eens proberen :)

oprecht vertrouwen wordt nooit geschaad


Acties:
  • 0 Henk 'm!

  • Gamebuster
  • Registratie: Juli 2007
  • Laatst online: 15-09 23:08
Kan je bij C++ niet het ophalen van een length-property de getLength method laten gebruiken?

Ik zie een .getLength method, maar geen .length property.

Let op: Mijn post bevat meningen, aannames of onwaarheden


Acties:
  • 0 Henk 'm!

  • Arjan
  • Registratie: Juni 2001
  • Niet online

Arjan

copyright is wrong

Topicstarter
Gamebuster schreef op maandag 04 april 2011 @ 02:13:
Kan je bij C++ niet het ophalen van een length-property de getLength method laten gebruiken?

Ik zie een .getLength method, maar geen .length property.
De implementatie ontbrak, maar de property was er wel. Heb de implementatie nu toegevoegd.

oprecht vertrouwen wordt nooit geschaad


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03:42

.oisyn

Moderator Devschuur®

Demotivational Speaker

C++ heeft geen properties.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • Arjan
  • Registratie: Juni 2001
  • Niet online

Arjan

copyright is wrong

Topicstarter
Tja, strikt genomen is de Length uit de Undefined classe natuurlijk geen property, maar in dagelijks gebruik is deze prima te gebruiken alsof het een readonly property is.
Het mooiste zou zijn om Length te laten overerven van een Number, maar dat gaat natuurlijk niet werken ;)

oprecht vertrouwen wordt nooit geschaad


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03:42

.oisyn

Moderator Devschuur®

Demotivational Speaker

Oh ja ik kan je code niet zien, heb geen git client :)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • Gamebuster
  • Registratie: Juli 2007
  • Laatst online: 15-09 23:08
offtopic:
Waarom heb je Undefined de Length-property gegeven?
Length (eigenlijk length, met kleine L) zit alleen in String en Array, zover ik weet.

Let op: Mijn post bevat meningen, aannames of onwaarheden


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03:42

.oisyn

Moderator Devschuur®

Demotivational Speaker

Zodat je de length op een var kunt aanroepen.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • Arjan
  • Registratie: Juni 2001
  • Niet online

Arjan

copyright is wrong

Topicstarter
voor de git-lozen: http://houbenweb.nl/JS++/

oprecht vertrouwen wordt nooit geschaad


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03:42

.oisyn

Moderator Devschuur®

Demotivational Speaker

Clever, die truc met de union :)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • Arjan
  • Registratie: Juni 2001
  • Niet online

Arjan

copyright is wrong

Topicstarter
Die had ik bedacht naar aanleiding van \[C++] Swizzling implementatie operators
Ik was er zelf ook wel blij mee :P

oprecht vertrouwen wordt nooit geschaad


Acties:
  • 0 Henk 'm!

  • user109731
  • Registratie: Maart 2004
  • Niet online
Ik kwam net deze blogpost tegen: http://blog.vjeux.com/201...-cpp-into-javascript.html

Precies hetzelfde idee, misschien interessant om jullie implementaties te vergelijken :)

[ Voor 9% gewijzigd door user109731 op 25-04-2011 17:36 ]


Acties:
  • 0 Henk 'm!

  • Devilly
  • Registratie: Januari 2009
  • Niet online
Oops! This link appears to be broken.

Acties:
  • 0 Henk 'm!

  • Arjan
  • Registratie: Juni 2001
  • Niet online

Arjan

copyright is wrong

Topicstarter
JanDM schreef op maandag 25 april 2011 @ 17:36:
Ik kwam net deze blogpost tegen: http://blog.vjeux.com/201...-cpp-into-javascript.html

Precies hetzelfde idee, misschien interessant om jullie implementaties te vergelijken :)
Ziet er mooi uit, ga het eens bekijken
gefixt :)

oprecht vertrouwen wordt nooit geschaad

Pagina: 1