Na co všechno je dobrý LISP?

Viky

Re: Na co všechno je dobrý LISP?
« Odpověď #135 kdy: 30. 03. 2011, 19:50:38 »
když už ostatním nadáváte, že jsou cvičené opice, tak byste aspoň mohli umět dokázat svoje silná tvrzení o svém miláčkovi...

Jo aha, tak odsud pramení celé to nepochopení. :D Tak to rád vysvětlím.
Nikdo netvrdil, že ti, co neprogramují v Lispu, jsou cvičené opice. Za cvičenou opici jsem označil člověka, který není schopen dohlédnout ani mimo rámec vývojového nástroje, na nějž je zvyklý. Prostě jako by se někdo dotázal na možnosti použití elektromotoru a kdosi se zapojil do debaty stylem "Nejdůležitější je - kolik to má válců? A jaký mají obsah? Leje se tam benzin nebo nafta? Co se k tomu dělá za turba? Protože tohle jsou přece věci, které každého experta na pohony zajímají především."
A někdo jiný by si poznámku míněnou tak, že takto se může ptát jen cvičená opice, vztáhl na sebe a začal oponovat, v čem že je ten elektromotor tak úžasný, když spalovací motor se taky točí, a proč se u něj tolik poukazuje na tu elektřinu, když jeho diesel ji potřebuje akorát na roztočení - a i to by se dalo obejít jinak, takže ta elektřina je celkem zbytečná věc... I na pohled že to vypadá divně - nemá to hlavu, ani klikovou hřídel, ani ventilový rozvod, jen nějaké pro člověka nepřehledné vinutí ve statoru a rotor...


Re: Na co všechno je dobrý LISP?
« Odpověď #136 kdy: 30. 03. 2011, 19:58:12 »
Nikdo netvrdil, že ti, co neprogramují v Lispu, jsou cvičené opice. Za cvičenou opici jsem označil člověka, který není schopen dohlédnout ani mimo rámec vývojového nástroje, na nějž je zvyklý. Prostě jako by se někdo dotázal na možnosti použití elektromotoru a kdosi se zapojil do debaty stylem "Nejdůležitější je - kolik to má válců? A jaký mají obsah? Leje se tam benzin nebo nafta? Co se k tomu dělá za turba? Protože tohle jsou přece věci, které každého experta na pohony zajímají především."

To ale není pravda. O cvičených opicích jsi začal mluvit po tom, co se blizzboz opovážil zeptat, jestli pro Lisp existují taky nějaké pořádné knihovny, frameworky a RAD nástroje - tj. jestli se dá skutečně v lispu něco velkého a praktického vytvořit, nebo si jen na rootu honit triko, že nikdo jiný nemá nářadí kterým se dá vytvořit nářadí.

Kdokoli si to může přečíst: http://forum.root.cz/index.php?topic=1978.msg15063#msg15063

koroptev

Re: Na co všechno je dobrý LISP?
« Odpověď #137 kdy: 30. 03. 2011, 20:14:38 »
Kdyz uz se tu tak probiraji ty nekonecne moznosti Lispu, jakym zpusobem v nem lze programovat ciste funkcionalne (pokud zrovna urcitou cast kodu timto zpusobem programovat chci, nic dogmatickeho), jestlize tail rekurkze neni standardem vyzadovana? V Land of Lisp se tomu elegantne vyhli tvrzenim, ze ta a ta implementace (ci vetsina nebo jak to formulovali) to stejne podporuje.

koroptev

Re: Na co všechno je dobrý LISP?
« Odpověď #138 kdy: 30. 03. 2011, 20:16:00 »
Pozn.: mluvim o Common Lispu

Inkvizitor

Re: Na co všechno je dobrý LISP?
« Odpověď #139 kdy: 30. 03. 2011, 20:23:15 »
Pak uvidíme, k čemu jsme došli.

Vsadím boty, že bysme došli k tomu, že lispaři budou tvrdit, že jejich kód je sice stejně rychlý a stejně dlouhý, ale že je elegantnější. Takové zjištění mi teda za tu námahu nestojí.

Však Tě nikdo nenutí, ikdyž je pravda, že jsem předpokládal, že bys zájem mít mohl. Schválně jsem ale psal o rozumné velikosti, protože několik dnů nechci a ani nemohu nad problémem strávit ani já. Podle mě je každopádně škoda, že diskuse zatím probíhá dost nasucho. Stejně jako Tebe mě nebaví číst vznešené řeči a alegorie, jsem technokrat a mám zájem o inženýrskou debatu. Tam samozřejmě patří metriky, příklady nástrojů, knihovny atd., ale bez nějakého umělého příkladu se asi neobejdeme. Já jsem například kdysi psal prográmky pro Project Euler a tam jednoznačně nejzajímavější řešení (když člověk správně vyřeší, má přístup do sekce fóra, kam lidé posílají svoje řešení). Z mého hlediska patřila k nejzajímavějším a rozhodně nejkratším řešením řešení z kategorie jazyků APL/J/K. Neznamená to, že bych od příštího týdne přešel z Pythonu nebo Scaly na J, ale o něčem to vypovídá. Takhle nemáme v ruce prakticky nic.


Inkvizitor

Re: Na co všechno je dobrý LISP?
« Odpověď #140 kdy: 30. 03. 2011, 20:35:00 »
Kdyz uz se tu tak probiraji ty nekonecne moznosti Lispu, jakym zpusobem v nem lze programovat ciste funkcionalne (pokud zrovna urcitou cast kodu timto zpusobem programovat chci, nic dogmatickeho), jestlize tail rekurkze neni standardem vyzadovana? V Land of Lisp se tomu elegantne vyhli tvrzenim, ze ta a ta implementace (ci vetsina nebo jak to formulovali) to stejne podporuje.

Dobrý dotaz. Lisp není Haskell, kde je čistota dané funkce prakticky dána v deklaraci (System.IO.Unsafe stranou), nicméně jeho povaha je IMO poměrně dost hybridní. Spoustu věcí lze nicméně vyřešit například pomocí foldu (reduce) a neoptimalizované rekurzi nebo cyklu se tak vyhnout.

Re: Na co všechno je dobrý LISP?
« Odpověď #141 kdy: 30. 03. 2011, 20:39:23 »
Stejně jako Tebe mě nebaví číst vznešené řeči a alegorie, jsem technokrat a mám zájem o inženýrskou debatu. Tam samozřejmě patří metriky, příklady nástrojů, knihovny atd., ale bez nějakého umělého příkladu se asi neobejdeme.

K technické debatě* tady ale samozřejmě nikdy nemůže dojít z jednoduchého důvodu: všichni dobře víme, že i kdyby nakrásně lisp měl nějaké geniální vlastnosti (jakože já netvrdím, že nemá! Jen mě o tom tady nikdo neumí nebo nechce přesvědčit), tak tím třeba oproti jiným jazykům deset bodů získá, ale jiných dvěstě ztratí na tom, že nejsou knihovny, nejsou programátoři, není provázanost s komerčními produkty, atd.

A za druhé ta debata tak, jak jsi ji postavil, je nesmyslná - nemá cenu porovnávat dva jazyky bez jejich standardních knihoven - vždyť ty knihovny přece tvoří velkou část přínosnosti toho kterého jazyka...

A za třetí ta debata nemá smysl, protože každá cvičená opice ví, že co do tvrdých kritétií jsou všechny jazyky stejné, protože se v nich dá napsat ten stejný algoritmus - a potom už jenom měříme schopnost překladače optimalizovat... Takže bysme stejně jen skončili u bezobsažné debaty o tom, co je elgantní a co ne.

......

* tj. takové, jakou bych si představoval ve firmě, když někdo přijde s nápadem, že by se mělo přejít na Lisp.

Inkvizitor

Re: Na co všechno je dobrý LISP?
« Odpověď #142 kdy: 30. 03. 2011, 20:41:40 »
Ovsem existuji zkratka pripady, ktere napisete v Lispu na 5 radku a v Pythonu na mnohem vic, protoze v Lispu muzete definovat makra. Proste, Lispova makra umoznuji ten kod zkratit vic nez o konstantu.

Tohle bych prosil vysvětlit. "Víc než o konstantu" podle mě zkracují kód i poměrně standardní funkce vyšších řádů (jejichž obdobu podporuje koneckonců i C) nebo hloupé GOSUB. Co znamená zkrácení o konstantu a kdy jde o asymptoticky lepší optimalizaci?

deda.jabko

Re: Na co všechno je dobrý LISP?
« Odpověď #143 kdy: 30. 03. 2011, 20:45:34 »
Citace
Nemůžete přece chtít, aby se v nějakém jazyce implementovaly obraty s něčím, co daný jazyk v takové podobě vůbec nemá.

a v tom bude asi jadro pudla. silne mi to tady zacina zavadet podobenstvi o jeskyni....

tak si zkusime nejaky prakticky priklad... co treba line vyhodnocovani, kod je ve schemu, ale to je jedno.

vytvorme si novy typ hodnot, tzv. prislib. do teto hodnoty si ,,schovame'' nejaky vyraz a vyhodnotime ho az kdyz bude opravdu potreba. nadefinujeme si teda macro:

Kód: [Vybrat]
(define-macro (delay x) `(lambda () x)),

ktere zajisti, ze na miste v kodu kde se vyskytlo (delay foo), bude tento vyraz nahrazeny (lambda () foo), coz neni nic jineho nez anonymni funkce majici v sobe jako telo foo. jako foo, muze byt jakykoliv vyraz, ktery se pri deklaraci nevyhodnocuje! takze jde pouzit treba (delay (if (< x 1) (/ x 0) (+ x 2))). Pokud si chceme hodnotu vyrazu vyzvednout, tak si nadefinujeme funkci

Kód: [Vybrat]
(define (force promise) (promise))
Ktera dany prislib vyhodnoti. Jinymi slovy, nami vytvoreny prislib je ve skutecnosti anonymni funkce a funkce force, tuto funkci zavola a my ziskame hodnotu vyrazu. Toto uz zvladne malo ktery jazyk, ale slo by to resit evalem, ktery je v tomto pripade vyrazne pomalejsi a neohrabanejsi.

Pojdme dal, co kdyz chceme, aby se hodnota prislibu vypocitala jen jednou, nekam ulozila a pri kazdem zavolani force se vzala jenom ta ulozena hodnota?

Muzeme pro to pouzit nasledujici makro:
Kód: [Vybrat]
(define-macro (delay expr)
              `(let ((initialized #f)
                     (value #f))
                 (lambda ()
                   (if initialized value
                     (begin
                       (set! initialized #t)
                       (set! value ,expr)
                       value)))))

Kdekoliv, kde se makro vyskytne, se vlozi kod ve tvaru:

Kód: [Vybrat]
(let ((initialized #f)
        (value #f))
               (lambda ()
                   (if initialized value
                     (begin
                       (set! initialized #t)
                       (set! value expr)
                       value))))

Coz udelato, ze se vytvori lexikalni prostredi obsahujici dve hodnoty (initialized a value), tento kod vrati anonymni funkci, ktera jedina muze k temto dvema hodnotam pristupovat. Zavolame-li tuto funkci, provede se overeni, jestli je tato funkce volana poprve. Pokud ano, vypocte se hodnota prislibeneho vyrazu a ulozi se do value. Pri kazdem dalsim volani je vracena jiz vypocitana hodnota.


Inkvizitor

Re: Na co všechno je dobrý LISP?
« Odpověď #144 kdy: 30. 03. 2011, 20:51:42 »
A za třetí ta debata nemá smysl, protože každá cvičená opice ví, že co do tvrdých kritétií jsou všechny jazyky stejné, protože se v nich dá napsat ten stejný algoritmus - a potom už jenom měříme schopnost překladače optimalizovat... Takže bysme stejně jen skončili u bezobsažné debaty o tom, co je elgantní a co ne.

No to bych tedy netvrdil. Na jedné straně stojí optimalizační schopnosti kompilátorů, na druhé straně schopnost běžného programátora napsat složitou aplikaci v daném jazyce v rozumném čase a kvalitě (měřeno chybovostí). Mezi strojovým kódem a třeba Javou je přece obrovská propast a tu netvoří jenom dostupné knihovny.

Ondřej

Re: Na co všechno je dobrý LISP?
« Odpověď #145 kdy: 30. 03. 2011, 20:52:49 »
@deda.jabko: Vítám dalšího studenta UPOLu :-)

Re: Na co všechno je dobrý LISP?
« Odpověď #146 kdy: 30. 03. 2011, 20:58:49 »
Citace
Nemůžete přece chtít, aby se v nějakém jazyce implementovaly obraty s něčím, co daný jazyk v takové podobě vůbec nemá.

a v tom bude asi jadro pudla. silne mi to tady zacina zavadet podobenstvi o jeskyni....

Tak nějak. Reaguješ na příspěvek, ve kterém říkám, že nemá smysl se snažit jeden typ ŘEŠENÍ přenést z jednoho jazyka do druhého* a přesně tohle uděláš...

Jediné, co má smysl, je vzít PROBLÉM a jeho řešení napsat ve dvou různých jazycích takovými prostředky, které jsou v tom kterém jazyce pro řešení problému optimální.

Takže jestli máš potřebu tím příkladem něco ilustrovat, tak přijď s nějakým PROBLÉMEM, který se pomocí tohodle obratu dá vyřešit, zatímco v jiném jazyce by se dal řešit jenom daleko kostrbatěji. Promiň, ale já si takhle z hlavy opravdu neumím představit problém, který by se vyžadoval (!) použít zrovna tohle a nic "normálnějšího".

* což je obzvláště pikantní jestliže součástí řešení je použití obratu, který ve druhém jazyku jednoduše v takové formě není...

janek

Re: Na co všechno je dobrý LISP?
« Odpověď #147 kdy: 30. 03. 2011, 21:06:21 »
Koukám, že už se to tady zvrhlo na úroveň "kdo ho má většího"  :) Není nad to zabít pár dní a pár kilobajtů diskového prostoru nad takovými debatami. Doporučuju přenést diskuzi do nějaké restaurace a po pár půllitrech piva se případné nepřekonatelné neshody snadno vyřeší rychlou pěstní cestou.

Re: Na co všechno je dobrý LISP?
« Odpověď #148 kdy: 30. 03. 2011, 21:18:07 »
Koukám, že už se to tady zvrhlo na úroveň "kdo ho má většího"  :)

Jak zvrhlo? Vždyť tahle debata je přece od začátku o tom, že lispeři ho mají nejen největší, ale hlavně ostatní ho nemají vůbec.

(makro)

Inkvizitor

Re: Na co všechno je dobrý LISP?
« Odpověď #149 kdy: 30. 03. 2011, 21:30:54 »
tak si zkusime nejaky prakticky priklad... co treba line vyhodnocovani, kod je ve schemu, ale to je jedno.

vytvorme si novy typ hodnot, tzv. prislib. do teto hodnoty si ,,schovame'' nejaky vyraz a vyhodnotime ho az kdyz bude opravdu potreba.

V Pythonu třeba takto:

Kód: [Vybrat]
class delay(object):
    def __init__ (self, x):
        self.x = x
        self.initialized = False

    def __call__ (self):
        if (not self.initialized):
            self.value = self.x()
            self.initialized = True
        return self.value

for i in xrange(10):
    if (i == 0):
        v = delay(lambda: i + 1)
    if (i > 5):
        print v()