Чему мы можем научиться у Lisp'а?

2,289 views

Published on

Published in: Technology, Education
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
2,289
On SlideShare
0
From Embeds
0
Number of Embeds
29
Actions
Shares
0
Downloads
22
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Чему мы можем научиться у Lisp'а?

  1. 1. Всеволод Дёмкин Чему мы можем научиться у Lisp'а?
  2. 2. Кратко о Lisp - 50 лет - “Программируемый язык программирования” - Динамический, мультипарадигменный
  3. 3. Lisp MacLisp InterLisp ZetaLisp Scheme NewLisp Common Lisp Clojure Arc NuLisp Emacs Lisp Dylan
  4. 4. Peter Norvig , PAIP, 1992 http://norvig.com/paip.html What makes Lisp different? - Built-in support for lists - Automatic storage management - Dynamic typing - First-class functions - Interactive environment - Uniform syntax - Extensibility - History
  5. 5. Phillip Greenspun's 10 th rule of programming Any sufficiently complicated C or Fortran program contains an ad hoc informally-specified bug-ridden slow implementation of half of Common Lisp.
  6. 6. Guy Steele, автор спецификации Common Lisp, со-автор спецификации Java C++ Java Python Ruby Lisp We were after the C++ programmers. We managed to drag a lot of them about halfway to Lisp.
  7. 7. (cl-who:with-html-output-to-string (s nil :prologue &quot;<?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; ?>&quot;) (:rss :version &quot;2.0&quot; :|xmlns:atom| &quot;http://www.w3.org/2005/Atom&quot; (:channel (:title &quot;Новые переводы&quot;) (:link &quot;http://tedxkyiv.com&quot;) (:|atom:link| :href &quot;http://tedxkyiv.com/feed&quot; :rel &quot;self&quot; :type &quot;application/rss+xml&quot;) (:description &quot;Список новых переводов.&quot;) (iter (:for item :in (mapcar #'cdar (cdadar (with-input-from-string (in (drakma:http-request *url*)) (json:decode-json in))))) (:for link := (strcat &quot;http://ted.com/&quot; (cl-ppcre:scan-to-strings &quot;href=&quot;.*&quot;&quot; item))) (htm (:item (:title (str (cl-ppcre:scan-to-strings &quot;<dt class=&quot;thumbnail&quot;>(.*)</dt>&quot; item))) (:link (str link)) (:guid (str link)) (:description (str (cl-ppcre:scan-to-strings &quot;<dd>(.*)</dd>&quot; item))))))))) Форма — это черный ящик, клетка, живой организм
  8. 8. Kent Pitman http://www.nhplace.com/kent/Papers/ Condition-Handling-2001.html The establishment of protocols is a sort of before-the-fact hedge against the &quot;prisoner's dilemma&quot;; that is, it creates an obvious way for two people who are not directly communicating to structure independently developed code so that it works in a manner that remains coherent when such code is later combined.
  9. 9. Протоколы Common Lisp - Метаобъектный - Сигнальный - Множественных возвращаемых значений - …
  10. 10. Функциональная парадигма - краткий и ясный код протокол функций высших порядков (map, reduce, find, remove, funcall/apply,…) функция-объект + коллекция - но практично!
  11. 11. Действительно большие системы - ОО - скрипты не масштабируется! Fractal programming http://olabini.com/blog/2008/06/ fractal-programming/ Ola Bini , JRuby Team
  12. 12. Case study: fin-ack.com
  13. 13. Для скептиков — нет единственно-правилного пути Андрей Москвитин http://archimag-dev.blogspot.com/2009/11/closure-template-5.html 5 дней — парсер и Common Lisp backend, компилирующий шаблоны в машинный код (на платформах, умеющих это, например на SBCL). Поддерживаются все управляющие конструкции, все указанные в спецификации операторы и функции. Система уже достаточно неплохо отлажена и готова к использованию. Размер исходного код — менее 800 строк кода на Common Lisp (оригинальный Java backend — 15 000). Какие-либо &quot;навороченные&quot; библиотеки не используются, только регулярные выражения, да штатные средства символьных вычислений, плюс есть зависимость от моей же библиотеки wiki-parser, но в ней менее 200 строк значимого для данной задачи кода...
  14. 14. Language-oriented programming - code is data - data is code (data-driven design) Rainer Joswig http://bc.tech.coop/ blog/050711.html Writing DSL's in Lisp = putting parentheses around the specification and make it run
  15. 15. Case study: CL-REDIS
  16. 16. http://groups.google.com/group/comp.lang.lisp/browse_frm/thread/b25de73bbe5eb9ba/de4230026ed741c6 Pascal Costanza The only easy way to do metaprogramming in Java is by writing interpreters — which is quite widely used — or by hiring lots of programmers and give them a catalogue of patterns to instantiate. The easiest way to do metaprogramming in Lisp is by using macros, which can be easily compiled away, so you don't have the same overhead as that of an interpreter at runtime. So my guess is that there is some form of interpreter running in the Java program that slows everything down.
  17. 17. Exploratory programming - Понастоящему интерактивная среда - Динамические пакеты и системы TDD REPL
  18. 18. Что нам стоит сделать язык расширяемым? 1. Гомоиконность 2. Ортогональность в основе 3. Отдать контроль программисту - Read time - Eval time - Run time
  19. 19. Зачем? Joel Moses APL is like a diamond. It has a beautiful crystal structure; all of its parts are related in a uniform and elegant way. But if you try to extend this structure in any way — even by adding another diamond — you get an ugly kludge. LISP, on the other hand, is like a ball of mud . You can add any amount of mud to it and it still looks like a ball of mud.
  20. 20. Итак, чему мы можем научиться у Lisp'а?
  21. 21. Всеволод Дёмкин [email_address] http://twitter.com/vseloved http://github.com/vseloved

×