with-gensyms
pochází z vynikající knihy Petera Seibela Practical Common Lisp.
(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*...
(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... :)
"...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...)
"Čí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?
"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.
(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?
(with-matrix (A B C D) (A = ((B + C) + D)))A este k tym GUI... no hej, existuje ich par:
defmacro
vaná 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.)