Czy opłacałoby się dodawać taki feature...

0

Zastanawiam się nad dodaniem do swojego języka konstrukcji w stylu:
(a, b) *= 50;
Oznaczałoby to tyle samo, co:

a *= 50;
b *= 50;

Podobnie jak:
(a, b, c) = func();Rozwijałoby się do:

a = func();
b = func();
c = func();

(tak, trzy osobne wywołania tej samej funkcji)

Pytanie brzmi - czy ten feature ma jakiś sens? Lub w drugą stronę - czy gdyby język, w którym piszecie na co dzień (C++, Java, C# (...)), miał coś podobnego, korzystalibyście z tego?

0

Raczej to działa inaczej. Jako zapis destrukcyjny. Takie coś jak wyżej było by bardzo NIE.

1

Nie opisałeś właściwości języka? Silnie typowany czy słabo? (pewnie silnie bo wspominasz C++ i Java)

z mnożeniem być może jest jeszcze ok! Ale bez wyraźnego żądania aktywacji takiego mechanizmu wolałbym tego uniknąć, by nie natrafić na jakieś problemy w przyszłości.

ale przypisanie jest nie do przyjęcia i zbędne. Co jeśli funkcja zwraca tablicę/krotkę (coś jak python)? Wtedy oczekiwałbym innego zachowania!
Konstrukcja jest zbędna bo standardy języków mają inne rozwiązania, np

a = b = c = func();

Na dodatek te woje oczekiwanie, by się to rozwijało do wielokrotnego wywołania funkcji generującej jest bardzo nieintuicyjne.

Warto podpatrzyć inne języki, np python:

(a, b, c, d) = (func(),)*4

W sumie wersja z mnożeniem ma te same problemy (co gdy funkcja zwraca krotkę?), więc na wszystko NIE.
0
MarekR22 napisał(a)

Nie opisałeś właściwości języka? Silnie typowany czy słabo? (pewnie silnie bo wspominasz C++ i Java)

Tak, silnie typowany.

Konstrukcja jest zbędna bo standardy języków mają inne rozwiązania, np (...)

Tyle że w tym wypadku wywołujesz funkcję raz i przypisujesz ten sam wynik do trzech zmiennych, w (a, b, c) = func(); funkcja func byłaby wywoływana osobno dla każdej z nich.

Na dodatek te woje oczekiwanie, by się to rozwijało do wielokrotnego wywołania funkcji generującej jest bardzo nieintuicyjne.

Tia, jak teraz patrzę na to ponownie, faktycznie mogłoby to wprowadzać wiele niejasności.
No nic, jeden potencjalny feature mniej ;P

3
(a, b) *= 50;

To zależy do czego chcesz prowadzić język.

Odpowiadając na pytanie:

Czy gdyby język, w którym piszesz na co dzień, miał taki feature, korzystałbyś z niego?

Gdyby C# miał taki feature to byłby to WTF, bo kompletnie nie pasowałoby do reszty języka.
Podobnie Java, C++ (chociaż jeśli analogiczny feature wejdzie w C++17 to mnie to nie zdziwi. W C++ mnie już nie zdziwi :P), etc...

Z tego wynika, że jeśli chcesz żeby Twój język był kopią C#/Javy/C++ z inną składnią, to zły pomysł.

Jeśli chcesz zaszaleć z własnymi pomysłami, to zapis (a, b) *= 5 miałby sens jeśli (a, b) byłoby wyrażeniem typu krotka referencji czy coś równie odjechanego:

a = 2
t = (a, 5)
a = 3
t *= 2
print t  # (6, 10)
print a  # 6

Prawdopodobnie taki feature to niezbyt szczęśliwy pomysł, ale można eksperymentować ;)

W przeciwnym wypadku (a, b) *= 50; jako syntax sugar na dwa mnożenia wypada trochę blado.

<dygresja> Z trzeciej strony, są języki w których coś podobnego da się złożyć, a nie jest to standardowe podejście. POC: ```cpp #include <iostream> using namespace std; // <- sensowne podejście do designowania takiej klasy, ale wyszłoby pewnie duużo więcej kodu // template<typename... params="Params"> // class ref_tuple { // ref_tuple(Params... params) { // } // }

// <- a tutaj po prostu krótki hack żeby przykład zadziałał (nie żeby to był dobry pomysł)
class ref_tuple {
int *a, *b;

public:
ref_tuple(int &a, int &b) {
    this->a = &a;
    this->b = &b;
}

void operator*=(int n) {
    *a *= n; *b *= n;
}

};

int main() {
int a = 2, b = 3;
ref_tuple(a, b) *= 2;
cout << a << b << endl;
}


</dygresja>

Za to dla:
`(a, b, c) = func();`
jako (a = func(), b = func(), c = func()) nie potrafię znaleźć sensownego uzasadnienia :P. (Sensowne by było np. func() zwraca trzy elementy/listę/wektor, a, b, c = wynik func())
0

Jestem na nie. Natomiast rozpakowywanie krotki zwracanej przez funkcję w taki sposób bardzo by mi się np. w C# podobał.

0
Patryk27 napisał(a):

Zastanawiam się nad dodaniem do swojego języka konstrukcji w stylu:
(a, b) *= 50;
Oznaczałoby to tyle samo, co:

a *= 50;
b *= 50;

Podobnie jak:
(a, b, c) = func();Rozwijałoby się do:

a = func();
b = func();
c = func();

(tak, trzy osobne wywołania tej samej funkcji)

Pytanie brzmi - czy ten feature ma jakiś sens? Lub w drugą stronę - czy gdyby język, w którym piszecie na co dzień (C++, Java, C# (...)), miał coś podobnego, korzystalibyście z tego?

Czy ma sens? Nie wiem, nie używam. Choć C# chyba od samego początku ma taki ficzer:

        private int kwadrat(int liczba)
        {
            return liczba * liczba;
        }
        private void button1_Click(object sender, EventArgs e)
        {
            int x, y;
            x = 2;
            x = y = kwadrat(4);
        }
0

Głosuję na nie, bo i w tej chwili bardzo rzadko korzystam z konstrukcji typu a = b = c = 5;

0

W R jest coś podobnego:

R version 3.0.2 (2013-09-25) -- "Frisbee Sailing"
Copyright (C) 2013 The R Foundation for Statistical Computing
Platform: x86_64-pc-linux-gnu (64-bit)

> c(1,2,3)
[1] 1 2 3
> c(1,2,3) * 50
[1] 50 100 150

1 użytkowników online, w tym zalogowanych: 0, gości: 1