1. Co pouzit ked chcem niekam dosadit hociaky typ. Viem ze C++ nema spolocneho predka pre vsetky typy tak ako napriklad C# (System.Object), ale existuje k tomu nejaka alternativa? cim sa to zvykne nahradit? Ak si odmyslime parametricky polymorfizmus a genericke parametre. Pointerom na void? Ci existuje aj nieco sofistikovanejsie.
2. potrebujem typovu reprezentacia hociakej funkcie s hociakym poctom parametrov hociakeho typu a s navratovou hodnotou hociakehop typu. Napr:
Teda ked niekde zadam nazov toho typu ktory reprezentuje vsetky funkcie tak tam mozem dosadit hocico co sa da zavolat (funkciu, proceduru, metodu atd). Napr v JS je to predok vsetkych funkcii typ Function. Viem ze C++ nema objektovu hierarchiu (ak si ju sam nevytvorim) takze funkcie nemaju spolocneho predka, ale myslim ze by malo existovat nieco cim sa to da nahradit.
3. ako zistim pocet parametrov funkcie? Podla moznosti by som chcel aj variantu v compile-time aj v runtime (aj ked ocakavam ze v runtime sa to asi zistit neda)
@palec223 C++ ma nieco podobne ako generika, vola sa to sablony a funguje to velmi podobne akurat je to viac staticke a da sa s tym robit kopec veci co sa sa s generikami neda. Ale teraz hladam skor nahradu za System.Object proste nieco kam mozem dosadit hodnotu hociakeho typu. V C sa to riesilo pomocou smernikov ale predpokladam ze C++ uz ma na tento ucel nieco elegantnejsie
@mnichovcan ee, keyword auto používam na automatické odvodzovanie typov (type inference), ale ja potrebujem niečo čo zastúpi všetky funkcie. Niečo ako funkcionálny typ alebo aspoň nejaku šabonku ktorá by vedela odtestovať či ide o funkciu (či sa identifikátor dá zavolať). Jednu šablónu som našiel v STL std::is_function_v tu je môj testovací zdroják:
pastebin.com/Lm7wvM3k
Lenže tá funguje len na obyčajné funkcie, ale už nie na lambdy :/ čo nechápem prečo. Veď lambda je tiež len funkcia.
Tiež si viem zadať typovú definíciu presne pre konkrétnu funkciu s konkrétnym typom parametrov a návratových hodnôt:
pastebin.com/UWNUtg2K
Lenže ja potrebujem niečo univerzálenšie, čo by mi pustilo všetky funckie bezohľadu na počet a typy argumentov alebo návratových hodnôt. Chápeme sa?
2. nie som si isty, ale nieco v zmysle pointer na funkciu ktora vracia pointer na void a ako parameter berie pointer na void?
3. reflexiou (reflection)
k bodu dva: popis mi logiku toho ako chces spustit funkciu ked nepoznas pocet parametrov ktore na spustenie potrebuje. akymkolvek sposobom to skusis obabrat, vrdy nakoniec to co funkciu spusta do nej potrebuje narvat jej parametre, takze to potrebuje vediet ake parametre to su, ci uz formalne syntakticky, alebo cisto neformalne semanticky, aj keby hned vsetky funkcie brali jediny parameter pointer na void, alebo pointer na bit array. vzdy to co tu funkciu spusta aj tak potrebuje vediet co do toho jedneho pola narvat.
v konecnom dosledku su tvoje otazky nieco na co najlepsia reakcia podla mna je "what are you trying to do/solve?", lebo to znie ze si sa zasekol do tuneloveho videnia o jeden krok nespravnym smerom vpred. cize sprav krok naspat a radsej sa spytaj co sa to vlastne snazis vyriesit, nech ti mozno ludia vedia naznacit spravny smer riesenia daneho problemu, ktory nevyzaduje taketo code smells na ake sa pytas.
@midnight ver tomu že to čo potrebujem neni bežné použitie. robím si vo volnom čase vlastný programovací jazyk - funkcionálny jazyk (niečo na štýl haskellu alebo OCAML) jazyk už generuje funkčný kód ale stále má ďaleko od dokončenia aj keď základné jazykové konštrukcie sú už funkcčné. momentálne ten môj jazyk z ast generuje OCAML čo asi nebola najštastnejšia voľba, ale zvažujem že generátor prepíšem tak aby z AST generoval C++. pretože postupom času ako ten jazyk rozširujem o nové featury tak mi to OCAML začalo zvazovať ruky. zvažoval som okrem C++ aj LLVM IR ale to bolo príliš ukecané.
a k tomu aj navrhujem behové prostredie pre svoj jazyk a potrebujem si nasimlovať napr. curried funkcie v C++ (čo argument to vnorená funkcia), ale zároveň chcem použiť klasické funkcie takže budem musieť urobiť wrapper ktorý mi tú klasickú funkciu obalí a keď ju zavolám s menším počtom argumentov tak mi vráti novú funkciu s predvyplnenými argumentami.
zatiaľ len skúšam ako to pojde. navrhujem prototyp a keď mi niečo z toho bude fungovať (v kombinácii ešte s niečim) a bude to dostatočne efektívne, tak si podľa toho urobím návrh a nakódim to. a ak všetko pojde ako po masle tak prepíšem generátor
ale milujem ked su ludia takto domyslavi a predpojati alebo: "neviem si predstavit na co ti to moze byt, lebo ja som sa s tym este nestretol, takze urcite nieco robis zle"
@xxar3s nechapem preco sa iritujes, nikde som nepovedal ziadne "urcite robis nieco zle". len som vyjadril ze ano, neviem si predstavit na co to potrebujes. lebo ako si sam povedal, nie uplne standardny ucel. a aj keby ano, tak tym ze ja si neviem predstavit som povedal daco o sebe. takze klud.
inak vdaka za odpoved, zaujimavy side-project, a keby si ten kontext vysvetlil rovno s otazkou, tak by som napriklad vedel ze akakolvek snaha poradit odo mna bude strata casu lebo toto silno nad moje schopnosti.
Roleta je špeciálny inkognito mód, ktorým skryješ obsah obrazovky pred samým sebou, alebo inou osobou v tvojej izbe (napr. mama). Roletu odroluješ tak, že na ňu klikneš.
11 komentov
1. Co pouzit ked chcem niekam dosadit hociaky typ. Viem ze C++ nema spolocneho predka pre vsetky typy tak ako napriklad C# (System.Object), ale existuje k tomu nejaka alternativa? cim sa to zvykne nahradit? Ak si odmyslime parametricky polymorfizmus a genericke parametre. Pointerom na void? Ci existuje aj nieco sofistikovanejsie.
2. potrebujem typovu reprezentacia hociakej funkcie s hociakym poctom parametrov hociakeho typu a s navratovou hodnotou hociakehop typu. Napr:
void wrapper(TYPOVA_REPREZENTACIA_VSETKYCH_FUNKCII funkcia) {
...
}
TYPOVA_REPREZENTACIA_VSETKYCH_FUNKCII = ???
Teda ked niekde zadam nazov toho typu ktory reprezentuje vsetky funkcie tak tam mozem dosadit hocico co sa da zavolat (funkciu, proceduru, metodu atd). Napr v JS je to predok vsetkych funkcii typ Function. Viem ze C++ nema objektovu hierarchiu (ak si ju sam nevytvorim) takze funkcie nemaju spolocneho predka, ale myslim ze by malo existovat nieco cim sa to da nahradit.
3. ako zistim pocet parametrov funkcie? Podla moznosti by som chcel aj variantu v compile-time aj v runtime (aj ked ocakavam ze v runtime sa to asi zistit neda)
@palec223 C++ ma nieco podobne ako generika, vola sa to sablony a funguje to velmi podobne akurat je to viac staticke a da sa s tym robit kopec veci co sa sa s generikami neda. Ale teraz hladam skor nahradu za System.Object proste nieco kam mozem dosadit hodnotu hociakeho typu. V C sa to riesilo pomocou smernikov ale predpokladam ze C++ uz ma na tento ucel nieco elegantnejsie
pastebin.com/Lm7wvM3k
Lenže tá funguje len na obyčajné funkcie, ale už nie na lambdy :/ čo nechápem prečo. Veď lambda je tiež len funkcia.
Tiež si viem zadať typovú definíciu presne pre konkrétnu funkciu s konkrétnym typom parametrov a návratových hodnôt:
pastebin.com/UWNUtg2K
Lenže ja potrebujem niečo univerzálenšie, čo by mi pustilo všetky funckie bezohľadu na počet a typy argumentov alebo návratových hodnôt. Chápeme sa?
1. ano, pointer na void.
2. nie som si isty, ale nieco v zmysle pointer na funkciu ktora vracia pointer na void a ako parameter berie pointer na void?
3. reflexiou (reflection)
k bodu dva: popis mi logiku toho ako chces spustit funkciu ked nepoznas pocet parametrov ktore na spustenie potrebuje. akymkolvek sposobom to skusis obabrat, vrdy nakoniec to co funkciu spusta do nej potrebuje narvat jej parametre, takze to potrebuje vediet ake parametre to su, ci uz formalne syntakticky, alebo cisto neformalne semanticky, aj keby hned vsetky funkcie brali jediny parameter pointer na void, alebo pointer na bit array. vzdy to co tu funkciu spusta aj tak potrebuje vediet co do toho jedneho pola narvat.
v konecnom dosledku su tvoje otazky nieco na co najlepsia reakcia podla mna je "what are you trying to do/solve?", lebo to znie ze si sa zasekol do tuneloveho videnia o jeden krok nespravnym smerom vpred. cize sprav krok naspat a radsej sa spytaj co sa to vlastne snazis vyriesit, nech ti mozno ludia vedia naznacit spravny smer riesenia daneho problemu, ktory nevyzaduje taketo code smells na ake sa pytas.
a k tomu aj navrhujem behové prostredie pre svoj jazyk a potrebujem si nasimlovať napr. curried funkcie v C++ (čo argument to vnorená funkcia), ale zároveň chcem použiť klasické funkcie takže budem musieť urobiť wrapper ktorý mi tú klasickú funkciu obalí a keď ju zavolám s menším počtom argumentov tak mi vráti novú funkciu s predvyplnenými argumentami.
zatiaľ len skúšam ako to pojde. navrhujem prototyp a keď mi niečo z toho bude fungovať (v kombinácii ešte s niečim) a bude to dostatočne efektívne, tak si podľa toho urobím návrh a nakódim to. a ak všetko pojde ako po masle tak prepíšem generátor
inak vdaka za odpoved, zaujimavy side-project, a keby si ten kontext vysvetlil rovno s otazkou, tak by som napriklad vedel ze akakolvek snaha poradit odo mna bude strata casu lebo toto silno nad moje schopnosti.