OOP a pravidla pro konstruktor

Onestone

Re:OOP a pravidla pro konstruktor
« Odpověď #105 kdy: 07. 06. 2018, 01:13:33 »
Motate to oba. Lambda vyraz a uzaver jsou dva odlisne, vzajemne ortogonalni pojmy.

Na LISPu nebo podobnych jazycich to jde videt mnohem lip.

Lambda vyraz je vyraz, jenz se vyhodnoti na funkci. Tecka.

Kód: [Vybrat]
(lambda (x) (* x x)) -> funkce jednoho paremetru pocitajici druhou mocninu.
Vsimnete si, ze zadny uzaver nevznikl, protoze telo lambda-vyrazu neobsahuje volne promenne.

Kód: [Vybrat]
(let ((y 10))
   (lambda (x) (* x y)))

V tomto pripade je vracena funkce jednoho parametru (vracejici nasobek desiti) a v tomto pripade se jedna o uzaver, protoze symbol "y" je v lexikalne nadrazenem prostredi.

Na druhou stranu, aby vznikl uzaver, neni potreba lambda vyrazu:

Kód: [Vybrat]
def a():
    y = 10
    def b(x):
        return x * y
    return b

a()(20) ==> 200
"Krásné" nepochopení toho, co je lambda-výraz...


BoneFlute

  • *****
  • 1 981
    • Zobrazit profil
Re:OOP a pravidla pro konstruktor
« Odpověď #106 kdy: 07. 06. 2018, 01:43:03 »
Kód: [Vybrat]
(lambda (x) (* x x)) -> funkce jednoho paremetru pocitajici druhou mocninu.
Vsimnete si, ze zadny uzaver nevznikl, protoze telo lambda-vyrazu neobsahuje volne promenne.

Jen pro pořádek, co myslíš, že to * je zač? Proměnná (v lispu se říká přesněji symbol). Takže jako příklad poněkud nešťastné.

Onestone

Re:OOP a pravidla pro konstruktor
« Odpověď #107 kdy: 07. 06. 2018, 01:50:56 »
Kód: [Vybrat]
(lambda (x) (* x x)) -> funkce jednoho paremetru pocitajici druhou mocninu.
Vsimnete si, ze zadny uzaver nevznikl, protoze telo lambda-vyrazu neobsahuje volne promenne.

Jen pro pořádek, co myslíš, že to * je zač? Proměnná (v lispu se říká přesněji symbol). Takže jako příklad poněkud nešťastné.
Za chvíli ti tu někdo vysvětlí, že v FP proměnné nejsou (což je sice blbost, ale někteří to omílají furt dokola). Jinak to * nemá vůbec žádný vliv na uzávěrovost, ale to už zacházíme k příliš pokročilým aspektům (v kontextu roota), tak se děti přestaňte hádat.

BoneFlute

  • *****
  • 1 981
    • Zobrazit profil
Re:OOP a pravidla pro konstruktor
« Odpověď #108 kdy: 07. 06. 2018, 01:52:35 »
Za chvíli ti tu někdo vysvětlí, že v FP proměnné nejsou (což je sice blbost, ale někteří to omílají furt dokola). Jinak to * nemá vůbec žádný vliv na uzávěrovost, ale to už zacházíme k příliš pokročilým aspektům (v kontextu roota), tak se děti přestaňte hádat.

Máš pocit, že se tě někdo na něco ptal?

Onestone

Re:OOP a pravidla pro konstruktor
« Odpověď #109 kdy: 07. 06. 2018, 02:00:29 »
Za chvíli ti tu někdo vysvětlí, že v FP proměnné nejsou (což je sice blbost, ale někteří to omílají furt dokola). Jinak to * nemá vůbec žádný vliv na uzávěrovost, ale to už zacházíme k příliš pokročilým aspektům (v kontextu roota), tak se děti přestaňte hádat.
Máš pocit, že se tě někdo na něco ptal?
Nejen že to píše bláboly, ani se to neumí slušně chovat...


BoneFlute

  • *****
  • 1 981
    • Zobrazit profil
Re:OOP a pravidla pro konstruktor
« Odpověď #110 kdy: 07. 06. 2018, 02:03:57 »
bot("Onestone") Off ?

Hele nevíte někdo prosím, jak se ti boti vypínají?

ded.kenedy

Re:OOP a pravidla pro konstruktor
« Odpověď #111 kdy: 07. 06. 2018, 02:10:19 »
Citace
"Krásné" nepochopení toho, co je lambda-výraz...

A neco k tematu by nebylo?

Citace
Jen pro pořádek, co myslíš, že to * je zač? Proměnná (v lispu se říká přesněji symbol). Takže jako příklad poněkud nešťastné.

Tak si tam dosad treba:

Kód: [Vybrat]
(lambda (f g x) (f (g x))
Ano, bude to presnejsi, ale prinos pro porozumeni bude vyrazne mensi.

Ale vlastne to neni podstatou diskuzi na rootu, nekomu neco vysvetlit, aby to pochopil. Dulezite je pohonit ego.

BoneFlute

  • *****
  • 1 981
    • Zobrazit profil
Re:OOP a pravidla pro konstruktor
« Odpověď #112 kdy: 07. 06. 2018, 02:18:06 »
Citace
Jen pro pořádek, co myslíš, že to * je zač? Proměnná (v lispu se říká přesněji symbol). Takže jako příklad poněkud nešťastné.

Tak si tam dosad treba:

Kód: [Vybrat]
(lambda (f g x) (f (g x))
Ano, bude to presnejsi, ale prinos pro porozumeni bude vyrazne mensi.

Nedalo by se říct, že lambda je ta anonymní funkce, a uzávěr je celej ten kontext kolem ní, který si musí táhnout sebou, aby tam byly ty navázaný proměnný se správnou hodnotou? Plus pak je tam ještě ta sranda s tím, že ve většině jazycích se zafixovávaj, v některých (CLisp) ne (tuším, že se tomu snad říká dynamic scoping).

BoneFlute

  • *****
  • 1 981
    • Zobrazit profil
Re:OOP a pravidla pro konstruktor
« Odpověď #113 kdy: 07. 06. 2018, 02:19:55 »
Ano, bude to presnejsi, ale prinos pro porozumeni bude vyrazne mensi.

Mě by ten tvůj původní příklad zmátl :-)

ded.kenedy

Re:OOP a pravidla pro konstruktor
« Odpověď #114 kdy: 07. 06. 2018, 02:34:03 »
Citace
Nedalo by se říct, že lambda je ta anonymní funkce,

Asi dalo, ale muze to byt matouci. Radsi pouzivam pojem "lambda-vyraz", coz je vyraz, ktery se vyhodnoti na funkci. Tu muzes zavolat a pracovat s ni jako s jakoukoliv jinou funkci neho hodnotou. (Odpada tam problem s tim, jestli tou anonymni funkci je jeji deklarace nebo vysledna hodnota.)

Citace
uzávěr je celej ten kontext kolem ní, který si musí táhnout sebou

Uzaver je ta funkce + odkaz na lexikalne nadrazene prostredi. Kam se funkce diva na hodnoty volnych promennych (symbolu), kdyz je zavolana (vyhodnocena).

Citace
Plus pak je tam ještě ta sranda s tím, že ve většině jazycích se zafixovávaj

To dela JVM jako optimalizaci. U uzaveru nedrzi odkaz na nadrazene prostredi, ale vsechny pouzite hodnoty nakopiruje do uzaveru. LISPy to nedelaji a je s tim vetsi sranda.

Citace
(tuším, že se tomu snad říká dynamic scoping)

To je neco uplne jineho.

BoneFlute

  • *****
  • 1 981
    • Zobrazit profil
Re:OOP a pravidla pro konstruktor
« Odpověď #115 kdy: 07. 06. 2018, 03:26:44 »
Citace
Nedalo by se říct, že lambda je ta anonymní funkce,

Asi dalo, ale muze to byt matouci. Radsi pouzivam pojem "lambda-vyraz", coz je vyraz, ktery se vyhodnoti na funkci. Tu muzes zavolat a pracovat s ni jako s jakoukoliv jinou funkci neho hodnotou. (Odpada tam problem s tim, jestli tou anonymni funkci je jeji deklarace nebo vysledna hodnota.)

Citace
uzávěr je celej ten kontext kolem ní, který si musí táhnout sebou

Uzaver je ta funkce + odkaz na lexikalne nadrazene prostredi. Kam se funkce diva na hodnoty volnych promennych (symbolu), kdyz je zavolana (vyhodnocena).

Citace
Plus pak je tam ještě ta sranda s tím, že ve většině jazycích se zafixovávaj

To dela JVM jako optimalizaci. U uzaveru nedrzi odkaz na nadrazene prostredi, ale vsechny pouzite hodnoty nakopiruje do uzaveru. LISPy to nedelaji a je s tim vetsi sranda.

Takže jak jsem to psal.

Citace
(tuším, že se tomu snad říká dynamic scoping)

To je neco uplne jineho.
Dynamický versus lexikální rozsah platnosti tomu říkaj.

SB

Re:OOP a pravidla pro konstruktor
« Odpověď #116 kdy: 08. 06. 2018, 08:21:12 »
Lamba je samostatným, bezestavovým předpisem. Uzávěra je předpisem, který obsahuje závislosti na svém kontextu, tudíž stavová.
To je ale blbost, z držení kontextu neplyne stavovost. Navíc libovolný uzávěr (sic!) jde emulovat prostým lambda výrazem.

Obecně ano, protože nemůžete zajistit neměnnost prostředí/kontextu.
Tu emulaci mi ukažte, to mě zajímá.

SB

Re:OOP a pravidla pro konstruktor
« Odpověď #117 kdy: 08. 06. 2018, 08:25:42 »
Motate to oba. Lambda vyraz a uzaver jsou dva odlisne, vzajemne ortogonalni pojmy.

Na LISPu nebo podobnych jazycich to jde videt mnohem lip.

Lambda vyraz je vyraz, jenz se vyhodnoti na funkci. Tecka.

Kód: [Vybrat]
(lambda (x) (* x x)) -> funkce jednoho paremetru pocitajici druhou mocninu.
Vsimnete si, ze zadny uzaver nevznikl, protoze telo lambda-vyrazu neobsahuje volne promenne.

Kód: [Vybrat]
(let ((y 10))
   (lambda (x) (* x y)))

V tomto pripade je vracena funkce jednoho parametru (vracejici nasobek desiti) a v tomto pripade se jedna o uzaver, protoze symbol "y" je v lexikalne nadrazenem prostredi.

Na druhou stranu, aby vznikl uzaver, neni potreba lambda vyrazu:

Kód: [Vybrat]
def a():
    y = 10
    def b(x):
        return x * y
    return b

a()(20) ==> 200

Dědo Kenedy, kurva, v podstatě to samé jsem napsal. A jestli říkáte uzávěra i definicím funkce, tak to už jde mimo mě. Tento kus diskuse tu řeším proto, protože se to všude hemží uzávěrama, ale všichni tomu říkají lambdy, aniž by věděli, co to je a že nejsou.

Onestone

Re:OOP a pravidla pro konstruktor
« Odpověď #118 kdy: 08. 06. 2018, 09:42:15 »
Lamba je samostatným, bezestavovým předpisem. Uzávěra je předpisem, který obsahuje závislosti na svém kontextu, tudíž stavová.
z držení kontextu neplyne stavovost. Navíc libovolný uzávěr (sic!) jde emulovat prostým lambda výrazem.
Obecně ano, protože nemůžete zajistit neměnnost prostředí/kontextu.
To nesouvisí s uzávěry, funkce (lambda) bez kontextu si taky může držet stav.

Onestone

Re:OOP a pravidla pro konstruktor
« Odpověď #119 kdy: 08. 06. 2018, 09:53:03 »
Lamba je samostatným, bezestavovým předpisem. Uzávěra je předpisem, který obsahuje závislosti na svém kontextu, tudíž stavová.
To je ale blbost, z držení kontextu neplyne stavovost. Navíc libovolný uzávěr (sic!) jde emulovat prostým lambda výrazem.
Tu emulaci mi ukažte, to mě zajímá.
Tzv. uzávěry jsou syntaktická záležitost (vztahují se k lexikálnímu kontextu). Uzávěr je (teoreticky, ale často i implementačně, od Lispu po Javu) uzavřený výraz (λ), kde tzv. kontext (lexikální) je reprezentován vázanými proměnnými s aplikací v době překladu, kdežto “parametry” se aplikují za běhu. Zní to složité, ale je to triviální - názorně to je vidět třeba ve zdrojáku JVM. V jazycích, kde se nerozlišuje mezi dobou překladu a běhu, se ten rozdíl stírá.