Na co všechno je dobrý LISP?

Re: Na co všechno je dobrý LISP?
« Odpověď #120 kdy: 30. 03. 2011, 16:25:56 »
Proste, podobne jako OOP, neda se to vysvetlit jednoduchym prikladem

Tak když to neumíte vysvětlit jednoduše, tak si přečtěte příklad takového jednoduchého vysvětlení - třeba hned první odkaz googlu: http://www.apl.jhu.edu/~hall/Lisp-Notes/Macros.html

V podstatě z toho stačí jedna věta:

1. Basic Idea: Macros take unevaluated Lisp code and return a Lisp form. This form should be code that calculates the proper value.

Sorry, ale fakt žádná jaderná fyzika to není.


JS

Re: Na co všechno je dobrý LISP?
« Odpověď #121 kdy: 30. 03. 2011, 16:31:31 »
Tak když to neumíte vysvětlit jednoduše, tak si přečtěte příklad takového jednoduchého vysvětlení - třeba hned první odkaz googlu: http://www.apl.jhu.edu/~hall/Lisp-Notes/Macros.html

No vidite. Tohle jste mohl udelat ve chvili, kdy jsem zminil slovo "makro". Ruku na srdce - kdybych vam ten link poslal, precetl byste si jej?

Re: Na co všechno je dobrý LISP?
« Odpověď #122 kdy: 30. 03. 2011, 16:32:40 »
Kód: [Vybrat]
(print (+ 1 1))
To je hnus!

Se nedivím, že ani po sto příspěvcích nikdo nevěří, že je tohle ten pravý jazyk.

Re: Na co všechno je dobrý LISP?
« Odpověď #123 kdy: 30. 03. 2011, 16:34:59 »
No vidite. Tohle jste mohl udelat ve chvili, kdy jsem zminil slovo "makro". Ruku na srdce - kdybych vam ten link poslal, precetl byste si jej?

Myslíte, že má smysl vám vysvětlovat, že jsem se z toho linku nic nového nedozvěděl? Nemá, že?

bedna

Re: Na co všechno je dobrý LISP?
« Odpověď #124 kdy: 30. 03. 2011, 16:52:53 »
Tedy příklad, který by se v praxi v Lispu nepoužil, protože se v lispu používá prefixová notace. Jedná se o makro, které přebírá různý počet parametrů, všechny je vyhodnotí a vrátí, jestli jsou všechny pravdivé, či ne.

Kód: [Vybrat]
(defmacro my-great-and (&rest predicates)
  `(and ,@predicates))

#|
(my-great-and (= x 1) (< y 3) (= (+ z 3) 4))
=> expanduje na (AND (= X 1) (< Y 3) (= (+ Z 3) 4))
|#

ps.: #| ... |# označuje komentáře

Jak by se to udělalo v Pythonu? Nebo v C, C++, C# či Ruby? Chci vidět kód, ať to můžeme porovnat a ne do sebe kopat a nadávat si.

Zadání je doufám jasné, o jeho použitelnosti nemá význam diskutovat (obměnu pro praxi si určitě každý dokáže vymyslet sám) funkce, konstrukt nebo co já vím co, kterému se předají podmínky a on vrací pravda, když jsou všechny splněny nebo nepravda, pokud alespoň v jednom případě některá splněna není.

(chci se vyhnout psaní například v C bool result = ((x == 1) && (y < 3) && ((z + 3) == 4)))


nm - novomente

Re: Na co všechno je dobrý LISP?
« Odpověď #125 kdy: 30. 03. 2011, 16:56:19 »
 :o ... jee ... jen jsem ... chtel jsem ....  ??? prosim vas ... rad bych se ...  :o ... ale ja jen ... jen okamzik ...  :P ... proste ... chtel bych se ...  :-[ ... chtel jsem se jen zeptat ...  :o ... oops sorry, sorry, uz mlcim  :-X

Tedy panove, sleduju tu debatu uz treti den a jakozto zakladatel tohodle tematu i jakozto tazatel, musim zasahnout. Puvodne jsem si rikal, ze to necham bezet volne a do ty diskuse, ktera se postupne promenila v hadku, nebudu zasahovat, abych taky jednu nechyt. Ale tohleto jsem fakt necekal.

@Mirku: nevadi, kdyz ti budu tykat? Jednou si mi rekl, tykejte mi, ajtaci si tykaji. Uz si ani nevzpominam, jestli jsem rekl, ze tykani mi nevadi. Tak to reknu ted, nevadi mi to. Tak tedy Mirku, ze se porad tak nejak vsemu branis. Ptal ses uz tolikrat na to co jsem chtel vedet i ja a misto konkretni odpovedi, kterou potrebujes vedet, se ti dostalo jinych odpovedi, ktery ti nic nereknou. Proc se treba nezeptas jinak. Proc se na to nepodivas z jineho uhle pohledu a nepouzijes uplne jinou otazku, s jejiz pomoci byses dobral odpovedi na to, co chces vedet?

a

@JS: doufam ze ti ode mne taky nevadi tykani. Prosimte, ze se porad snazis tomu Mirkovi vysvetlit veci zpusobem, o kterem uz je zjevne, ze to Mirkovi proste takhle nevysvetlis. Zkus se treba zeptat, co chce Mirek presne vedet. Zeptej se nejprve nejaky otazky, ktery ti priblizi vec tak, abys byl schopen tomu Mirkovi to lepe vysvetlit. No a jestli na to treba nemas chut, to treba vzit z jineho konce, proc treba nereknes, ze to nemuzes vysvetlit, protoze proste nevis jak a neodkazes Mirka na jineho LISPare, ktery by to treba Mirkovi vysvetlil lepe.

Take jsem se chtel dozvedet prakticke vyuziti LISPu. Mezi tim, co probihala diskuse zde na rootu, jsem trochu googloval a procital jine stranky (zejmena teda v anglictine). Nedozvedel jsem se teda to, na co jsem se zde v diskusi ptal. Ale zato jsem se dozvedel, ze LISParu je skutecne malo. Prikladu pouziti LISPu je asi dost, ale clovek se musi tomu LISPu venovat a musi si ho trochu osahat, aby zjistil, jake ma vyhody a nevyhody (a vzhledem k jeho jednoduchosti bych si troufnul rict, ze to neni otazka na mesice, ale spis na tydny nebo mozna dny).

Taky jsem zahajil tady na rootu Anketu, ktera ma zjistit, v jakych jazicich programatori navstevujici root programuji. To abych vedel, na ktere otazky se mi tady dostane dobrych odpovedi. Zatim teda vedou jazyky C, C++, taky JAVA, PHP, Python a JavaScript. Celkem zatim hlasovalo asi kolem 200 lidi a z toho se LISPu venuje jen 7 lidi. Takze jsem uprime rad, ze se do nasi diskuse zapojil treba Ondrej, ktery zde mel opravdu konkretni priklady. A take jsem rad, ze se zapojil i JS (a jini), ktery sem dal opravdu dobre odkazy, ktere si jeste ted procitam. A samozrejme jsem vdecny za kazdy prispevek, ktery prinese neco noveho.

Co rici zaverem. Asi trochu pogoogluju a poDMOZuju a doufam, ze sem take prinesu neco noveho anebo se zeptam na dalsi otazky, ktere by (nejen mne) zajimaly.

P.S. Tato diskuse ma za sve 4 dny uz kolem 2700 precteni, takze zajem o toto tema je.

JS

Re: Na co všechno je dobrý LISP?
« Odpověď #126 kdy: 30. 03. 2011, 17:14:03 »
Kód: [Vybrat]
(print (+ 1 1))
To je hnus!

Se nedivím, že ani po sto příspěvcích nikdo nevěří, že je tohle ten pravý jazyk.

Zapomnel jste zminit tech 50 let. :-)

Re: Na co všechno je dobrý LISP?
« Odpověď #127 kdy: 30. 03. 2011, 17:14:55 »
Jedná se o makro, které přebírá různý počet parametrů, všechny je vyhodnotí a vrátí, jestli jsou všechny pravdivé, či ne. [...] Jak by se to udělalo v Pythonu?

To není žádný praktický příklad. (ano, skutečně trvám na tom, že není) Praktický příklad je "načti deset čísel ze souboru a najdi největší" nebo "připoj se na webservice googlu a stáhni mapu brna" nebo "vykresli GUI s obrázkem Majora Gagarina" nebo "vyřeš problém batohu, přičemž data jsou v souboru ve formátu XY".

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á. Co se např. myslí "parametrem"? Co se myslí jejich proměnným počtem? To je asi jako by se C++kař zeptal Objective-Cčkaře, jak se v Objective C udělá přetížená metoda - no prostě v C++kové podobě neudělá, používají se jiné obraty.

Takže co má být ty parametry? Výrazy zapsané ve stringu? Volatelné objekty? Integery? Filehandlery?

Pokud opravdu chcete, aby to vypadalo co nejvíc jako v tom lispu, tak by to opravdu musely být stringy, protože všechno ostatní by se samozřejmě vyhodnotilo před voláním - to jaksi Pythonu nemůžeme zazlívat, prostě jeho koncept je od lispu odlišný. A funkci, která projde všechny svoje parametry, pustí nad nima eval a vzájemně je pro-or-uje snad psát nemusím... Jenže to se vám nebude líbit, že to je něco jiného než v lispu - ano je - a to proto, že jste nepřišel s praktickým úkolem, ale lispovským cvičením nad lispovskými typy dat...

Re: Na co všechno je dobrý LISP?
« Odpověď #128 kdy: 30. 03. 2011, 17:18:50 »
@Mirku: nevadi, kdyz ti budu tykat? Jednou si mi rekl, tykejte mi, ajtaci si tykaji. Uz si ani nevzpominam, jestli jsem rekl, ze tykani mi nevadi. Tak to reknu ted, nevadi mi to. Tak tedy Mirku, ze se porad tak nejak vsemu branis. Ptal ses uz tolikrat na to co jsem chtel vedet i ja a misto konkretni odpovedi, kterou potrebujes vedet, se ti dostalo jinych odpovedi, ktery ti nic nereknou. Proc se treba nezeptas jinak. Proc se na to nepodivas z jineho uhle pohledu a nepouzijes uplne jinou otazku, s jejiz pomoci byses dobral odpovedi na to, co chces vedet?

Tykání v pohodě, naopak díky za něj!

Mno, je to docela dobrá připomínka, ale já holt prostě nevím, jak jinak položit naprosto triviální otázku...

Viky

Re: Na co všechno je dobrý LISP?
« Odpověď #129 kdy: 30. 03. 2011, 17:34:12 »
Forth jsem v tom výčtu jazyků, se kterými jsem se setkal, zapomněl uvést. Ne, že bych v něm něco psal, ale trochu jsem si ho prošel. Ano, je rozhodně zajímavý - a k seznámení s ním mě vedly JASNĚ UVEDENÉ výhody oproti jiným jazykům: brutální minimalismus, jednoduchý koncept, dostatečná vyjadřovací schopnost. Mimo to znám forthovský bootloader z FreeBSD a musím říct, že to je moc hezká věc. Jinými slovy, milovníci Forthu mi jasně předvedli, k čemu se ten jazyk hodí víc než jiné a  neotravovali mě kecy o tom, že jedině oni jsou ti správní real men, protože si pomocí nářadí vyrábí nářadí...

No vida - tak tedy Forth uznáváš. Ale jak bylo řečeno - Forth má s Lispem řadu věcí společnou:
- je minimalistický
- má neobvyklou syntaxi
- je neomezeně rozšiřitelný
- je interpretovaný, resp. "částečně kompilovaný"
- je "čistý" (to plyne z toho minimalismu)

Forth je ryze procedurální jazyk: základní lexikální jednotkou jsou tu slova, jež nevracejí žádné hodnoty, pouze operují (převážně) nad zásobníkem; teoretický základ: dvouzásobníkové automaty
Lisp je funkcionálně orientovaný jazyk: základní lexikální jednotkou jsou tu funkce, jež vždycky vracejí nějakou hodnotu; teoretický základ: lambda počet
Základní strukturou, kol níž se všechno točí, je ve Forthu zásobník. Zásobník návratových adres, zásobník parametrů a slovník, který lze považovat za třetí zásobník - zásobník slov. Zásobníky tedy ve Forthu slouží jak k ukládání dat, tak k ukládání programu.
Základní strukturou, kol níž se všechno točí v Lispu, je seznam. Slouží k ukládání dat a díky vlastnosti zvané homoikoničnost také k ukládání programu - program není nic jiného než seznam seznamů jmen funkcí a jejich parametrů.
Syntaxe obou jazyků je přímým důsledkem trvání na základním principu chápání a manipulace s daty a kódem: v případě Forthu postfixová notace přirozená pro zásobníkové operace (oddělené bílým znakem), v případě Lispu prefixová notace přirozená pro seznamy (v Lispu zapisovaných do závorek).
Forth i Lisp svou vyjadřovací sílu získávají díky zobecněním, jež lze provést díky důslednému dodržování základního (zásobníkového/seznamového) konceptu: Forth díky definujícím slovům a přímým slovům, Lisp díky makrům. Důsledkem toho je většina Forthu napsána ve Forthu a většina Lispu v Lispu a důsledkem toho jsou překladače Forthu i Lispu velmi jednoduché a efektivní.

ALE:
Zatímco Forth je nízkoúrovňový jazyk, Lisp je jazyk vysokoúrovňový.
Ve Forthu se příjemně programují a ladí embedded zařízení, ale kámen úrazu je, potřebujeme-li něco abstraktnějšího. Forth je beztypovým jazykem; samozřejmě že je možné si dodefinovat datové typy a slova, jež dokáží s těmito datovými typy pracovat - ať už staticky nebo dynamicky a provádět nějakou typovou kontrolu a implicitní konverze. Ale o co vyšší úroveň se budeme pokoušet, tím víc to bude zastiňovat hlavní výhody Forthu: rychlost a miniaturnost. Jinými slovy - existují vhodnější nástroje k těmto účelům, než je Forth. Například Lisp, který tento handicap Forthu odstraňuje. Je stejně dobře rozšiřitelný, ale neoperuje s tak nízkoúrovńovými věcmi, stojí v abstrakci výše. Lisp operuje s poměrně obecnými objekty, jako jsou CDR a CAR (zjednodušeně řečeno ukazatel na data uzlu a ukazatel na další uzel), zatímco Forth operuje se zásobníkem tvořeným buňkami, přičemž buňka není nic jiného než n-tice bitů (obvykle 16 nebo 32) a nic víc. Forth je prostě standardizovaný zásobníkový "hypermakroassembler". Pokud se pokusíme zabstraktnit Forth už na této úrovni, začne dost rychle jeho elegance a jednoduchost mizet - příkladem takového pokusu je jazyk Factor.
Pokud se ptáš k čemu jsou v Lispu makra a kdo to kdy potřebuje a že se podobného efektu dá docílit i jinak, měl by ses u Forthu ptát úplně stejně - proč by někdo měl mít potřebu definovat si vlastní definující slova, k čemu by měla být dobrá immediate-slova (neboli direktivy) atp.

Lisp je prostě jazyk, který umožňuje při programování uvažovat podobným "meta-stylem", jako Forth, ale stojí na vyšší úrovni. Ve Forthu DUP prostě zduplikuje buňku tvořící tos, 2DUP zduplikuje 2 buňky tvořící tos. Pokud bychom měli na tos strukturu nebo pole, DUPem to nezduplikujeme. Budeme potřebovat vlastní DUP nebo DUP úplně přepsat s tím, že součástí každé položky bude i informace o její velikosti, případně další informace o zacházení s ní, a už se nebude chovat tak, jako ten "normální DUP". Tohle se v Lispu už neřeší. Když chci zkopírovat seznam, tak je jedno, čím je tvořen. Když chci odebrat poslední prvek, je jedno, jestli tím prvkem je reálné číslo, celé číslo nebo třeba binární strom.
Výhody, jež Forth nabízí nad úrovní Assembleru, nabízí Lisp nad úrovní srovnatelnou např. s Pascalem.

Re: Na co všechno je dobrý LISP?
« Odpověď #130 kdy: 30. 03. 2011, 17:43:18 »
No vida - tak tedy Forth uznáváš.

Ježkovanoho, to je už jak v mateřské školce...

Seš s Forthem? Já teda s Forthem nejsu! Já su teď s Lispem!

Co to proboha znamená "uznávat jazyk"? Když se vám nějaký jazyk líbí, tak si v něm programujte, ale 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...

P.S.

# definovani whilu, ktery pri kazdem pruchodu testuje znovu podminku
i=0
def While(podminka,telo):
  while eval(podminka):
     exec telo in globals()
podminka1 = "i<3"
telo = "print i; i+=1"
While(podminka1,telo)

:)

nm - novomente

Re: Na co všechno je dobrý LISP?
« Odpověď #131 kdy: 30. 03. 2011, 17:51:06 »
Mno, je to docela dobrá připomínka, ale já holt prostě nevím, jak jinak položit naprosto triviální otázku...
Mozna bych ti mohl pomoci. Zda se, ze je jasne, ze LISP je velice univerzalni jazyk. Takze v nem lze udelat obrovske, ale obrovske mnozstvi ruznych veci. Kdyz Ti nekdo chce tenhleten fakt zduraznit, tak je velice tezke vybrat nejaky konkretni priklad, ktery by ti objasnil tu "velikost LISPu". Proto asi vetsina LISParu mluvi tak vseobecne.

Takze se zamysli, co chces vedet a pak poloz jednu konkretni otazku. Podle moji dosavadni nekolikatydenni zkusenosti s forem na rootu musim prohlasit, ze to chce se zeptat jednu konkretni otazku a ne nekolik vseobecnych nebo sirsich otazek. Uplne ten nejpresnejsi duvod neznam, ale vypada to, ze kdyz jsem se ptal vseobecne a polozil jsem treba nekolik otazek, tak mi nikdo na ne neodpovedel. To jsem si rikal, ze si nekdo z tech otazek vybere jednu, na kterou odpovi. Ale to jsem se take pletl.

A tak jsem se treba tady v tyhle diskusi zeptal jednou otazkou na robotiku. A v tom se objevil Ondrej a hned vypsal nekoli konkretnich pouziti ze sve praxe. Tak se zkus zeptat Ondreje na jednu konkretni vec. Treba se toho chytnou dalsi lidi. Az dostanes nejake odpovedi (a muze to trvat treba cely vecer, nes nejakou odpoved dostanes, protoze LISParu, ktery si prave ctou root a ktery si prave ctou tuhle diskusi, je opravdu malo), tak se nad nimi zamysli a pak treba poloz zase dalsi otazku, no a uvidis, ze diskuse urcite nabere jiny kurz.

Co mam zkusenost, tak mi hodne lidi na moji obecnou otazku odpovedelo jinak, nez jsem chtel, ale nakonec z tech odpovedi jsem se neco dozvedel a vytahl jsem si z toho to co jsem chtel vedet, nebo aspon priblizne to, co jsem chtel vedet. Prestal jsem diskutovat a pak kdyz jsem se treba za 2 dny na tu diskusi opet podival, tak koukam, ze se posunula mnohem dal a dozvedel jsem se dalsi veci a vse bylo mnohem jasnejsi.

JS

Re: Na co všechno je dobrý LISP?
« Odpověď #132 kdy: 30. 03. 2011, 17:53:19 »
To není žádný praktický příklad. (ano, skutečně trvám na tom, že není) Praktický příklad je "načti deset čísel ze souboru a najdi největší" nebo "připoj se na webservice googlu a stáhni mapu brna" nebo "vykresli GUI s obrázkem Majora Gagarina" nebo "vyřeš problém batohu, přičemž data jsou v souboru ve formátu XY".

Prakticke priklady na vyuziti makra ale nikdy nebudou mit jen par radek. To musite pochopit. Vezmete si knizku Practical Common Lisp, vyberte si tam libovolny program, a napiste/rozmyslete si program, ktery dela to same v Pythonu, pri pouziti stejne urovne knihovnich funkci (napr. je tam knihovna na parsovani binarnich souboru - zadne podvadeni se struct!). A uvidite, ze to makra zkracuji. To je asi jako chtit jednoduchy priklad, kde je OOP lepsi nez ne-OOP.

Inkvizitor

Re: Na co všechno je dobrý LISP?
« Odpověď #133 kdy: 30. 03. 2011, 19:44:17 »
Prakticke priklady na vyuziti makra ale nikdy nebudou mit jen par radek. To musite pochopit. Vezmete si knizku Practical Common Lisp, vyberte si tam libovolny program, a napiste/rozmyslete si program, ktery dela to same v Pythonu, pri pouziti stejne urovne knihovnich funkci (napr. je tam knihovna na parsovani binarnich souboru - zadne podvadeni se struct!). A uvidite, ze to makra zkracuji. To je asi jako chtit jednoduchy priklad, kde je OOP lepsi nez ne-OOP.

No vida, tohle je konkrétní příklad. Tak se tedy můžeme domluvit, pokud má někdo zájem, na konkrétním příkladu rozumné velikosti, dodejte přesné zadání (parsovat knihu o Lispu se mi opravdu nechce, lispaři mají výhodu, že mají po ruce hotové řešení a nemusí programovat) a někdo z nás to může přes víkend udělat třeba v Pythonu nebo Scale. Pak uvidíme, k čemu jsme došli.

Re: Na co všechno je dobrý LISP?
« Odpověď #134 kdy: 30. 03. 2011, 19:48:49 »
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í.