Na co všechno je dobrý LISP?

jehovista

Re: Na co všechno je dobrý LISP?
« Odpověď #75 kdy: 29. 03. 2011, 20:52:30 »
Studoval jsem umelou inteligenci a robotiku a LISP se tam(podle me) pouzival proto, ze se dal bez nejakych serepeticek zapisovat rovnou algoritmus(nejake prohledavani stavoveho prostoru apod.) a vsichni studenti meli stejnou startovaci caru. Vic bych za tim nehledal.
A proč ne? Copak v Lispu nejde udělat neuronová síť a k ní i proces učení?

Zmínil bych jednu z výhod Lispu proti ostatním jazykům: Velmi rychlé prototypování. Každá funkce se dá ladit zvlášť a přímo do aplikace lze zakomponovat testování včetně automatických testů.

A důkazy? Ty jsou na http://lisperati.com , nebudu je opisovat.
Ale vzdyt se shodujeme.
P.S. Ze zemi ovladnou mravenci a zachrani nas LISP je opravdu uderny argument.


Viky

Re: Na co všechno je dobrý LISP?
« Odpověď #76 kdy: 29. 03. 2011, 21:06:10 »

Take by me zajimalo nejake konkretni pouziti LISPu, jeho vyhod a prednosti. Treba v robotice. Mam tuseni, ze jsem cetl, ze je LISP selfprogramming language. Kdyby treba nekdo napsal: "Tak jsem na VS programoval robota, ktery delal to a to. Zkousel jsem ruzny veci a jazyky az jsem dosel na LISP a tam jsem to vykoumal tak, ze ten robot se uci z toho, co dela a vidi a sam si preprogramovava svuj vlastni system chodu. Takze ted dela to a to uplne jinak, chytreji a efektivneji a pritom se porad uci."

Ale mozna bych se mel podivat spise na nejake jine webove stranky, treba stranky skol nebo jine, ktere se zabyvaji umelou inteligenci, kdyz teda LISP se pouziva hlavne v teto oblasti.

Každý... tahá pilku. (asi nekde v lese v horach) A pak si dá ... co mu přinese bernardýn v soudku na krku. ;D

Pokud máš povědomí o základních problémech AI, tak např. tady si můžeš prohlédnout jejich řešení v LISPu:
http://www.cs.washington.edu/research/metip/eaicl2.html

Pokud jde o ty roboty, tak tam se asi nejvíc uplatňují přednosti snadného prototypování, interaktivního vývoje a nenáročnosti LISPu. Zkrátka nadefinuješ si funkci pro zatočení a hned si ji zkusíš. Když něco nejde, opravíš a zkusíš znova. Odladěnou funkci pak použiješ dál. Ten kód co tvoříš je navíc dost hutný - něco ve stylu

Kód: [Vybrat]
(defun opposite (side)
  (if (eq side left) (right) (left)))

(defun turn (direction angle)
  (switch direction motor off)
  (switch (opposite direction) motor on)
  (delay (normalize-to-speed angle))
  (switch (opposite direction) motor off))

a hned vyzkoušíš (turn right (degrees 30)). Fakt je ten kus kódu tak šíleně nečitelný a nesrozumitelný, jak tu někteří tvrdí?
LISP je strašně jednoduchý a přitom mocný jazyk. Interpret LISPu se dá natlačit i do poměrně nenáročného HW toho robota, přímo za provozu pak můžeš měnit program, testovat nové funkce - žádná editace zdrojáku-překlad-upload do robota-zapnutí robota-vypnutí robota-a znova. Tahle vlastnost dost zvyšuje produktivitu práce. Navíc člověk nemá nutkání měnit najednou několik věcí.
No a pokud jde o to přeprogramovávání se na základě učení - není problém. Reakce robota na podnět senzorů se může generovat makrem na základě předchozích zkušeností atp...

Re: Na co všechno je dobrý LISP?
« Odpověď #77 kdy: 29. 03. 2011, 22:23:54 »
Zkrátka nadefinuješ si funkci pro zatočení a hned si ji zkusíš. Když něco nejde, opravíš a zkusíš znova. Odladěnou funkci pak použiješ dál. [...] přímo za provozu pak můžeš měnit program, testovat nové funkce - žádná editace zdrojáku-překlad-upload do robota-zapnutí robota-vypnutí robota-a znova. [...]  Reakce robota na podnět senzorů se může generovat makrem na základě předchozích zkušeností atp...

Všechno tohle můžu v libovolném interpretovaném jazyce, který má eval... A dál?

Ten kód co tvoříš je navíc dost hutný [...] Fakt je ten kus kódu tak šíleně nečitelný a nesrozumitelný, jak tu někteří tvrdí?

Kód: [Vybrat]
(defun opposite (side)
  (if (eq side left) (right) (left)))

(defun turn (direction angle)
  (switch direction motor off)
  (switch (opposite direction) motor on)
  (delay (normalize-to-speed angle))
  (switch (opposite direction) motor off))

A o co méně hutný je tenhle (Boo, Python)?
Kód: [Vybrat]
def opposite(side):
  if side==left: return right
  return left

def turn(direction,angle):
  switch(direction, motor, off)
  switch(opposite(direction), motor, on)
  delay(normalizeToSpeed(angle))
  switch(opposite(direction), motor, off)

Co z toho je srozumitelnější je samozřejmě věcí názoru, zvyku, atd., nikomu necpu svůj názor, že to první je daleko méně přehledné.

Re: Na co všechno je dobrý LISP?
« Odpověď #78 kdy: 29. 03. 2011, 22:27:45 »
Broukoide, nic proti Tvému příspěvku jako celku, ale zejména body 5 a 6 mi přijdou trošku jako výmluvy či vytáčky.

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".

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.

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í:

Za ten výraz metajazyky si naliskej.
Závorky jsou bezva věc, syntaktickej orgasmus. Oproi dialektům LISPu se můžou jít vaše siiisharpy zakopat. Opět si liskni.
Prefixová notace je intuitivně i kalkulativně nad ostatními notacemi. Přece říkáme: "sečteme čísla 2 a 5 a 8" spíše než "vezmeme číslo 3, k němu příčteme 5, poté vezmem onen výsledek a k němu přičteme 8", to je tedy pěkný rozdíl v délce. Liskněte si potřetí.

Inkvizitor

Re: Na co všechno je dobrý LISP?
« Odpověď #79 kdy: 29. 03. 2011, 22:31:44 »
Za ten výraz metajazyky si naliskej.
Závorky jsou bezva věc, syntaktickej orgasmus. Oproi dialektům LISPu se můžou jít vaše siiisharpy zakopat. Opět si liskni.
Prefixová notace je intuitivně i kalkulativně nad ostatními notacemi. Přece říkáme: "sečteme čísla 2 a 5 a 8" spíše než "vezmeme číslo 3, k němu příčteme 5, poté vezmem onen výsledek a k němu přičteme 8", to je tedy pěkný rozdíl v délce. Liskněte si potřetí.

Jestli má být tohle parodie asociálního milovníka Lispu, je to drsnější než Česká soda a South Park dohromady.  :D :D :D


Inkvizitor

Re: Na co všechno je dobrý LISP?
« Odpověď #80 kdy: 29. 03. 2011, 22:33:49 »
Zmínil bych jednu z výhod Lispu proti ostatním jazykům: Velmi rychlé prototypování. Každá funkce se dá ladit zvlášť a přímo do aplikace lze zakomponovat testování včetně automatických testů.

To samé lze dnes dělat v Pythonu, Ruby, Scale, pokud netrváme na interaktivním interpretu, tak třeba v Perlu atd. Já mám pocit, že ten dojem výjimečnosti Lispu pochází velkou měrou z doby, kdy hlavními alternativami Lispu byly Fortran a Pascal.

Beru makra, která tady uváděl JS, využití vidím v DSL a možnosti monkey patchingu. Plus možná ty restarty, které asi moc programátorů nepoužívá. Beru jednoduchost syntaxe (využití bych místo robotů viděl spíš v botnetech apod.). Ale jinak mi přijde, že ty výhody jsou v praktickém využití sporné.

Ondřej

Re: Na co všechno je dobrý LISP?
« Odpověď #81 kdy: 30. 03. 2011, 00:11:03 »
Lisp jsem měl pár semestrů na škole, ze začátku se mi nelíbil, pak se mi líbil a nakonec se mi už zase nelíbí. Nikdo jsem v tom nic extra velkého nenapsal, takže zmíním jen pár příkladů, které si pamatuji ze školy. Jsou to tedy spíš blbůstky, žádná velká věda.

Největší výhodou jsou podle mě makra, v ostatních oblastech asi není Lisp nijak unikátní. Ale makra jsou hrozně silná, kdybych v tom programoval víc, tak asi uvedu daleko lepší příklady, takhle si vzpomínám jen na pár trivialit.

Klasicky se pomocí maker programují jiné variantu ifu, třeba pravděpodobností if, který bere jako parametr číslo, které představuje hodnotu, s jakou pravděpodobností se má vyhodnotit „true“ větev. Takže něco takového:

(pif 40 a b)

S 40% pravděpodobností se vyhodnotí a, jinak b. Někde v C# bez maker by se to mohlo zapsat takto:

if(pr(40)) return a; else return b;

Nebo jsme programovali if2, který uměl výsledek vyhodnocení podmínky automaticky uložit do nějaké proměnné, třeba it:

(if2 (+ 1 2) it 0)

Vrátilo by to 3. Jinde by se asi napsalo něco jako if(it=1+2)… Docela zajímavé bylo makro, které umělo převádět rekurzivní funkce na iterativní verzi, pokud to šlo. Takže pokud bylo jednodušší napsat rekurzivní verzi než iterativní (třeba klasicky faktoriál), tak jste to mohli napsat rekurzivně a nechat to projet tím makrem.

Makra se pak často používají na vytvoření nějaké funkce na procházení nějaké datové struktury, třeba stromu. Ale na to jsou v běžných jazycích nějaká rozhraní Iterator a foreach. Ale můžu si třeba napsat zkráceninu za klasiku for(i=0;i<x;i++), takže budu mít třeba makra fori, které bere jen jeden parametr — x. Použilo by se to třeba takto:

(fori 10 (print i))

V jiných jazycích se to tuším často řeší nějakou metodou přilepenou na int, v C# jsem psal:

(10).times(i => print(i));

Podobně není problém napsat si třeba cyklus, který bude cojávímco… projíždět jen sudá čísla:

(for-even 5 (print i))

…a ono to vytiskne prvních pět sudých čísel. Lisp má třeba výraz when, což je if bez else větve. Tohle běžně programovací jazyky, pokud vím, nemají a i pokud by to Lisp neměl, opět není problém si napsat makro, které takový výraz realizuje.

Mohl bych si pomocí maker napsat vlastní logickou spojku, třeba „pokud jsou alespoň dva výrazy pravdivé, pak vrať true, jinak false“ a bude se vyhodnocovat líně. Tj:

(at-least-two t nil t (print 1))

Důležité je, že to (print 1) už se nevyhodnotí, tj. nikde se jednička nevypíše. Pokud třeba máte jazyk, který neumožňuje rozumně definovat přístupové metody pro atributy objektů, tak si můžete nadefinovat makro, které ty přístupové metody automaticky vytvoří. Něco jako:

(create-setters 'age 'name)
(create-getters 'age 'name 'job 'wtf)


…a to makro automaticky vytvoří metodu set-age, get-age apod.

Tohle jsou jen jemné příklady na makra, já sám v Lispu už pár let nic nenapsal, takže jsem musel hodně namáhat hlavu, abych si vzpomněl, k čemu to bylo dobré. Když tak ať nějaké víc hardcore příklady dá nějaký hardcore lispař ;-). Jo a omlouvám se, pokud všechno tohle lze běžně v jazycích dělat, já už moc přehled nemám, skončil jsem nakonec u C# a tam tyhle krávovinky fakt dělat nejdou.

Jo a podstatná věc — makra jsou normálně součástí jazyka, když jsem třeba mluvil o makru, které převede rekurzivní funkci na iterativní verzi, tak není nijak potřeba předávat tu definici jako string. A pro jistotu — hlavní rozdíl mezi makrem a klasickou funkcí je, že makro hned nevyhodnotí své atributy, to bylo vidět u toho příklad at-least-two. Proto jdou makrem zapsat věci, které by klasickou lispovou funkcí zapsat nešly.

Nicméně programovat si vlastní makra není žádná sranda, člověk musí zvládat v hlavě vyhodnotit jednak makro a jednak ten samotný následný funkční kód. Neberu v potaz, makra, která vytváří další makra :-). Plus klasické chytáky jako dvojí vyhodnocení a symbol capture.

Re: Na co všechno je dobrý LISP?
« Odpověď #82 kdy: 30. 03. 2011, 00:38:54 »
Díky, Ondřeji, konečně něco konkrétního!

Pokud třeba máte jazyk, který neumožňuje rozumně definovat přístupové metody pro atributy objektů, tak si můžete nadefinovat makro, které ty přístupové metody automaticky vytvoří. Něco jako:

(create-setters 'age 'name)
(create-getters 'age 'name 'job 'wtf)


…a to makro automaticky vytvoří metodu set-age, get-age apod.

Tohle třeba v Pythonu jde úplně v pohodě (dekorátory, setattr). Jak moc to jde (za běhu) v CLR jsem nezjišťoval, protože jsem to zatím prostě nepotřeboval. Ale předpokládám, že to půjde minimálně od doby, co CLR umí extensions, nebo jak se to jmenuje - prostě rozšiřování už existující třídy. (Mimochodem, škoda že kromě tohodle neopsali z Objective C raději dědění konstruktorů...)

Když tak ať nějaké víc hardcore příklady dá nějaký hardcore lispař ;-).

No já na to pořád čekám a pořád nic... Asi se hardcore lispaři s ne-hardcore ne-lispaři nemají potřebu bavit...

Docela zajímavé bylo makro, které umělo převádět rekurzivní funkce na iterativní verzi, pokud to šlo. Takže pokud bylo jednodušší napsat rekurzivní verzi než iterativní (třeba klasicky faktoriál), tak jste to mohli napsat rekurzivně a nechat to projet tím makrem.

No tak tohle konečně zní opravdu dobře a zajímavě! A to makro to umělo OBECNĚ? (jde to vůbec? Teď nějak nemám buňky nad tím přemýšlet...)

Jo a omlouvám se, pokud všechno tohle lze běžně v jazycích dělat, já už moc přehled nemám, skončil jsem nakonec u C# a tam tyhle krávovinky fakt dělat nejdou.

No až na ten převod na iterativní algoritmus tam všechno (nějak) dělat jde.

A pro jistotu — hlavní rozdíl mezi makrem a klasickou funkcí je, že makro hned nevyhodnotí své atributy, to bylo vidět u toho příklad at-least-two. Proto jdou makrem zapsat věci, které by klasickou lispovou funkcí zapsat nešly.

No to zas taková bomba není - když už by to teda člověk tak strašlivě chtěl, stačí mu napsat něco podobného ICallable, co bude zároveň zapouzdřovat zdroják... Jasně, není to tak elegantní - no a? Copak je to něco, co používáme denně pětkrát?

Inkvizitor

Re: Na co všechno je dobrý LISP?
« Odpověď #83 kdy: 30. 03. 2011, 01:05:31 »
Podle mě převod rekurzivní funkce na iterativní je to samé co optimalizace "tail rekurze" (což Lisp snad dělá automaticky, ne?). A C# má (podobně jako jiné jazyky) podporu pro líné vyhodnocování. Ty příklady jsou ale na demonstraci docela fajn.

Re: Na co všechno je dobrý LISP?
« Odpověď #84 kdy: 30. 03. 2011, 01:15:50 »
Ty příklady jsou ale na demonstraci docela fajn.

Mně přijde, že ty příklady nedemonstrují nic jiného než by demonstroval (print '(print 1)). Někdo je z toho asi paf, to mu neberu, ale já bych chtěl vědět, k čemu tak zázračnému se to teda dá použít...

Tak nějak tuším, že by to mohlo být fajn pro různé automatizované dokazování korektnosti nebo tak něco, ale zatím jsem se tady jenom dozvěděl, že je to jako nářadí, kterým si můžu poskládat nářadí, se kterým bych možná mohl něco vytvořit, pokud bych byl geniální tak, jak obvyklý lispař je... ...a pak teprve bych mohl vytvořit třeba... nářadí.

Viky

Re: Na co všechno je dobrý LISP?
« Odpověď #85 kdy: 30. 03. 2011, 01:19:05 »
Všechno tohle můžu v libovolném interpretovaném jazyce, který má eval... A dál?

Nikdo přece netvrdí, že ne. :) Já osobně upřednostňuji v těchto případech spíš Forth (v jednoduchosti ho asi sotva něco může porazit), protože potřebuji maximální výkon a jednoduchost.

A o co méně hutný je tenhle (Boo, Python)?
Kód: [Vybrat]
def opposite(side):
  if side==left: return right
  return left

def turn(direction,angle):
  switch(direction, motor, off)
  switch(opposite(direction), motor, on)
  delay(normalizeToSpeed(angle))
  switch(opposite(direction), motor, off)
Co z toho je srozumitelnější je samozřejmě věcí názoru, zvyku, atd., nikomu necpu svůj názor, že to první je daleko méně přehledné.

Mně stále není jasné, oč ti jde. Tazatel chtěl vidět příklad použití v AI - dal jsem mu odkaz. Ptal se, jak se LISP uplatní třeba v robotice nebo obecně v embedded - dal jsem ten nejtriviálnější příklad, jaký si lze vymyslet. Kdyby chtěl napsat nějaký algoritmus adaptivního řízení u toho robota, nebude to žádný problém. Neříkám, že v jiných jazycích to nepůjde (asi to nepůjde tak snadno a přímočaře jako v LISPu, ale pokud to bude interpretovaný jazyk, tak by to nějak jít mohlo). A jestli někomu připadá důsledné dodržování logiky (operace operand1 operand2 atd.) méně přehledné, než hromada různorodých konstrukcí s různým pořadím operací a operandů a dalších symbolů, podle toho, co chce zrovna vyjádřit (chce-li zavolat funkci, napsat podmínku, definovat novou funkci nebo napsat smyčku či zadat nový datový typ atp.), tak je to jeho boj. Z hlediska jednoduchosti překladače a možnosti generování kusu programu jiným kusem programu je samozřejmě smysluplnější lispovský přístup, z hlediska čitelnosti programu někým, kdo daný jazyk neovládá, zase to druhé (diskusi o tom, měla-li by být čitelnost programu pro daný jazyk neznajícího člověka považována za jednu z nejdůležitějších vlastností programovacího jazyka, bych raději ponechal stranou).
LISP má výhodu jednoduchosti a tvárnosti. Lispař nebude nikdy v diskusích žehrat na to, že mu v něm chybí nějaká vlastnost - tu výjimky, tu rozhraní, tu vícenásobná dědičnost, nebo když už se to tam dodá, tak že je to vymyšlené nešikovně. Stačí se podívat na net - takovýchto debat o Pythonu ale i třeba o C++ je tam plno - z čehož plyne, že argument, že každému přece stačí syntaktické konstrukce naservírované autory jazyka, není zas tak pádný, za jaký se vydává.
Krom toho lispař není odkázaný na to, až se někdo uráčí portovat překladač na platformu, na níž ho potřebuje on, protože překladač LISPu je otázkou pár stovek řádků v C (jež obvykle bývá dostupné pro vše).

Zkrátka LISP má oproti jiným jazykům tu výhodu, že je to velmi jednoduchý jazyk, v němž prakticky cokoli se dá udělat jednoduše. Resp. dá se to zařídit tak, aby to bylo jednoduché, pokud se to hodí. Když bude lispař chtít intenzivně pracovat s řetězci, zařídí si to tak, aby to šlo snadno. Když bude chtít pracovat s vektory a maticemi, zařídí si to tak, aby to šlo snadno. Bude-li potřebovat programovat web, přizpůsobí si to tak, aby to šlo snadno. Nikdy nebude muset žehrat na to, že tuto věc autoři udělali lépe a tamtu zase hůře, že toto se dělá snáze a tamto zase kostrbatěji, že v jazyku mu chybí to nebo tohle nebo že to mělo být uděláno jinak. Pokud má někdo jako náplň práce bouchat v PHP weby jak komunisti paneláky, tak LISP asi zrovna moc neocení. Stejně tak ho asi moc neocení numerický matematik, jehož náplň práce je řešení různých PDE.
LISP je jazyk vhodný pro lidi, kteří musejí/chtějí řešit širokou škálu různorodých problémů, kdy je žádoucí mít možnost přizpůsobit si jazyk tomu kterému problému, který jím zrovna řeší.
Ta argumentace "ale tohle se dá udělat v XYZ taky.. a dál?" mi není moc srozumitelná. A co jako? Zmínil jsi jakýsi jazyk Boo. To se můžu mnohem smysluplněji ptát - k čemu je to dobré? Všechno, co zvládne Boo, se zvládne v LISPu taky a přinejmenším stejně jednoduše. O opačné inkluzi se dá s úspěchem pochybovat. Tak na co Boo? :D

Prostě - nemůžu si pomoci, ale pořád cítím takový ten styl oponování "tohle umí Python taky, tohle se dá v C# udělat taky - sice to je mnohem kostrbatější, ale jde to, dokázal jsem, že to nějak taky jde, hahá!" Přece nikdo netvrdí, že by to nemělo jít. Fór je v tom, že lispař na to nepotřebuje žádné dekorátory a pokud je nemá, tak vymýšlet kostrbaté konstrukce, které to nějak napodobují, a nebude naříkat "Mimochodem, škoda že kromě tohodle neopsali z Objective C raději dědění konstruktorů...)". To mně spíš připadá groteskní ta snaha dokazovat, že ty moderní jazyky taky dokáží většinu toho, co 50 let starý LISP - pomocí různých dekorátorů, iluminátorů a výbušných modulátorů - pokud je autoři jazyka implementovali. :)

Re: Na co všechno je dobrý LISP?
« Odpověď #86 kdy: 30. 03. 2011, 01:29:05 »
Mně stále není jasné, oč ti jde.

Chci se konečně dozvědět, proč je Lisp jazykem pro programování, zatímco jiné jazyky jsou pro cvičené opice ke slepování kódu...

Ptal se, jak se LISP uplatní třeba v robotice nebo obecně v embedded - dal jsem ten nejtriviálnější příklad, jaký si lze vymyslet.

Podle toho, co tady zatím čtu a co jsem si teda (páč argumenty tady nezaznívají) byl donucen přečíst o Closure, mám ještě triviálnější odpověď: Lisp se v robotice uplatní úplně stejně jako jakýkoliv jiný moderní jazyk. Ovšem při používání Lispu se naučíte druhé lidi ohromovat poetickými báchorkami o Lispu.

Re: Na co všechno je dobrý LISP?
« Odpověď #87 kdy: 30. 03. 2011, 01:45:26 »
Ta argumentace "ale tohle se dá udělat v XYZ taky.. a dál?" mi není moc srozumitelná. A co jako? Zmínil jsi jakýsi jazyk Boo. To se můžu mnohem smysluplněji ptát - k čemu je to dobré? Všechno, co zvládne Boo, se zvládne v LISPu taky a přinejmenším stejně jednoduše. O opačné inkluzi se dá s úspěchem pochybovat. Tak na co Boo? :D

Ovšem já jsem taky netvrdil, že Boo je jazyk pro opravdové chlapy, kteří si umí narozdíl od cvičených opic pomocí nářadí udělat nářadí. A že se dá o nějakých jazycích s úspěchem pochybovat.

Pokud by se mě někdo ptal, proč Boo, tak bych řekl, že proto, že je stručný, přehledný, má k dispozici poměrně slušnou standardní knihovnu (CLI), poskytuje bezešvou integraci s jedním z komerčně nejpoužívanejších jazyků (C#) a tímpádem je k němu obrovské množství knihoven. Ovšem nenabízí nic, co by se nedalo najít jinde.

Takže Boo například proto, že si v něm napíšu webservice s veškerým komfortem (testovací webová stránka, generování wsdl, atd. atd.) asi tak za dvě minuty včetně prohledání dokumentace a výsledek bude na tři řádky kódu. Nemám pocit, že jsem pánem světa a proto tady nehulákám, že by se dalo s úspěchem pochybovat o tom, že v Lispu by šlo totéž stejně elegantně, rychle a efektivně. Místo toho jsem se snažil zjistit, co teda jde v Lispu tak elegantně - a zatím jsem se nedozvěděl v podstatě nic... Škoda, protože v blízké době budu potřebovat napsat nějakou věc na zpracování dat a přemýšlel jsem o prologu, ale pro CLI mě žádný neoslovil. Třeba by Lisp byl zajímavý, ale po přečtení téhle diskuse na něj nemám ani trochu chuť :(

Re: Na co všechno je dobrý LISP?
« Odpověď #88 kdy: 30. 03. 2011, 01:57:54 »
Lispař nebude nikdy v diskusích žehrat na to, že mu v něm chybí nějaká vlastnost - tu výjimky, tu rozhraní, tu vícenásobná dědičnost, nebo když už se to tam dodá, tak že je to vymyšlené nešikovně.

No tohle už je úplná zoufalost... Takže vlastně ostatní jazyky jsou špatné proto, že mají něco, co Lisp nemá, takže v Lispu si to člověk musí sám napsat, čímžpádem pak nenadává na to, že to někdo jinej napsal blbě.


Aneb: člověk programující ve strojovém kódu nikdy nebude žehrat na to, že nemá výjimky, ale jenom nuly a jedničky - když bude vyjímky chtít, tak si je napíše tak, jak sám potřebuje, protože nuly a jedničky jsou to nejmocnější a nejjednodušší, co se dá počítači naservírovat.

Uf.

bedna

Re: Na co všechno je dobrý LISP?
« Odpověď #89 kdy: 30. 03. 2011, 07:46:39 »
Vůbec to není hardcore lisp, normální 2 makra a jedna funkce.

Kód: [Vybrat]
(defmacro <- (fact &rest predicates)
  `(lambda (variables) (when (and ,@(mapcar 'evaluate-vars predicates))
                         (set-variable variables
                                       ',(first fact)
                                       (evaluate variables ',(second fact))))))

(defun evaluate-vars (pred)
  `(,(first pred) (evaluate ,(second pred) variables)
                  (evaluate ,(third pred) variables)))

(defun evaluate (variables symbol)
  (let ((value (get-variable variables symbol)))
    (if value value symbol)))

A tímto se vytváří regulátorový jazyk. Jelikož to vyhodí lambdu, tak se regulátor neprovádí, ale můžeš si jej pěkně ukládat kam chceš.

Kód: [Vybrat]
(defmethod evaluate-loop ((regulator-control regulator-control))
  (dolist (regulator (regulators regulator-control))
    (force regulator (variables regulator-control))))

A pomocí této metody funguje celý regulátorový jazyk. Žádné parsování, žádné peklo jménem eval (mimochodem, kdybych použil eval, tak to nebude fungovat), jak jinak modifikovat (<- (nastav-rychlost 10) (leva-rychlost 100) (prava-rychlost 100)) na funkce?

Není to vyjádření docela hutné? Ukázal byste mi někdo obdobný kód, načrtnutý? (bez detailů, jak vypadá ten jazyk).