Autor Wątek: Format string  (Przeczytany 5311 razy)

Offline Krzysiek K.

  • Redaktor
    • DevKK.net

# Maj 13, 2015, 13:19:44
Cytuj
@Krzysiek K. - Desperacja.
Rozumiem, że pijesz do "refleksji". Cóż - potrzeba matką wynalazku. Zwłaszcza że rozwiązanie działa perfekcyjnie. :)
"Twój template tego nie potrafi!" ;)

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Xender

  • Użytkownik

# Maj 13, 2015, 14:10:32
@Krzysiek K. - Czemu templatki miałyby tego nie potrafić?
Poza zestringizowaniem ciała struktury, oczywiście.

Rozumiem, że cały mechanizm opiera się na parsowaniu deklaracji i obliczaniu offsetów kolejnych pól?

Offline Krzysiek K.

  • Redaktor
    • DevKK.net

  • +2
# Maj 13, 2015, 14:40:35
Cytuj
@Krzysiek K. - Czemu templatki miałyby tego nie potrafić?
Poza zestringizowaniem ciała struktury, oczywiście.
Jakiś przykład? Chodzi mi o wydobycie offset+typ+nazwa każdego pola struktury.

Cytuj
Rozumiem, że cały mechanizm opiera się na parsowaniu deklaracji i obliczaniu offsetów kolejnych pól?
Oczywiście. :)

Offline Xender

  • Użytkownik

# Maj 13, 2015, 16:29:30
Jakiś przykład? Chodzi mi o wydobycie offset+typ+nazwa każdego pola struktury.
Tak samo - z zestringowanej preprocesorem definicji.
Parsowanie na templatkach wymagałoby trochę gimnastyki, albo użycia constexpr (raczej w wariancie z C++14, wtedy wyglądałoby to pewnie całkiem podobnie do Twojego rozwiązania, tylko, że można by resolvować pola także w compile-time, np. z format stringa).

Można by też kombinować w drugą stronę, żeby z pomocą makr C definiować strukturę w takim stylu:
STRUCT( Foo,
    int, a,
    int, b,
    int, c
);
I generować z tego jednocześnie definicję struktury i metadane (w postaci konkretyzacji templatki, jeśli chcemy mieć do nich dostęp w czasie kompilacji).

Natomiast ani to łatwe/czytelne w implementacji, ani ładne w użyciu.

Offline Krzysiek K.

  • Redaktor
    • DevKK.net

# Maj 14, 2015, 20:54:48
Cytuj
Tak samo - z zestringowanej preprocesorem definicji.
No właśnie - czyli niekoszernie, bo już są tekstowe makra, a nie same templatki. :)

Offline Xender

  • Użytkownik

# Maj 14, 2015, 21:32:40
No samymi templatkami to się AFAIK fizycznie nie da. ;)

Offline ArekBal

  • Użytkownik

# Maj 15, 2015, 03:11:13
Tak na dziś, to imho łatwiej, czytelniej wytranspilować .hpp z jakiegoś .meta.hpp or "whatever". Poupychać meta w komentarze i przetwarzać do konkretnego nagłówka(zrobisz więcej niż makrami, a także wydajniej niż templatkami). Żadnego c++ wtedy parsować nie trzeba. A żyjemy w świecie build toolsów więc nie powinno to też kłopotów organizacyjnych sprawiać.

Temat wraca niczym bumerang.

Offline Krzysiek K.

  • Redaktor
    • DevKK.net

# Maj 15, 2015, 10:48:48
Cytuj
A żyjemy w świecie build toolsów więc nie powinno to też kłopotów organizacyjnych sprawiać.
Wiesz, jeśli twój framework kompiluje się w różnych wersjach na czterech toolchainach, to nie jest to takie hop siup. :)

Offline timus

  • Użytkownik

# Maj 15, 2015, 15:31:51
Z ciekawości przyjrzałem się językowi swift(ten od jabłka) i tam jest ciekawy sposób na stringi. W dowolnym stringu można napisać \(wyrazenie) np. let a = 23
println("var 2*a: \(2*a)")
Choć w sumie nie wiem czy można to nazwać formatowanie, apple to nazywa interpolacjom stringa.

Offline Xender

  • Użytkownik

# Maj 15, 2015, 16:49:42
@timus - Tak, interpolacja, podobna jest w Perlu, shellu czy PHP.

BTW, https://gradha.github.io/articles/2014/11/swift-string-interpolation-with-nimrod-macros.html :)

Offline ArekBal

  • Użytkownik

  • +1
# Maj 15, 2015, 22:10:19
Tak na wszelki wypadek, taka dygresja - nie sugeruje, że timus to taki przypadek - chciałbym zwrócić uwagę że gdy ludzie uczą się jakiegoś "nowego" języka/frameworka mają skłonność do myślenia że to najlepszy/najnowszy/jedyny język/framework na świecie i featury w nim są najdoskonalsze i nieważne czy będzie to ruby, java, c#, c++, python, c, es czy chociażby unity, unreal, angular... zawsze taka sama ślepota. Ludzie często nie widzą, nie pamiętają, nie chcą pamiętać skąd coś się wzięło.

http://en.wikipedia.org/wiki/String_interpolation

btw.
http://lambda-the-ultimate.org/

Offline Xender

  • Użytkownik

# Maj 15, 2015, 23:13:48
chciałbym zwrócić uwagę że gdy ludzie uczą się jakiegoś "nowego" języka/frameworka mają skłonność do myślenia że to najlepszy/najnowszy/jedyny język/framework na świecie i featury w nim są najdoskonalsze i nieważne czy będzie to ruby, java, c#, c++, python, c, es czy chociażby unity, unreal, angular... zawsze taka sama ślepota. Ludzie często nie widzą, nie pamiętają, nie chcą pamiętać skąd coś się wzięło.
Z drugiej strony, przecież nikt nie zna wszystkich języków programowania i ich historii, więc gdy natyka się na coś po raz pierwszy, nic dziwnego, że mówi, że to feature z jego ulubionego/nowego języka/frameworka.

Sam się na to naciąłem, poznając feature'y Zsh i nie wiedząc, że niektóre wcale nie są czymś nowym i rewolucyjnym, bo "ten zwykły" Bash - a czasem nawet POSIX-owy stadard - ma takie same (oczywiście nie tyczy się to wszystkiego, Zsh ma dużo miłych rzeczy, których próżno szukać w Bashu/standardzie POSIX sh).

Można być poirytowanym, że ktoś nie zna "klasyki", ale IMO to bez sensu.
Ślepotą jest to dopiero wtedy, gdy nie przyjmie się wyjaśnienia, że dany feature pochodzi skądś indziej.

Offline Xion

  • Moderator
    • xion.log

  • +2
# Maj 17, 2015, 00:58:57
Cytuj
Można być poirytowanym, że ktoś nie zna "klasyki", ale IMO to bez sensu.
Ślepotą jest to dopiero wtedy, gdy nie przyjmie się wyjaśnienia, że dany feature pochodzi skądś indziej.
Wyjątek: Lisp. Wszyscy wiedzą, że 90% feature'ów języków programowania pochodzi z jakiegoś Lispa, ale przypominanie o tym zasadniczo nie czyni nigdy nikogo mądrzejszym :)

Offline Xender

  • Użytkownik

# Maj 17, 2015, 10:32:59
^ A kto tu mówił, że wspominamie o czymkolwiek uczyni kogokolwiek mądrzejszym? :P

Offline Satirev

  • Użytkownik

# Maj 17, 2015, 18:43:02
Testuję od jakiegoś czasu cppformat i jak na razie nie narzekam.