with-gensyms pochází z vynikající knihy Petera Seibela Practical Common Lisp.
Názory k článku
LISPová makra aneb programovatelný programovací jazyk
with-gensyms
celé vláknoRe: with-gensyms
celé vláknoma_titulek(X) :- nazor(X)
celé vláknosyntax-rules a o syntax-case. :-)
Re: ma_titulek(X) :- nazor(X)
celé vláknoRe: ma_titulek(X) :- nazor(X)
celé vláknoRe: ma_titulek(X) :- nazor(X)
celé vláknoinfix?
celé vláknoRe: infix?
celé vláknoJe to jenom otazka zvyku.
Re: infix?
celé vláknoRe: infix?
celé vláknoRe: infix?
celé vláknoRe: infix?
celé vláknojednoduchá pravda
celé vláknoNové syntaktické konstrukce v jazyku
celé vláknoTo je trosku LISP-centricke :-) I jine jazyky nabizi podobnou rozsiritelnost, i kdyz je pravda, ze nejde zrovna o jazyky mainstreamove (mezi ty radim Javu, C, C++, C#, PHP atd.). Treba takovy FORTH a vlastne i Tcl jde podobnym zpusobem rozsirovat o dalsi syntakticke prvky.
Ale zamysleme se nad tim, proc to je vlastne mozne? Tyto jazyky (LISP, Scheme, FORTH, Tcl) maji velmi jednoduchou syntaxi, stary LISP dokonce nemel syntaxi zadnou, protoze se zapisoval primo derivacni strom, ktery si jinak prekladace a interpretery vytvari sami.
Pridani nove syntakticke kategorie je tedy velmi jednoduche, protoze vlastne samotna syntaxe zustava nezmenena (treba smycky v LISPu neni nic jineho nez specialni forma), ale v jinych jazycich se slozitejsi syntaxi (C, C++, Java, Python...) to uz mozne vetsinou neni. Maximalne se daji pretizit operatory, ale to je vrchol moznosti daneho jazyka, operatory uz nejdou pridat (+nastavit jejich asociativitu ci prioritu) a to vubec nemluvim napriklad o novych typech smycek ci opravdu slozitych makrech, kterym se predava cast kodu na "schroustani".
Moj prispevok k uzitocnym makram...
celé vlákno
(tlet ((a 10 fixnum)
(b 20 fixnum))
(+ a b))
sa rozlozi na:
(LET ((A 10) (B 20))
(DECLARE (TYPE FIXNUM B) (TYPE FIXNUM A))
(+ A B))
Obdobne pre tlet*...Kod makier:
(defun tletbody (typed-vars)
(let (typedefs)
`((,@(loop :for declaration
:in typed-vars
:collect (destructuring-bind (name expr typedef) declaration
(push (cons name typedef) typedefs)
`(,name ,expr))))
(declare ,@(loop :for type-declaration
:in typedefs
:collect `(type ,(cdr type-declaration) ,(car type-declaration)))))))
(defmacro tlet (typed-vars &body body)
`(let ,@(tletbody typed-vars)
,@body))
(defmacro tlet* (typed-vars &body body)
`(let* ,@(tletbody typed-vars)
,@body))
Mozno to niekomu niekedy pride vhod... :)
Lisp a LSD
celé vláknoRe: Lisp a LSD
celé vláknoRe: Lisp a LSD
celé vláknoRe: Lisp a LSD
celé vláknoA protože používání tvrdých drog je nezákonné, zůstane LISP doménou několika málo extremistů, akademickým trápidlem a dobrým příkladem toho, jak se programovací jazyk opravdu navrhovat nemá...
Re: Lisp a LSD
celé vláknoRe: Lisp a LSD
celé vláknoMůžeme samozřejmě diskutovat o tom, kdo kde je (a rozhodně na to máme trošku jiný názor :-)), ale dobří programátoři jsou všude (rozhodně nejsou výsadou USA) a obávám se, že jejich výskyt statisticky opravdu nijak nesouvisí s výukou LISPu...
Re: Lisp a LSD
celé vláknoRe: Lisp a LSD
celé vláknoNaopak, ty reálné problémy a úlohy, ačkoliv se v LISPU jistě řešit dají také, jsou mnohem efektivněji a přehledněji řešitelné v jiných programovacích jazycích. A to je právě důvod, proč reálných nasazení LISPu ubývá a ubývá.
Re: Lisp a LSD
celé vlákno"...efektivněji a přehledněji řešitelné v jiných programovacích jazycích."Hezké. Jenže pointa Lispu je v tom, že to není programovací jazyk. Je to nástroj pro tvorbu progrmaovacích jazyků. ("Lisp isn't a language, it's a building material." - Alan Kay) Když jedna firma místo dvou milionů řádků C++ raději napsala dvě stě tisíc řádků v Lispu, asi k tomu měli důvod. (Třeba to, že se neupsali...)
Re: Lisp a LSD
celé vláknoČím je problém komplikovanější a řešení rozsáhlejší, tím víc se stírají rozdíly (v kategorii množství kódu) mezi jednotlivými programovacími jazyky. Stejně jako cokoliv jiného, ani tohle tvrzení určitě neplatí pro zcela všechny programovací jazyky, ale pro většinu by myslím bylo možné je i exaktně dokázat. Stojí za ním totiž úvaha, že i když nějaký jazyk sám o sobě nabízí nějaké podstatné výhody, je většinou možné si vytvořit jejich kopii v jiném programovacím jazyku... Pro malá řešení bude taková kopie samozřejmě podstatnou částí řešení... ale čím je řešení rozsáhlejší, tím se ona kopie stává méně a méně podstatnou a zbylý kód je rozsahem velmi podobný...
Pokud je to možné, můžete prosím uvést konkrétní jméno firmy?
Re: Lisp a LSD
celé vlákno"Čím je problém komplikovanější a řešení rozsáhlejší, tím víc se stírají rozdíly (v kategorii množství kódu) mezi jednotlivými programovacími jazyky."Legrační. Copak by na to řekli jejich zaměstnanci?
Re: Lisp a LSD
celé vláknoSpolečnost, kde nyní pracuji by mohla mít podobné stránky (zkracuji):
používáme různé technologie:
RPG - protože nám dává maximální kontrolu nad systémem AS/400
Visual Basic - pro rychou tvorbu aplikací a maximální uživatelskou přívětivost
C++ - pro maximální výkon
Java - pro vysoký výkon a snadou přenositelnost serverových aplikací
Skutečnost je ovšem taková - používáme tyhle technologie z historických/pragmatických důvodů. RPG používáme, protože se historicky v ničem jiném pořádně na AS/400 pracovat nedalo. Visual Basic - prostě jsme potřebovali řešit problém a byl k dispozici programátor se znalostí dané domény, který pracoval v VB. Céčkové programátory má skoro každá společnost.
Téměř veškeré nové věci ovšem děláme v Javě (jedna věta ze stránek oné společnosti mě utvrzuje v tom, že oni na tom budou podobně: We began our project with a mix of Perl, Lisp and Java, but have since migrated to a pure Java codebase.)
Když máte velkou bázi kódu např. v RPG, nezačnete ho z ničeho nic přepisovat do Javy. Protože to nikdo nezaplatí... Zákazníky v podstatě nezajímá, v čem je daný produkt vytvořený (až na módu okolo J2EE v posledních letech), ale jak funguje, jak je spolehlivý, rychlý a jak je drahý...
Co se týče poslední věty... zkuste se skutečně zamyslet nad oním tvrzením... zkuste ho třeba rozporovat (může z toho být zajímavá debata :-) )... "Legrační" není přeci argument...
Re: Lisp a LSD
celé vlákno"Téměř veškeré nové věci ovšem děláme v Javě (jedna věta ze stránek oné společnosti mě utvrzuje v tom, že oni na tom budou podobně: We began our project with a mix of Perl, Lisp and Java, but have since migrated to a pure Java codebase.)"
Jistě jste si také všiml, že tahle věta se týká jakéhosi "Dataspace Browseru", což je jen jeden z mnoha jejich projektů, a že v Javě dělají web, protože na to jsou frameworky. Myslím, že přepisovat jádro search enginu by je v životě nenapadlo, protože na to žádné frameworky nejsou a nebudou, natožpak v Javě (se stále ještě nedostatečným JITem a s nepříliš pohodlným rozhraním k nativnímu kódu).
Jejich hlavní produkt ("IDOS pro celosvětové letecké spoje") začal vznikat jako nový (!) lispový projekt někdy kolem roku 2000 s cílem nahradit levnějším (Lintel clustery) a lepším (algoritmy) softwarem původní mainframové vyhledávače, které tyhle věci dělají někdy od sedmdesátých let.
Spousta zajímavých informací pochází z interního emailu a myslím, že ještě později se objevily nějaké zajímavé informace ze zákulisí, ale narychlo to nedohladám. Když se to začalo před lety vynořovat, tak jsem to sledoval.
RPG je na svou oblast použití zřejmě dost použitelný jazyk, stejně jako asi i Java, pokud jde o psaní pro konkrétní aplikační platformu. S J2EE jsem naštěstí do styku nepřišel a ani o to nestojím, musel bych si pro slušný vývoj asi dokoupit do desktopu další giga paměti a na to jsem moc líný. :-)
Apropos kompaktnost a rychlost vývoje...kdysi na to vznikla zajímavá studie, ale možná by stálo za to ji zopakovat. Každopádně C++ a Lisp se od té doby moc nepohnuly, takže jejich vztah ve výsledku by neměl být tolik ovlivněn, ale tohle je hloupé hádat, že. Java snad od té doby na ten plyn aspoň trošku přišlápla.
Re: Lisp a LSD
celé vláknoV Lispe, data su kod, a kod su data. To pre teba ale neznamena nic lebo vies trt barani o skutocnom programovani.
Re: Lisp a LSD
celé vláknoVzhledem k tomu, kde pracuji, pro me rozmezi mezi hrackou a nastrojem je, zda v tom napisu aplikaci bezici proti Oracle databazi. YMMV.
Re: Lisp a LSD
celé vláknoRe: Lisp a LSD
celé vláknoMožná by se při bližším pohledu zjistilo, že by bylo výhodnější to napsat v Javě nebo C# (dnešní IDE se snaží ruční psaní minimalizovat) nebo, pokud se někomu nechce psát moc řádek, třeba v Pythonu nebo Ruby. A i v tom C++ se dá docela kouzlit.
Re: Lisp a LSD
celé vláknoRe: Lisp a LSD
celé vláknoRe: Lisp a LSD
celé vláknoVytvorenie "noveho jazyka" je len prostriedok, nie ciel. Prostriedok ako dosiahnut vyzsiu citatelnost jazyka.
Urcite viete, ze jazyky sa od seba delia aj urovnou abstrakcie, ktoru poskytuju. Bezne jazyky maju datovu (a pripadne riadiacu abstrakciu - teraz si niesom isty tymito nazvami, ale o to nejde). V takom Cecku Pepa implementuje udajovu strukturu stromu, alebo prioritnej fronty. Niekam do dokumentacie napise ako s nou narabat - a hotovo... mame datovu abstrakciu. Vy pouzivate funkcie ako add_node a pod. a vobec vas nezaujima ako to Pepa vnutri naimplementoval. Ak Pepa odide, nic sa nedeje (ak je jeho implementacia korektna, samozrejme...).
Toto vsetko ma aj Lisp, plus ma nieco, co vami menovane jazyky nemaju, a to syntakticku abstrakciu. Tato abstrakcia vam umoznuje nie len vymysliet a implementovat datove struktury, ktore ostatnym ulahcia pracu, ale aj vytvorit "jazyk" na pohodlnu manipulaciu s nimi. A mnoho dalsieho...
Myslim ze je najdolezitejsie pochopit "krasu a silu" toho, ked nieje rozdiel medzi datami a programom. Ja by som uz Lisp nemenil za iny jazyk (len sa trosku bojim, ze budem musiet... drviva vacsina IT firiem v cechach a na slovensku zial nevie co je Lisp... kopaci kanalov s "modernymi" krompacmi ako Java, C# a pod...)
Re: Lisp a LSD
celé vláknoVytvorenie "noveho jazyka" je len prostriedok, nie ciel. Prostriedok ako dosiahnut vyzsiu citatelnost kodu (programu).
Aha a toto, niektore z toho stoji za precitanie:
http://norvig.com/
Re: Lisp a LSD
celé vláknoRe: Lisp a LSD
celé vláknoV Lispe nepotrebujete ziaden externy nastroj, to robi ten jazyk tym cim je... ale aspon ste uznali, ze je to uzitocne :)... ved preto sa o nieco podobne snazia aj ine jazyky. Skuste si ale predstavit to, ze nieje ziaden preprocesor, ziadne "pretazovanie" operatorov a pod... Ze mate jazyk, v ktorom mozete pisat kod, ktory generuje kod - a to bez obmedzenia nejakym inym jazykom preprocesora, ale presne takym istym jazykom do akeho kod generujete.
Meta-programovanie je mocna zbran, a "brana" do pre vas netusenych moznosti, ako vyjadrit svoje myslienky. Lisp je jazyk, ktory vam nehadze polena pod nohy. Vyberiete si paradigmu (proceduralnu, objektovu - CLOS, funkcionalnu... pripadne ich kombinaciu), ktora sa vam najviac pre dany problem hodi, upravite si jazyk tak, aby sa vam to co najlepsie, najrychlejsie a najcitatelnejsie pisalo...
Pretazovanie operatorov... ach jaj... keby ste len vedeli co vsetko mozete v lispe... :) Skusali ste niekedy implementovat v C++ matice a na pracu s nimi pouzit pretazene operatory? Ak nie skuste... hadajte kolko-krat sa skopiruje matica (objekt) pre napr: A = B + C; ... :)
btw CLOS: http://en.wikipedia.org/wiki/Common_Lisp_Object_System
Este jedna vec k syntaxi. Ak ju raz clovek pochopi, zisti ze vlastne nemoze byt moc ina... a co je dolezitejsie, so spravnymi editormi (parent-matching a automaticke odsadzovanie) sa stane velmi mocnou zbranou. Len z tvaru funkcie sa da zistit, ci je pisana funkcionalne alebo proceduralne :)... ale to len tak btw...
Nebojte sa Lispu, na vysokych skolach je znasilnovany k uceniu funkcionalneho programovania... verte mi... ja som Lisp na skole nenavidel, ked nas ho "ucili"... nastastie som nezanevrel a isiel na neho uplne inak... a nelutujem...
Re: Lisp a LSD
celé vláknoNapříklad v Pythonu taky poznám hned, kdy se používá funkcionální, kdy procedurální a kdy objektové paradigma. ;-)
Já jsem na VŠ absolvoval kurs Lispu, dokonce je mi ten jazyk i v mnohém sympatický a lákají mě i další jazyky, ale to neznamená, že v těch jazycích budu chtít automaticky dělat věci, které mě živí. Chtěl jsem vyvolat zajímavou polemiku o některých otázkách spíše z pragmatického pohledu. Já netvrdím, že se v Lispu nedá nic pořádného udělat, akorát bych rád slyšel nějaké pádné argumenty, proč a kdy je dobré nasadit Lisp. Že Paul Graham programuje v Lispu, je asi jasné, ale pro mě z toho nic moc nevyplývá. Že nějaká firma X použila pro projekt Y jazyk Z a pochvaluje si to, také automaticky neznamená, že by to s jazykem W nezvládla lépe.
Re: Lisp a LSD
celé vláknoNa ake projekty by som ho doporucil? Asi na cokolvek, ale obzvlast sa hodi na projekty, ktore su "velka neznama"... ked treba kodit nieco, co neviete ako a kde...:) Svojou flexibilitou sa na toto velmi hodi... skratka XP-programovanie, rychle prototypovanie a pod...
Pod pojmom "velka neznama" nemyslim informacny system, ktory ma byt usity na mieru zakaznikovi, ktory meni poziadavky kazdy den... to je ina velka neznama :). Mam na mysli skor expertne systemy, blackboard systemy, umelu inteligenciu v kombinacii s niecim inym este a pod... tam sa podla mna hodi lisp najviac...
Re: Lisp a LSD
celé vláknoAsi som to trochu zle napisal... referencie pouzit ide, pretazi sa + aj =, a kopiruje sa ta nova matica, teda napr...
A = (B + C) + D;
B + C - jedna matica X
X + D - druha matica Y
A = Y
funguje to takto niejako, nie?... lenze B + C aj X + D musia tu maticu (X, resp. Y) vytvorit pomocou operatora new, to znamena v heape, nie na zasobniku (aby po ukonceni funkcie/operatora + stale existovala)... povedzte mi ako ju potom upracem, zmazem????
Ak je nieco zle na tom, co som tu pisal, tak mi povedzte, rad sa poucim (vazne, nemyslim to ironicky, je kludne mozne ze sa mylim) :)
Re: Lisp a LSD
celé vláknoRe: Lisp a LSD
celé vláknoRe: Lisp a LSD
celé vláknoRe: Lisp a LSD
celé vláknoRe: Lisp a LSD
celé vláknoMatice &A = B + C;
pak nikoliv. Samozřejmě ale předpokládám, že operator+ vytvoří novou matici, ale je možné změnit jednu z původních "in place" a vrátit referenci na ni. Každopádně si nemyslím, že by se tohle dalo vyřešit v nějakém jazyce výrazně lépe.
Abych řekl pravdu, na programování třeba expertních systémů mi více sedí jazyky typu Prolog, ale uznávám, že flexibilita Lispu by mohla v podobných případech pomoci. Podobně jako tng vidím ale největší brzdu v nedostatku vhodných knihoven (rychlý GUI prototyp udělám třeba v PyQt nebo PyGtk, v CL to asi tak snadné nebude a podobně v dalších oblastech - zkrátka CL nemá "batteries included" jako některé jiné jazyky), je ale třeba možné uvažovat o použití Lispu nad JRE, což by ten handicap poněkud snížilo. A vývojářů ochotních používat Lisp asi taky bude o něco méně, jak výše jmenovaný předřečník taky zmiňoval.
Re: Lisp a LSD
celé vlákno(with-matrix (A B C D) (setf A (+ (+ B C) D)))Staci napisat funkciu na scitanie dvoch matic, ktore modifikuju tretiu:
(defun matrix+ (dest-matrix source-matrix-1 source-matrix-2) "nejaky kod co nasetuje dest-matrix")Makro with-matrix by sa rozlozilo na nieco taketo (jeho kod by myslim nebol zlozity, nejaka ta rekurzia):
(progn (matrix+ A (matrix+ A B C) D) A)Toto je samozrejme len nacrt, nechce sa mi to teraz kodit :)... len som chcel demonstrovat, co vsetko je mozne s lisp makrami... a sak o tom je aj tento clanok, nie?
Btw: toto len pre toho koho to zaujima... myslim ze vo forme (seft A ..bla bla..), v tom ...bla bla.. by sa v tomto pripade nemohlo pouzit samotne A, lebo funkcia matrix+ robi na A side-effect...
Re: Lisp a LSD
celé vlákno(with-matrix (A B C D) (A = ((B + C) + D)))A este k tym GUI... no hej, existuje ich par:
http://www.cliki.net/Graphics%20Toolkit
Ale pravda je, ze o klavite a rychlosti niektorych z nich by sa dalo polemizovat... ja pouzivam vyhradne REPL ked pracujem so svojimy programami... ked som potreboval nieco jednoduche vykreslit, pouzil som LTK (Tcl/Tk binding, mnou trosku upraveny... uznavam ze to nieje nic moc...). Inak kniznic do CL je hromada a na vselico, doporucujem popozerat spomenute www.cliki.net
Re: Lisp a LSD
celé vláknoJen reference nevyřeší vše. Ještě přidám jeden způsob "kopírování" matic. Při overloaded operatoru+ se nevrátí class "matice" ale jiná (třeba zděděná) struktura, kterou nazveme třeba "generovana_matice". A tím dáme v compile-time najevo, že do takovéto matice se dá "hrabat", není const, můžeme do ní zapisovat následující výsledek a že smíme její data ukrást pro cíl.
Technicky, předpokládám, že class "matice" neobsahuje vlastní data, ale jen odkaz na alokovanou strukturu, plus nějaké info o rozměrech. V copy constructrou se pak nemusí udělat new a memcpy, stačí zkopírovat pointer (z generované matice).
A kdybych to chtěl dotáhnout fakt až do konce, tak i info o rozměrech přesunu do onoho alokovaného prostoru a class matice i generovana_matice je jen pointer na data. Proč to? Protože pokud mám dobrý kompilátor (umí to i borland 5.0 z před 12 lety) a pointer má stejný sizeof jako int, tak kompilátor dokáže divy - při return matice nealokuje žádné extra místo na stacku, celý class (4 bytes) vrátí via (E}AX;
Potom např. deklarace "matice A=B+C;" provede _jediný_ construktor, kterým je právě jeden copy constructor. A bude-li to z "generovane_matice" tak copy constructor sestává z překopírování ukazatele. Vše. Přičemž overloaded operator+ provede new pro cílová data B+C.
Obdobně, "matice A=B+C+D;" provede nejprve B+C, vrátí generovanou matici. Pak se provede (jiný) overloaded operator+ (generovaná_matice&, const matice& D) který přímo do generované (tedy už bez new) přičte D. Nakonec se obdobně jako v předchozím odstavci copy constructorem vyplní A (opět jen kopie pointerů, ne dat).
Pokud bychom nepoužili sčítání při dekladaci A, ale až později přiřazení:
matice A;
... něco...
A=B+C+D;
tak přibude navíc volání default constructoru A (při deklaraci) ... pravděpodobně vyplnění 0 do pointeru na data. Následně pak overloaded operator= (přiřazení do A) by se nejprve pokusil smazat stará data (zde pointer 0, delete neproběhne, ale kontrola tam být musí pro jiné případy) a pak do toho pointeru se dal hodnotu pointeru z generovana_matice. Tedy opět žádné new a kopie dat matice.
---
Všechny příklady předpokládají, že po přesunu pointeru z generované matice se její pointer nuluje. Ale i tak se při destrukci generované matice musí jistotu kontrolovat a při nenulovém delete data. To jen pro případ, kdybychom jen tak napsali "B+C+D;" bez přiřazení. Nejsem si totiž jist, zda při takovém šíleném overloadování se dá v comile-time jednoznačně určit, že jde o nonvolatile operace a že si kompilátor může dovolit celý výraz nevykonat.
Re: Lisp a LSD
celé vlákno... deklarace "matice A=B+C;" provede _jediný_ construktor ...
Má být jediný (copy) constructor _pro A_. Předtím se musí ještě vykonat constructor generované matice.
Tedy, že "matice A=B+C;" kompilátor přeloží jako "matice A(B+C);" a ne "matice A; A=B+C;"
Re: Lisp a LSD
celé vláknoRe: Lisp a LSD
celé vlákno1) Pro A=B+C; se vždy a ve všech prog. jazycích musí číst dvě matice {B,C) a uložit do alokované třetí (A). Pokud to nechci, tak použít třeba B+=C;
2) "new / malloc" bývá celkem optimalizované na rychlost. A to je jediné, čim se B+C liší od B+=C. Vždy se musí pushnout double z konkrétního místa C, pushnout double z konkrétního místa B, add, pop na konkrétní místo (B nebo A). FP operace se pokud vím stále nedokáží provádět přímo na cílovém místě v paměti - pokud se mýlím a umí to, tak se omlouvám (už to nějaký ten pátek nesleduji tak podrobně).
A teď co je rychlejší. FP add, sub, ..., nebo memory read & write. V dnešní době L1, L2, ... si netroufám odhadovat. Pravda, možná tady by se projevila výhoda "+=" oproti samotnému "+".
Re: Lisp a LSD
celé vláknoRe: Lisp a LSD
celé vláknoV LISPu jsem napsal jenom několik velmi drobných studijích příkladů na vysoké škole.
On LISP, stejně jako jiné akademické projekty, není nezajímavý... je jen pro řešení většiny reálných problémů nepraktický... a myslím, že to velmi dobře odráží "mohutnost" skupiny jeho uživatelů...
Re: Lisp a LSD
celé vláknoRe: Lisp a LSD
celé vlákno- nejrůznější webové aplikace, např. eShopy, přímé bankovnictví, redakční systémy, zákaznické webové aplikace
- jakákoliv desktopová aplikace, browser, ftp klient, grafický editor, CAD aplikace, přehrávač multimédií, atd. atd. atd.
- výkonné serverové aplikace, databáze, webové servery, indexování obsahu, simulace proudění kapalin atd...
Re: Lisp a LSD
celé vláknoRe: Lisp a LSD
celé vláknoPokud je mi známo (a to se můžu skutečně velmi mýlit, protože jde o oblast mi relativně vzdálenou), sám Autodesk od AutoLISPu upustil a už léta ho nerozvíjí (nemůže ho ovšem odstranit, když jak sám píšete existuje velká spousta aplikací, které ho využívají).
Re: Lisp a LSD
celé vláknoRe: Lisp a LSD
celé vláknoRe: Lisp a LSD
celé vláknoRe: Lisp a LSD
celé vláknoneco jineho uz je "bezne" programovani kde pro lisp existuje spoustu ruznych implementaci a kde si clovek musi vyslapat tu svoji spravnou cesticku a nebo si koupit napriklad allegro common lisp ktery stoji neco pres 100t a pak je bez problemu pouzitelny i na kompletni aplikaci. sam jsem vyzkousel ekvivalent javove knihovny struts, a je to opravdu nesrovnatelne s javovou verzi. je to velice jednoduche a pritom nezjednodusene oproti struts v jave, ostatne jako vetsina veci v lispu :-)
Re: Lisp a LSD
celé vláknoNe, opravdu nefetuju. Ale za tímhle si stojím :-D
Re: Lisp a LSD
celé vláknoRe: Lisp a LSD
celé vláknoRe: Lisp a LSD
celé vláknoFakt, že LSD je halucinogen (to je samozřejmě pravda) není v rozporu s tvrzením, že je to tvrdá droga.
Dělení drog na měkké a tvrdé je samo o sobě dost diskutabilní... ale pokud na ně přistoupíme, pak LSD je řazeno spíše do skupiny tvrdých drog.
Re: Lisp a LSD
celé vláknoCas aplikace makra
celé vláknoRe: Cas aplikace makra
celé vláknodefmacrovaná makra se vyhodnocují v compile-time, jen v tom prvním příkladě měla ta (asi poměrně nešťastná) formulace znamenat, že v REPLu se výsledná forma vyhodnotí hned po makroexpanzi. (A vyhodnotí ji samozřejmě eval již bez asistence makroexpandéru.)

