Na co všechno je dobrý LISP?

Zofos

Re: Na co všechno je dobrý LISP?
« Odpověď #165 kdy: 31. 03. 2011, 13:06:48 »
...
K bodu 5: Souhlasím s tím, že párování závorek pomůže "rozšifrovat" zdrojový text, nicméně to neznamená, že se tím program stane výrazně čitelnějším. Čitelnost znamená "kouknu se a vidím" a ne "otevřu si editor, jezdím kurzorem sem a tam a hledám".

char*x(char*s,int c){char*r=0;while(*(*s-c?s++:r=s++));return r;}


Kouknu a vidím není vlastností jazyka, ale vlastnost konkrétního programu a programátora. Funkce x kterou uvádím pro pobavení je napsaná v jazyce C, který syntaktický cukr obsahuje, přesto není na první pohled vidět, že je ekvivalentní jedné standardní knihovní funkci.

K bodu 6: Prefixová notace sice má svoje výhody, ale zrovna u aritmetických operací a podobných akcí to prostě je handicap. Výhody existují, ale například násobnou aplikaci operátoru lze v jiných jazycích vyjádřit pomocí fold/reduce. S problémem infixových funkcí si z jazyků, které jsem viděl, asi nejelegantněji poradily Haskell a Scala.

Je to podobný typ handicapu jako to, že v Pascalu je pro tisk výstupu procedura write/writeln, zatímco v C je to funkce printf/puts/fputs/fwrite/..., v C++ operátor << na ostreamech, v jazyce Java je to metoda print/println atd. Je to jen nezvyk a nechuť učit se nové věci.

Zkrátka a dobře, vždycky je to něco za něco. Obrovská flexibilita LISPu je výhoda, o tom není sporu. Problém "metajazyků" typu LISP je dvojí:

1. Zhoršená čitelnost kvůli jednoduché syntaxi - syntaxe LISPu je computer friendly a ne human friendly. Syntaktický cukr je z hlediska čtenáře kódu výhoda, ne že ne.

2. Rozšiřitelnost a určitý paradigmatický agnosticismus (proč je, u všech všudy, potřeba do LISPu přidávat další a další konstrukce?) tento problém ještě zvětšuje.

1. Jde jen o zvyk. Když jsem přešel z Pascalu na C, tak mi přišlo { a } místo begin a end  podobně nepřátelské. Dokonce jsem si myslel, že na = a == místo := a = si nikdy nezvyknu. Příčinou zdánlivé nečitelnosti je jen nezvyk a nechuť učit se nové věci.

2. Proč v okamžiku kdy je potřeba zpracovávat text programátoři raději sáhnou po Perlu než po C? Protože v Perlu je práce s řetězci pohodlnější a snazší. Proč? Protože má Perl specializované konstrukce pro regulární výrazy a programátor se nemusí starat o to, aby pro řetězec naalokoval správný počet bajtů. Kdyby byla jedna sada syntaktických konstrukcí vhodná pro všechna použití, tak by nebyly potřeba různé jazyky, stačil by INTERCAL. Lispeři na to jdou z jiného úhlu než jiní programátoři. Když mají problém, u kterého si řeknou: pro zjednodušení práce by se mi hodil jazyk, který má konstrukce A, B a C, tak si konstrukce A, B a C dopíšou do svého standardního překladače. Když je před stejný problém postaven programátor v jazyce C, tak buď si ty konstrukce doplní tak, že napíše jiný překladač (yacc, lex). Nebo, pokud se nepodaří oddělit ty konstrukce do nějakých separátních modulů jako v případě yaccu a lexu, tak napíše překladač pro nový jazyk (Perl). No a konečně pokud není dost zdatný na psaní překladačů, tak práci toho překladače vykonává ručně a místo toho, aby mohl používat nějakou konstrukci typu match(/regex/,string), tak volá příslušné funkce regcomp, regexec, regerror, regfree v pořadí a s argumenty, které by dokázal doplnit překladač automaticky.


Re: Na co všechno je dobrý LISP?
« Odpověď #166 kdy: 31. 03. 2011, 13:47:42 »
char*x(char*s,int c){char*r=0;while(*(*s-c?s++:r=s++));return r;}


Kouknu a vidím není vlastností jazyka, ale vlastnost konkrétního programu a programátora. Funkce x kterou uvádím pro pobavení je napsaná v jazyce C, který syntaktický cukr obsahuje, přesto není na první pohled vidět, že je ekvivalentní jedné standardní knihovní funkci.

To je klasická polopravda. Kdybych chtěl být ostřejší, tak řeknu (dost zjevná a chabá) manipulace.
Z tvrzení "v každém jazyce se dá psát nečitelně" totiž nijak neplyne, že "v každém jazyce se dá psát čitelně" a tedy ani "čitelnost je (JEN) vlastnost programátora".

Celá pravda je, že syntaxe jazyka přinejmenším stanovuje horní mez čitelnosti, kterou je pisatel schopen dosáhnout.

V některých jazycích se totiž NEDÁ psát tak čitelně jako v jiných i kdyby se pisatel přetrhl a na druhé straně některé jazyky čitelné a strukturované psaní dokonce částečně vynucují (např. python syntaxe vynucující odsazování bloků).
 
1. Jde jen o zvyk. Když jsem přešel z Pascalu na C, tak mi přišlo { a } místo begin a end  podobně nepřátelské. Dokonce jsem si myslel, že na = a == místo := a = si nikdy nezvyknu.

Opět podobná věc: z toho, že se ti zdálo X o Y a pak jsi zjistil, že X nebyla pravda, nijak neplyne, že když se někomu zdá X o Z, tak to taky není pravda.

Příčinou zdánlivé nečitelnosti je jen nezvyk a nechuť učit se nové věci.

Takže např. binární výpis programu je vlastně čitelný - a jestli si někdo myslí, že ne, tak se jenom nechce učit nové věci.

Dokonce je "čitelný" i program ve zvukové podobě: cat binarka >/dev/dsp

Ach jo. Možná by to chtělo vzít v úvahu, že člověk není stroj, který se může naprogramovat na libovolný způsob komunikace. My lidi prostě máme některé věci zažité a přijdou nám "přirozené" (i když přirozené nejsou, museli jsme se je naučit), proto ke srozumitelnosti přispívá, když jde jazyk těmhle zažitým věcem naproti a ne zcela proti nim.

JS

Re: Na co všechno je dobrý LISP?
« Odpověď #167 kdy: 31. 03. 2011, 14:55:36 »
Benchmarků se dá najít kupa.

http://dan.corlan.net/bench.html

Java (do nativniho kodu): 25 radku kodu, 3.03s
Java (bytekod): 8.23s
Lisp: 22 radku kodu, 4.69s

Java-nativni kod o 35% rychlejší.

Mel jsem na mysli spis studie porovnavajici produktivitu nez benchmarky. Nicmene, nemuzes uplne 100% porovnavat opensource kompilator (SBCL) a komercni JIT kompilator (JRE). Myslim, ze na to, ze je CL dynamicky jazyk, ma dost slusnou rychlost.

JS

Re: Na co všechno je dobrý LISP?
« Odpověď #168 kdy: 31. 03. 2011, 15:08:17 »
ad tail rekurze - pokud jsem to spravne pochopil, ten nastrel neni ciste funkcionalni (setf), coz popira puvodni duvod pro pouziti tail rekurze..

Ale to je prece hloupost. Jak je to vevnitr naimplementovane je prece lhostejne. To bys musel tvrdit, ze cele funkcionalni programovani je k nicemu, protoze pocitace jsou vzdy stavove (a kompilator preklada tail-rekurzi jako smycku). A makra nejsou v podstate nic jineho, nez urcita nadstavba nad kompilatorem.

"Ano, existuji veci, ktere se i s velmi silnym makrosystemem delaji nesikovne. Je to tak prekvapive?"

ne, je to dukaz, ze jine jazyky nabizeji jine abstrakce v Lispu nedostupne a stejne efektivne neimplementovatelne; ta makra proste jen poskytuji urcity pristup a jine jazyky poskytuji jine pristupy k reseni problemu, makra nejsou nadmnozinou a vselek, jak se Lispari snazi tvrdit

No takove veci, jako optimalizace celeho programu (nebo treba jen typova inference) jsou skutecne z programovaciho jazyka samotneho dostupne jen obtizne. To ze funkcionalni jazyky poskytuji jine abstrakce je diskutabilni. Podle me spis vyuzivaji toho, ze zadaly urcite omezeni (treba na cistotu funkci). Je pro me tezko predstavitelne, ze by bylo mozne neco takoveho do Lispu pridat, aniz bychom se nemuseli nekde jinde omezit.

Nicmene, to ze si myslim, ze je to tezke, neznamena, ze je to nemozne. Ty jazyky stale jsou Turingovsky uplne, a Lisp vam stale umoznuje definovat k vasim potrebam pekne DSL. Ze to DSL muzete obejit, a tim jeho "vyhody" nabourat, je uz vec jina, a je velmi diskutabilni, zda je to vyhoda ci nevyhoda.

Re: Na co všechno je dobrý LISP?
« Odpověď #169 kdy: 31. 03. 2011, 15:08:39 »
Myslim, ze na to, ze je CL dynamicky jazyk, ma dost slusnou rychlost.

Souhlasím. Rozdíl oproti třeba tomu Pythonu je obrovský. To je rozhodně zajímavé a jsem rád, že jsem se to dozvěděl.

Ale na druhou stranu třeba se C#em Lisp co do paměti prohrává a co do rychlosti je to nastejno:

http://shootout.alioth.debian.org/u32/benchmark.php?test=all&lang=sbcl&lang2=csharp

takže za předpokladu, že Boo bude co do výkonu stejné jako C# (není žádný důvod, proč by nebylo), volím jednoznačně Boo a ne Lisp - z důvodu dynamičnosti kdy-je-potřeba a statičnosti jinak (->kontrola), obrovského množství knihoven a nástrojů a snadné integrovatelnosti.

Lisp mě prostě nemá čím oslovit - a makra to jednoduše nemůžou zachránit...


Re: Na co všechno je dobrý LISP?
« Odpověď #170 kdy: 31. 03. 2011, 17:31:56 »
Takže Lisp je funkcionální jazyk, ale nedá se v něm pořádně programovat čistě funkcionálně? Čtu to tady a nevím, co si o tom mám myslet, zatím mě to taky moc nezaujalo. Třeba stránky o Haskellu se jeho hlavním výhodám oproti jiným jazykům (lenost, žádné vedlejší efekty, silný statický typový systém atd.) věnují hodně.

Největší výhodou Lispu jsou makra a možnost jednoduše zpracovávat program jako data... je to tak? Taky myslím, že něco takového je prakticky použitelné hlavně pro programování věcí, kde se pracuje s lispovým kódem (např. IDE pro Lisp). Generovat kód za běhu a spouštět ho (exec, eval) se považuje za nebezpečné, ale v Lispu se tak programuje normálně. Není to špatný a nebezpečný způsob programování? Dívám se na to nějak špatně?

Re: Na co všechno je dobrý LISP?
« Odpověď #171 kdy: 31. 03. 2011, 17:36:20 »
Největší výhodou Lispu jsou makra a možnost jednoduše zpracovávat program jako data...

...což je jedno a to samé :)

Re: Na co všechno je dobrý LISP?
« Odpověď #172 kdy: 31. 03. 2011, 17:59:35 »
Největší výhodou Lispu jsou makra a možnost jednoduše zpracovávat program jako data...

...což je jedno a to samé :)
To úplně není. Třeba v C si můžu udělat makro, ale v parsování C-čkového kódu mi to nepomůže.

Re: Na co všechno je dobrý LISP?
« Odpověď #173 kdy: 31. 03. 2011, 18:39:27 »
To úplně není. Třeba v C si můžu udělat makro, ale v parsování C-čkového kódu mi to nepomůže.

No ale bavíme se o makrech v Lispu. A to není (nakolik jsem to zatím pochopil) nic jiného, než funkce, která bere "nespuštěný" Lispový kód* a vrací spustitelný objekt (v případě Lispu "vyhodnotitelnou formuli" nebo jak by se to správně řeklo).

Čili v podstatě dělá to samé jako eval, akorátže sympatičtějším způsobem, protože do kódu můžu "elegantněji" šahat, protože ho nemám jako string, ale jako už rozparsovanou strukturu.

Nevidím žádný velký důvod, proč by totéž nešlo udělat u libovolného jiného (i čistě procedurálního) jazyka, který je schopen svými vlastními prostředky manipulovat s rozparsovanou strukturou. Akorát to asi nikdo nepotřebuje, protože 99.9% situací, kde by se to hodilo, si stejně vystačí s lambdou...

Ale možná se pletu - jak jsem říkal, programovací jazyky nejsou žádný můj koníček...

-------

* já bych nespuštěný kód nazval třeba "citát", protože pracuji jakoby nad TEXTEM (strukturou) algoritmu, nikoli nad HODNOTOU VRÁCENOU algoritmem, ani nad algoritmem jako celkem. Čili algoritmus nespouštím, ale dělám nad jeho strukturou nějaké operace. Zmínil jsem tady transparentní intenzionální logiku - ta má to samé: jednak umí rozlišit mezi "de dicto" a "de re" (což asi v programování nemá ekvivalent) [1] a navíc umí rozlišit spuštěnou a nespuštěnou konstrukci [2] (což je přesně rozdíl mezi normální funkcí a makrem).

(Ovšem sluší se dodat, že TIL vznikl až po Lispu, takže s klidem můžeme lispisty poplácat po rameni, což ji zjevně dělá tak moc dobře :)

[1] http://til.phil.muni.cz/text/duzi_homonymie_dedicto_dere.php
[2] http://til.phil.muni.cz/text/tichys_fivemodes.php - viz hlavně trivializace

koroptev

Re: Na co všechno je dobrý LISP?
« Odpověď #174 kdy: 31. 03. 2011, 18:44:48 »
JS:
ad rekurze - doted jsem si myslel, ze kompilator preklada tail rekurzi jako prosty skok, ne smycku (coz v imperativnim - jakem jinem v tomto kontextu - pojeti obvykle znamena zmenu nejakeho akumulatoru nekde v pameti + skok; ostatne instrukce smycka alespon na x86 funguje presne takhle), kdo z nas dvou to nepochopil? ze mi vadi stav? nevadi, jen proste standard CL nezarucuje funkcnost ciste funkcionalniho kodu, cele me tvrzeni; pointa je, ze pokud kompilator tail rekurzi podporuje, tak se destrukce "stareho" mista a vytvareni "noveho" deje prirozene a ne tim zplostenim problemu na imperativni iteraci, jak to dela ono makro, vzdyt preci v trochu slozitejsich pripadech tohle nebude fungovatt! viz toto http://www.ats-lang.org/DOCUMENTATION/PROGINATS/HTML/x677.html
co to tedy placas ty?

chci tu hned ted priklad na traverzovani stromu potencialne obrovske hloubky, ciste funkcionalne a prenositelne v CL..  tozn. pokud to jde, zajima me jak, opravdu

zbytek vylevu nema cenu komentovat

nm - novomente

Re: Na co všechno je dobrý LISP?
« Odpověď #175 kdy: 31. 03. 2011, 18:59:11 »
Tak jsem tak nejak koukal na ty makra a chtel bych se na neco zeptat. Neni to nic konkretne praktickeho, ale ciste teoreticky. Muzu si nadefinovat takova makra, ze ve vysledku pak budu psat takovehle veci? (opakuji ciste teoreticky):

Kód: [Vybrat]
(circle x y r)nebo
Kód: [Vybrat]
(rekni v "Dobry den, jmenuji se Jack")kde v je vyska tonu hlasu, nebo
Kód: [Vybrat]
(moveto (map "Praha") x y)apod.

koroptev

Re: Na co všechno je dobrý LISP?
« Odpověď #176 kdy: 31. 03. 2011, 19:09:03 »
novomente: to vsechno vypada jako typicke priklady na pouziti funkce, k cemu makro?

ad rekurze jeste - beru zpet ten svuj priklad na mutual tail recursion, to makro to patrne zvladne, zbytek vytek plati


nm - novomente

Re: Na co všechno je dobrý LISP?
« Odpověď #177 kdy: 31. 03. 2011, 19:31:06 »
novomente: to vsechno vypada jako typicke priklady na pouziti funkce, k cemu makro?
No jo, vlastne funkce a ne makro (uz jsem nejakej pretazenej, celou noc jsem skoro nespal :) )
No ale jestli to tak jde, tak to je parada. A jeste vetsi parada je, ze si ty funkce muzu nadefinovat za behu programu. Nebo ne?

Re: Na co všechno je dobrý LISP?
« Odpověď #178 kdy: 31. 03. 2011, 19:51:10 »
No ale jestli to tak jde, tak to je parada.

Co presne je na tom parada? :)

nm - novomente

Re: Na co všechno je dobrý LISP?
« Odpověď #179 kdy: 31. 03. 2011, 20:09:21 »
Co presne je na tom parada? :)
Parada je na tom to, Mirku, ze obcas zapremyslim nad jednim napadem, o kterem jsem se zminil v diskusi "IT inovace od neprogramatora" (neco jako programatorske LEGO). Ale prosim te, nechtej vedet o co jde, protoze o tom nechci mluvit, dokud nezjistim, jestli uz to nekdo nejak nezkousel. Presne jak jsem psal v te diskusi (IT inovace...).

No a jestli to nikdo jeste nezkousel to tak resit, jak myslim, tak to pro mne bude skvela motivace, abych se ucil programovat. Ale na to je jeste cas, stale hledam.