<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-7702415956280909075</id><updated>2012-02-16T02:08:19.699-08:00</updated><title type='text'>Изучаем LISP</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://lisplearn.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7702415956280909075/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://lisplearn.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Валерий Замараев</name><uri>http://www.blogger.com/profile/08940019495293368111</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>27</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-7702415956280909075.post-4903422706771544695</id><published>2010-08-23T06:52:00.000-07:00</published><updated>2010-08-23T07:06:33.424-07:00</updated><title type='text'>Закрыть все буфера TRAMP'а в Emacs</title><content type='html'>Вот так в emacs'е можно закрыть все буфера tramp'а. Чтобы не искать руками в ibuffer, просто набираем M-x kill-tramp-buffers. Иногда мне это нужно, чтобы не путаться, на какой машине я редактирую сейчас файлы, переходя от одной машине к другой.&lt;br /&gt;&lt;br /&gt;&lt;pre style='color:#000000;background:#ffffff;'&gt;&lt;span style='color:#3f7f59; '&gt;;;; a shortcut to kill all tramp buffers at once&lt;/span&gt;&lt;br /&gt;&lt;span style='color:#3f7f59; '&gt;;;;&lt;/span&gt;&lt;br /&gt;(&lt;span style='color:#7f0055; font-weight:bold; '&gt;require&lt;/span&gt; 'ibuffer)&lt;br /&gt;&lt;br /&gt;(&lt;span style='color:#7f0055; font-weight:bold; '&gt;defun&lt;/span&gt; tramp-buffer-p (&lt;span style='color:#7f0055; font-weight:bold; '&gt;buf&lt;/span&gt;)&lt;br /&gt;  &lt;span style='color:#2a00ff; '&gt;"is this buffer tramp's one"&lt;/span&gt;&lt;br /&gt;  (&lt;span style='color:#7f0055; font-weight:bold; '&gt;or&lt;/span&gt; (&lt;span style='color:#7f0055; font-weight:bold; '&gt;string-match&lt;/span&gt; &lt;span style='color:#2a00ff; '&gt;"^\\*tramp"&lt;/span&gt; (&lt;span style='color:#7f0055; font-weight:bold; '&gt;buffer-name&lt;/span&gt; buf))&lt;br /&gt;      (&lt;span style='color:#7f0055; font-weight:bold; '&gt;tramp-tramp-file-p&lt;/span&gt; (&lt;span style='color:#7f0055; font-weight:bold; '&gt;with-current-buffer&lt;/span&gt; buf&lt;br /&gt;                            (&lt;span style='color:#7f0055; font-weight:bold; '&gt;ibuffer-buffer-file-name&lt;/span&gt;)))))&lt;br /&gt;&lt;br /&gt;(&lt;span style='color:#7f0055; font-weight:bold; '&gt;defun&lt;/span&gt; kill-tramp-buffers ()&lt;br /&gt;  &lt;span style='color:#2a00ff; '&gt;"kill all TRAMP buffers"&lt;/span&gt;&lt;br /&gt;  (&lt;span style='color:#7f0055; font-weight:bold; '&gt;interactive&lt;/span&gt;)&lt;br /&gt;  (&lt;span style='color:#7f0055; font-weight:bold; '&gt;dolist&lt;/span&gt; (&lt;span style='color:#7f0055; font-weight:bold; '&gt;buf&lt;/span&gt; (&lt;span style='color:#7f0055; font-weight:bold; '&gt;buffer-list&lt;/span&gt;))&lt;br /&gt;    (&lt;span style='color:#7f0055; font-weight:bold; '&gt;when&lt;/span&gt; (&lt;span style='color:#7f0055; font-weight:bold; '&gt;tramp-buffer-p&lt;/span&gt; buf)&lt;br /&gt;      (&lt;span style='color:#7f0055; font-weight:bold; '&gt;kill-buffer&lt;/span&gt; buf))))&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7702415956280909075-4903422706771544695?l=lisplearn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lisplearn.blogspot.com/feeds/4903422706771544695/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://lisplearn.blogspot.com/2010/08/tramp-emacs.html#comment-form' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7702415956280909075/posts/default/4903422706771544695'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7702415956280909075/posts/default/4903422706771544695'/><link rel='alternate' type='text/html' href='http://lisplearn.blogspot.com/2010/08/tramp-emacs.html' title='Закрыть все буфера TRAMP&apos;а в Emacs'/><author><name>Валерий Замараев</name><uri>http://www.blogger.com/profile/08940019495293368111</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7702415956280909075.post-8452670832385578784</id><published>2009-09-04T06:42:00.000-07:00</published><updated>2009-09-04T06:59:14.006-07:00</updated><title type='text'>Наваял в первом приближении нечто, способное генерить код, похожий на  PHP</title><content type='html'>Фактически это pretty-printer скобочный выражений, которые должны примерно соответсвовать языку PHP. Но! Есть macroexpand. Правда макросы определяются на host-языке, т.е. на Common Lisp, а не на target языке, т.е. в самом языке нет (пока) defmacro, macrolet, symbol-macrolet, (мне кажется что expansion code все равно надо писать на common lisp, а не на PHP, так что полезность defmacro et al. в target языке под вопросом). Глюков там еще хватает. &lt;a href="http://github.com/valeryz/MacroPHP/tree/master"&gt;Лежит на github'е &lt;/a&gt;но это пока довольно бесполезная штука. Потому что чем писать на PHP в скобочном синтаксисе, лучше писать в родном. В скобочном синтаксисе надо писать на LISP или Scheme, а это совсем другое, кроме макросов все же хочется иметь полноценные замыкания, полноценную lambda. Для этого надо делать flattening envionrment'а (не знаю как это переводится) через lambda lifting (тоже не знаю), что нафиг убъет всю читаемость сгенеренного кода. Вот уже неделю думаю, читаю умные книжки, надо такое делать или нет, или пускай будет PHP в скобочном варианте с макросами? Хотя emacs lisp ведь без замыканий живет и ничего. Надо  осилить Lisp in Small Pieces,  начиная от денотационной семантики и дальше, может натолкнет на какие-то мысли.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7702415956280909075-8452670832385578784?l=lisplearn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lisplearn.blogspot.com/feeds/8452670832385578784/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://lisplearn.blogspot.com/2009/09/php.html#comment-form' title='Комментарии: 3'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7702415956280909075/posts/default/8452670832385578784'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7702415956280909075/posts/default/8452670832385578784'/><link rel='alternate' type='text/html' href='http://lisplearn.blogspot.com/2009/09/php.html' title='Наваял в первом приближении нечто, способное генерить код, похожий на  PHP'/><author><name>Валерий Замараев</name><uri>http://www.blogger.com/profile/08940019495293368111</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7702415956280909075.post-1667385615960949615</id><published>2009-08-03T06:19:00.000-07:00</published><updated>2009-08-03T06:22:11.432-07:00</updated><title type='text'>pretty printer</title><content type='html'>А еще в Common LISP есть совершенно замечательный настраиваемый pretty-printer, который можно использовать не только для того, чтобы печатать в синтаксисе лиспа. Вот, например, как &lt;a href="http://www.merl.com/papers/TR93-17/"&gt;генерится код на Паскале&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7702415956280909075-1667385615960949615?l=lisplearn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lisplearn.blogspot.com/feeds/1667385615960949615/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://lisplearn.blogspot.com/2009/08/pretty-printer.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7702415956280909075/posts/default/1667385615960949615'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7702415956280909075/posts/default/1667385615960949615'/><link rel='alternate' type='text/html' href='http://lisplearn.blogspot.com/2009/08/pretty-printer.html' title='pretty printer'/><author><name>Валерий Замараев</name><uri>http://www.blogger.com/profile/08940019495293368111</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7702415956280909075.post-5815661407874402818</id><published>2009-07-30T02:02:00.001-07:00</published><updated>2009-07-30T02:26:20.082-07:00</updated><title type='text'>Кодогенерация: Common Lisp vs. Emacs Lisp</title><content type='html'>Одно из применений лиспа - это генерация кода, в т.ч. не только на лиспе, но и на других языках. Вот я думаю, может для этой задачи ограничиться Emacs Lisp, а не тащить common lisp?&lt;br /&gt;&lt;br /&gt;Потенциальные преимущества:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Emacs есть везде и под все, а Common Lisp - нет (для меня несущественно, но все же).&lt;/li&gt;&lt;li&gt;Собственно генерация кода нужна именно для автоматизации программирования, что в принципе  кажется Emacs'овой задачей.&lt;/li&gt;&lt;li&gt;Язык сам по себе попроще будет, при этом, просмотрев исходники &lt;a href="http://common-lisp.net/project/parenscript/"&gt;parenscript&lt;/a&gt;, на первый взгляд не нашел там ничего такого, что нельзя было бы сделать на Emacs Lisp. Местами используется CLOS, но это несущественно.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Недостатки:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;В Emacs Lisp нет READ-макросов, что несколько ограничивает создание DSL, и делает невозможными красоты типа CL-INTERPOL&lt;/li&gt;&lt;li&gt;При макроподстановке не выполняется destructuring, (собственно он в Emacs Lisp обнаружен не был), что тоже может быть неудобно.&lt;/li&gt;&lt;li&gt;Отсутствие lexical closures в основной верии Emacs, lexical-let не в счет - не могу понять последствия для этой задачи.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7702415956280909075-5815661407874402818?l=lisplearn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lisplearn.blogspot.com/feeds/5815661407874402818/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://lisplearn.blogspot.com/2009/07/common-lisp-vs-emacs-lisp.html#comment-form' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7702415956280909075/posts/default/5815661407874402818'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7702415956280909075/posts/default/5815661407874402818'/><link rel='alternate' type='text/html' href='http://lisplearn.blogspot.com/2009/07/common-lisp-vs-emacs-lisp.html' title='Кодогенерация: Common Lisp vs. Emacs Lisp'/><author><name>Валерий Замараев</name><uri>http://www.blogger.com/profile/08940019495293368111</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7702415956280909075.post-3250662348124466832</id><published>2009-06-25T04:57:00.001-07:00</published><updated>2009-06-25T05:05:45.527-07:00</updated><title type='text'>Читаю книжку Programming Clojure</title><content type='html'>Нужно написать нечто, и кажется что на JVM это нечто будет работать лучше всего. Хотя проект не терпит всякие "альтерниативные" языки в production коде, так как мои знания Джавы мягко говоря не очень, то мне или долго писать на Java, или выучить Clojure и быстро на нем переписать прототип, ранее сделанный на Сommon LISP, чтобы быстрее заняться другими делами, и если все будет хорошо, потом уже аккуратно сделать Java вараинт. &lt;br /&gt;&lt;br /&gt;Книжка не очень большая, меньше 300 страниц, и легко читается, по крайней мере первые 4 главы прочел уже довольно быстро. Сам Clojure хорош (по сравнению с Java так вообще, но ... если вам не надо Java, то возьмите лучше Common LISP. Из JVM-hosted языков знаком немного с Jython, и отличие вижу в том, что в то время как Jython старается как можно больше быть похожим на C Python, Clojure этим не страдает, его задача - максимально легко использовать Java с помошью приятного функционального язычка, а на что оно похоже - не важно.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7702415956280909075-3250662348124466832?l=lisplearn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lisplearn.blogspot.com/feeds/3250662348124466832/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://lisplearn.blogspot.com/2009/06/programming-clojure.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7702415956280909075/posts/default/3250662348124466832'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7702415956280909075/posts/default/3250662348124466832'/><link rel='alternate' type='text/html' href='http://lisplearn.blogspot.com/2009/06/programming-clojure.html' title='Читаю книжку Programming Clojure'/><author><name>Валерий Замараев</name><uri>http://www.blogger.com/profile/08940019495293368111</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7702415956280909075.post-6336879262864884680</id><published>2009-06-18T01:25:00.001-07:00</published><updated>2009-06-18T01:29:13.006-07:00</updated><title type='text'>Closure Oriented Programming</title><content type='html'>Closure Oriented Programming (from http://letoverlambda.com/) hinders interactive development. I find it much easier to have separate defuns operating on  complex data structures than function that are deeply nested within a "network" of closures. Despite we have fewer code lines with closures, than with declaring separate structs or classes, with more traditional approach, the code and data is much easier to explore from REPL.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7702415956280909075-6336879262864884680?l=lisplearn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lisplearn.blogspot.com/feeds/6336879262864884680/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://lisplearn.blogspot.com/2009/06/closure-oriented-programming.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7702415956280909075/posts/default/6336879262864884680'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7702415956280909075/posts/default/6336879262864884680'/><link rel='alternate' type='text/html' href='http://lisplearn.blogspot.com/2009/06/closure-oriented-programming.html' title='Closure Oriented Programming'/><author><name>Валерий Замараев</name><uri>http://www.blogger.com/profile/08940019495293368111</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7702415956280909075.post-110201944691634570</id><published>2009-06-09T10:16:00.000-07:00</published><updated>2009-06-09T10:17:12.202-07:00</updated><title type='text'>let*</title><content type='html'>Почему-то не нравится let*. Хочется писать вложенные let, хоть это и больше скобок и индентации.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7702415956280909075-110201944691634570?l=lisplearn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lisplearn.blogspot.com/feeds/110201944691634570/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://lisplearn.blogspot.com/2009/06/let.html#comment-form' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7702415956280909075/posts/default/110201944691634570'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7702415956280909075/posts/default/110201944691634570'/><link rel='alternate' type='text/html' href='http://lisplearn.blogspot.com/2009/06/let.html' title='let*'/><author><name>Валерий Замараев</name><uri>http://www.blogger.com/profile/08940019495293368111</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7702415956280909075.post-1449955524190969657</id><published>2009-06-05T15:08:00.000-07:00</published><updated>2009-06-05T15:10:52.269-07:00</updated><title type='text'>SXHASH</title><content type='html'>Странно работает SXHASH. Если считать хеш символа, то в 32-bit SBCL значения идут чуть ли не подряд (fixnum в районе 300 тыс. ). В Clozure CL вообще  кажется идут ASCII коды символов!  Если я взял символы от A до Z, как мне получить значения хеша, равномено распределенные в некотором интервале?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7702415956280909075-1449955524190969657?l=lisplearn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lisplearn.blogspot.com/feeds/1449955524190969657/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://lisplearn.blogspot.com/2009/06/sxhash.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7702415956280909075/posts/default/1449955524190969657'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7702415956280909075/posts/default/1449955524190969657'/><link rel='alternate' type='text/html' href='http://lisplearn.blogspot.com/2009/06/sxhash.html' title='SXHASH'/><author><name>Валерий Замараев</name><uri>http://www.blogger.com/profile/08940019495293368111</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7702415956280909075.post-9144557040596001022</id><published>2009-06-04T09:17:00.000-07:00</published><updated>2009-06-04T09:19:34.508-07:00</updated><title type='text'>SLIME и PACKAGES</title><content type='html'>Обнаружил, что надо в файле обяазательно писать (in-package :mypacakge), чтобы из буфера slime-compile-defun и прочие делали это в правильном пекедже. SLIME просто ищет in-package в тексте буфера.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7702415956280909075-9144557040596001022?l=lisplearn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lisplearn.blogspot.com/feeds/9144557040596001022/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://lisplearn.blogspot.com/2009/06/slime-packages.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7702415956280909075/posts/default/9144557040596001022'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7702415956280909075/posts/default/9144557040596001022'/><link rel='alternate' type='text/html' href='http://lisplearn.blogspot.com/2009/06/slime-packages.html' title='SLIME и PACKAGES'/><author><name>Валерий Замараев</name><uri>http://www.blogger.com/profile/08940019495293368111</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7702415956280909075.post-3238377053712685441</id><published>2009-05-29T13:21:00.000-07:00</published><updated>2009-05-29T13:33:17.196-07:00</updated><title type='text'>Книги по ЛИСПу</title><content type='html'>Хочется самые правильные книги по LISP проработать качественно. А именно хочется прорешать все упражнения. У Эли Бендерского &lt;a href="http://eli.thegreenplace.net/2008/04/18/sicp-conclusion/"&gt;заняло чуть меньше года&lt;/a&gt; прорешать весь SICP на Common LISP. У меня прорешать его на Scheme заняло месяца 2 или 3. Но во первых не все, а где-то три четверти, и я довольно плотно за него тогда взялся. Сейчас так не получится, так что надо рассчитывать, что PAIP со всем упражениями займет не меньше чем полгода, а то и год. Чтобы все это мне не надоело, его надо будет это чередовать с другими книжками, так что, надеюсь, On LISP и Let Over Lambda будут прочитаны гораздо раньше чем PAIP. Остается домучить LISP in Small Pieces, и AMOP. Еще есть в электронном виде какая-то книжица по CLOS, даже не знаю стоит ли она прочтения. Вобщем, минимум на год вперед чтения по LISP'у хватает, быстрее все осилить может и можно, но зачем?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7702415956280909075-3238377053712685441?l=lisplearn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lisplearn.blogspot.com/feeds/3238377053712685441/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://lisplearn.blogspot.com/2009/05/blog-post_29.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7702415956280909075/posts/default/3238377053712685441'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7702415956280909075/posts/default/3238377053712685441'/><link rel='alternate' type='text/html' href='http://lisplearn.blogspot.com/2009/05/blog-post_29.html' title='Книги по ЛИСПу'/><author><name>Валерий Замараев</name><uri>http://www.blogger.com/profile/08940019495293368111</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7702415956280909075.post-1805300742378283733</id><published>2009-05-29T13:12:00.000-07:00</published><updated>2009-05-29T13:18:16.050-07:00</updated><title type='text'>Обзор Common LISP</title><content type='html'>Прослушал обзорный доклад &lt;a href="http://lisp-univ-etc.blogspot.com/"&gt;Всеволода&lt;/a&gt; о среде Сommon LISP' а, включая особенности языка, ИДЕ, библиотеки, коммьюнити и пр. Я ничего не ожидал от этого доклада, ну что еще можно сказать. На удивление, презентация была очень хорошо подготовлена, и оказалась рассчитанной примерно на мой уровень, уровень человека, который уже успел попробовать Common LISP на практике, но еще маловато знает. В презентации оказалось полно buzzwords, которые нужно знать, я надеюсь, он ее выложит, и там будут кликабельные ссылки.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7702415956280909075-1805300742378283733?l=lisplearn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lisplearn.blogspot.com/feeds/1805300742378283733/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://lisplearn.blogspot.com/2009/05/common-lisp.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7702415956280909075/posts/default/1805300742378283733'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7702415956280909075/posts/default/1805300742378283733'/><link rel='alternate' type='text/html' href='http://lisplearn.blogspot.com/2009/05/common-lisp.html' title='Обзор Common LISP'/><author><name>Валерий Замараев</name><uri>http://www.blogger.com/profile/08940019495293368111</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7702415956280909075.post-6370157843997744503</id><published>2009-05-26T14:07:00.000-07:00</published><updated>2009-05-26T14:09:29.671-07:00</updated><title type='text'>Guide to Lisp Style</title><content type='html'>Хочется выписать отдельно тут:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt; Be specific&lt;br /&gt;&lt;li&gt; Use abstractions&lt;br /&gt;&lt;li&gt; Be concise&lt;br /&gt;&lt;li&gt; Use the provided tools&lt;br /&gt;&lt;li&gt; Don't be obscure&lt;br /&gt;&lt;li&gt; Be consistent&lt;br /&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7702415956280909075-6370157843997744503?l=lisplearn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lisplearn.blogspot.com/feeds/6370157843997744503/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://lisplearn.blogspot.com/2009/05/guide-to-lisp-style.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7702415956280909075/posts/default/6370157843997744503'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7702415956280909075/posts/default/6370157843997744503'/><link rel='alternate' type='text/html' href='http://lisplearn.blogspot.com/2009/05/guide-to-lisp-style.html' title='Guide to Lisp Style'/><author><name>Валерий Замараев</name><uri>http://www.blogger.com/profile/08940019495293368111</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7702415956280909075.post-7880347634991502586</id><published>2009-05-26T14:04:00.000-07:00</published><updated>2009-05-26T14:06:57.877-07:00</updated><title type='text'>PAIP</title><content type='html'>Самое начало, вторая глава: генератор последовательностей терминалов по грамматике. Казалось бы, элементарщина, хочется пропустить и пойти дальше, но если посмотреть повнимательнее, то можно придумать подходящее применение для генерации тестовых последовательностей, я даже знаю свой конкретный проект для которого это нужно.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7702415956280909075-7880347634991502586?l=lisplearn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lisplearn.blogspot.com/feeds/7880347634991502586/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://lisplearn.blogspot.com/2009/05/paip.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7702415956280909075/posts/default/7880347634991502586'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7702415956280909075/posts/default/7880347634991502586'/><link rel='alternate' type='text/html' href='http://lisplearn.blogspot.com/2009/05/paip.html' title='PAIP'/><author><name>Валерий Замараев</name><uri>http://www.blogger.com/profile/08940019495293368111</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7702415956280909075.post-7374213466288423640</id><published>2009-05-21T05:52:00.001-07:00</published><updated>2009-05-21T05:55:35.484-07:00</updated><title type='text'>Немного отвлекся от Common LISP и наваял первую наивную прогу на Emacs Lisp :)</title><content type='html'>Берет бинарный файл, и оформляет в виде C-шного массива:&lt;br /&gt;&lt;br /&gt;    &lt;pre&gt;&lt;br /&gt;(&lt;span class="keyword"&gt;defun&lt;/span&gt; &lt;span class="function-name"&gt;file-to-c-array&lt;/span&gt; (filename)&lt;br /&gt;  &lt;span class="doc"&gt;"convert a binary file into a C array of characters"&lt;/span&gt;&lt;br /&gt;  (interactive &lt;span class="string"&gt;"fFile Name: "&lt;/span&gt;)&lt;br /&gt;  (&lt;span class="keyword"&gt;let*&lt;/span&gt; ((buf (find-file-noselect filename))&lt;br /&gt;         (oldbuf (current-buffer)))&lt;br /&gt;         (&lt;span class="keyword"&gt;save-excursion&lt;/span&gt;&lt;br /&gt;           (insert &lt;span class="string"&gt;"\nconst unsigned char key[] = {"&lt;/span&gt;)&lt;br /&gt;           (set-buffer buf)&lt;br /&gt;           (beginning-of-buffer)&lt;br /&gt;           (&lt;span class="keyword"&gt;let&lt;/span&gt; ((i 0))&lt;br /&gt;             (&lt;span class="keyword"&gt;while&lt;/span&gt; (not (eobp))&lt;br /&gt;               (&lt;span class="keyword"&gt;let*&lt;/span&gt; ((c (following-char)))&lt;br /&gt;                 (forward-char)&lt;br /&gt;                 (set-buffer oldbuf)&lt;br /&gt;                 (&lt;span class="keyword"&gt;when&lt;/span&gt; (zerop (mod i 8))&lt;br /&gt;                   (insert &lt;span class="string"&gt;"\n\t"&lt;/span&gt;))&lt;br /&gt;                 (incf i)&lt;br /&gt;                 (insert (format &lt;span class="string"&gt;"0x%x, "&lt;/span&gt; c))&lt;br /&gt;                 (set-buffer buf))))&lt;br /&gt;           (set-buffer oldbuf)&lt;br /&gt;           (delete-backward-char 2)&lt;br /&gt;           (insert &lt;span class="string"&gt;"\n};\n"&lt;/span&gt;))))&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7702415956280909075-7374213466288423640?l=lisplearn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lisplearn.blogspot.com/feeds/7374213466288423640/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://lisplearn.blogspot.com/2009/05/common-lisp-emacs-lisp.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7702415956280909075/posts/default/7374213466288423640'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7702415956280909075/posts/default/7374213466288423640'/><link rel='alternate' type='text/html' href='http://lisplearn.blogspot.com/2009/05/common-lisp-emacs-lisp.html' title='Немного отвлекся от Common LISP и наваял первую наивную прогу на Emacs Lisp :)'/><author><name>Валерий Замараев</name><uri>http://www.blogger.com/profile/08940019495293368111</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7702415956280909075.post-3832210773864033328</id><published>2009-05-15T13:14:00.000-07:00</published><updated>2009-05-15T13:19:14.864-07:00</updated><title type='text'>Насчет FFI - не все так хорошо по сравнению с ctypes</title><content type='html'>Нужно было прикрутить библиотеку к ЛИСПу на винде. Взял Clozure CL. Использовать его FFI на винде как-то не получилось, долго разбираться. Пытался поставить CFFI через ADSF-Install, но ASDF-Install на винде тоже работать не захотел :( Ну я понимаю, что, помучавшись, можно все сделать, но я плюнул, запустил питон, оказалось, что тоже вполне юзабелен из Emacs'а (я к Emacs'у фактически начал привыкать после SLIME'а, до этого всегда и везде был vim). Ну и через минут десять я эту библиотеку из питона уже юзал. И только где-то через час-другой стало нехватать лиспа. Вобщем, сделайте кто-то нормальный LISP environment под виндой с FFI, очень надо!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7702415956280909075-3832210773864033328?l=lisplearn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lisplearn.blogspot.com/feeds/3832210773864033328/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://lisplearn.blogspot.com/2009/05/ffi-ctypes.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7702415956280909075/posts/default/3832210773864033328'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7702415956280909075/posts/default/3832210773864033328'/><link rel='alternate' type='text/html' href='http://lisplearn.blogspot.com/2009/05/ffi-ctypes.html' title='Насчет FFI - не все так хорошо по сравнению с ctypes'/><author><name>Валерий Замараев</name><uri>http://www.blogger.com/profile/08940019495293368111</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7702415956280909075.post-2753333536820697856</id><published>2009-05-13T08:39:00.000-07:00</published><updated>2009-05-13T08:56:35.631-07:00</updated><title type='text'>Зачем нужен ЛИСП C программисту?</title><content type='html'>Например, что вы делаете, когда вам нужно научитья пользоваться программой? Читаете документацию? Или  просто запускаете и смотрите что и как? Скорее всего и то и другое. А что если нужно научиться пользоваться новой для вас библиотекой? Документация - замечательно. А как запустить? Если у нас есть DLL'ка, ее нужно сначала загрузить в адресное пространоство процесса, а затем уметь дергать функции в  этой DLL'ке с правильной calling convention, передавать правильные аргументы и правильно интерпретировать значания. Кажется, без написания тестовых программ никак.&lt;br /&gt;&lt;br /&gt;Но я уже достаточно давно использую для похожих целей python. В начале, я попробовал (на C++) Boost.python и Python C API - хорошо, но можно потеряться в темплейтах если что-то вдруг не заработает c Boost.Python. Затем, юзал SWIG. Тоже ничего, но там такое надо бывает написать в .i файле, придумывать какие-то typemaps для чуть более чем тривиальных случаев. Не хочется такое повторять. Boost.Python и SWIG плохи тем что интерфейс надо оборачивать и писать какой-то код. Быстро поэкспериментировать не получится. &lt;br /&gt;&lt;br /&gt;Ничего особо писать не нужно в ctypes, но как-то сложилось, что я его не слишком использовал. А зря.&lt;br /&gt;&lt;br /&gt;Сейчас обнаружил, что все варианты FFI в Сommon LISP чем-то похожи на ctypes. Итак, если разобраться в FFI в LISP, что же мы получаем? У нас есть некий процесс, в пространство которого мы можем загрузить любую DLL'ку, подергать ее. При этому это все делается в REPL, плюс под рукой есть мощный язык с помощью которого можно всем этим рулить, прототипировать, экспериментировать. Python с ctypes тоже тут неплох, просто в SLIME получше среда, да и макросами можно весь FFI быстро обернуть. См &lt;a href="http://lisplearn.blogspot.com/2009/04/cffi.html"&gt;ранее об libgcrpyt&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7702415956280909075-2753333536820697856?l=lisplearn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lisplearn.blogspot.com/feeds/2753333536820697856/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://lisplearn.blogspot.com/2009/05/c.html#comment-form' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7702415956280909075/posts/default/2753333536820697856'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7702415956280909075/posts/default/2753333536820697856'/><link rel='alternate' type='text/html' href='http://lisplearn.blogspot.com/2009/05/c.html' title='Зачем нужен ЛИСП C программисту?'/><author><name>Валерий Замараев</name><uri>http://www.blogger.com/profile/08940019495293368111</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7702415956280909075.post-312075639062830697</id><published>2009-05-13T08:34:00.001-07:00</published><updated>2009-05-13T08:39:11.894-07:00</updated><title type='text'>Имею кучу гемора с установкой чего-то нормального лиспового на винде</title><content type='html'>Чаще всего рекомендуют CLISP, якобы на винде работающий нормально. Мне, правда больше по душе Clozure, и вроде встало нормально, SLIME запустился. Сначала не появлялся REPL отдельным окном, но потом прочилал в доке, что теперь REPL'а по умолчанию нет (!), и надо специально попросить, сказав  в Emacs'е (slime-setup '(slime-repl)). В Clozure CL интересный FFI, будем смотреть сейчас.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7702415956280909075-312075639062830697?l=lisplearn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lisplearn.blogspot.com/feeds/312075639062830697/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://lisplearn.blogspot.com/2009/05/blog-post_13.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7702415956280909075/posts/default/312075639062830697'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7702415956280909075/posts/default/312075639062830697'/><link rel='alternate' type='text/html' href='http://lisplearn.blogspot.com/2009/05/blog-post_13.html' title='Имею кучу гемора с установкой чего-то нормального лиспового на винде'/><author><name>Валерий Замараев</name><uri>http://www.blogger.com/profile/08940019495293368111</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7702415956280909075.post-2498279983865865322</id><published>2009-05-06T08:27:00.001-07:00</published><updated>2009-05-06T08:33:10.790-07:00</updated><title type='text'>О полезности рестартов для долгих вычислений</title><content type='html'>Я не сильно пока вникал в conditions/restarts, ну то есть прочитал, и все. Пока использую высокий уровень: error, warn, ignore-errors, unwind-protect. Но что классно: запускаешь длинную-предлинную задачу (сейчас пишу нечто, что обрабатывает файлики размером по 12-15G) потом всегда можешь нажать Ctrl-C, и после этого нажать нолик и продолжить с того места где прервал! При этом можно посмотреть как себя задача чувствует, какой прогресс, можно поправить чего-нибудь, вобщем, красота! Можно даже придумать такое извращение, как периодчески слать сигнал процессу затем, чтобы рисовать прогресс бар :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7702415956280909075-2498279983865865322?l=lisplearn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lisplearn.blogspot.com/feeds/2498279983865865322/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://lisplearn.blogspot.com/2009/05/blog-post.html#comment-form' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7702415956280909075/posts/default/2498279983865865322'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7702415956280909075/posts/default/2498279983865865322'/><link rel='alternate' type='text/html' href='http://lisplearn.blogspot.com/2009/05/blog-post.html' title='О полезности рестартов для долгих вычислений'/><author><name>Валерий Замараев</name><uri>http://www.blogger.com/profile/08940019495293368111</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7702415956280909075.post-3137570367231304348</id><published>2009-05-06T08:25:00.000-07:00</published><updated>2009-05-06T08:27:10.667-07:00</updated><title type='text'>На C получилось 3500 строк</title><content type='html'>И то потому что сделал там свои списки и intern, плюс автоматическую чистку ресурсов, с возможностью при ошибке тупо делать longjump. Все это  сократило количество кода.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7702415956280909075-3137570367231304348?l=lisplearn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lisplearn.blogspot.com/feeds/3137570367231304348/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://lisplearn.blogspot.com/2009/05/c-3500.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7702415956280909075/posts/default/3137570367231304348'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7702415956280909075/posts/default/3137570367231304348'/><link rel='alternate' type='text/html' href='http://lisplearn.blogspot.com/2009/05/c-3500.html' title='На C получилось 3500 строк'/><author><name>Валерий Замараев</name><uri>http://www.blogger.com/profile/08940019495293368111</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7702415956280909075.post-3626531299706481627</id><published>2009-04-01T13:44:00.000-07:00</published><updated>2009-04-01T13:46:19.921-07:00</updated><title type='text'>Сделал на ЛИСПе прототип кода, который надо написать на C</title><content type='html'>Прототип вместе с юнит тестами потянул на 1100 строчек, интересно сколько эквивалентного C-шного кода получится в итоге?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7702415956280909075-3626531299706481627?l=lisplearn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lisplearn.blogspot.com/feeds/3626531299706481627/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://lisplearn.blogspot.com/2009/04/c.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7702415956280909075/posts/default/3626531299706481627'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7702415956280909075/posts/default/3626531299706481627'/><link rel='alternate' type='text/html' href='http://lisplearn.blogspot.com/2009/04/c.html' title='Сделал на ЛИСПе прототип кода, который надо написать на C'/><author><name>Валерий Замараев</name><uri>http://www.blogger.com/profile/08940019495293368111</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7702415956280909075.post-3655077966367449133</id><published>2009-04-01T12:32:00.000-07:00</published><updated>2009-04-09T06:08:43.469-07:00</updated><title type='text'>CFFI и немного простых макросов</title><content type='html'>Это просто песня. Немного похож на питонячий ctypes, но ctypes отдыхает. С макросами &lt;span style="font-weight:bold;"&gt;with-foreign-object&lt;/span&gt; и пр, которые автоматически создают/удаляют временные объекты, да еще навернув несколько своих макросов сверху, получается круто!&lt;br /&gt;&lt;br /&gt;Так, мне нужно использовать libgcrypt из Common LISP'а.&lt;br /&gt;&lt;br /&gt;Небольшой набор нужных мне функций выглядит так:&lt;br /&gt;&lt;br /&gt;    &lt;pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="type"&gt;gcry_error_t&lt;/span&gt; &lt;span class="function-name"&gt;gcry_md_open&lt;/span&gt; (&lt;span class="type"&gt;gcry_md_hd_t&lt;/span&gt; *&lt;span class="variable-name"&gt;h&lt;/span&gt;, &lt;span class="type"&gt;int&lt;/span&gt; &lt;span class="variable-name"&gt;algo&lt;/span&gt;, &lt;span class="type"&gt;unsigned&lt;/span&gt; &lt;span class="type"&gt;int&lt;/span&gt; &lt;span class="variable-name"&gt;flags&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;&lt;span class="type"&gt;void&lt;/span&gt; &lt;span class="function-name"&gt;gcry_md_close&lt;/span&gt; (&lt;span class="type"&gt;gcry_md_hd_t&lt;/span&gt; &lt;span class="variable-name"&gt;hd&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;&lt;span class="type"&gt;void&lt;/span&gt; &lt;span class="function-name"&gt;gcry_md_write&lt;/span&gt; (&lt;span class="type"&gt;gcry_md_hd_t&lt;/span&gt; &lt;span class="variable-name"&gt;hd&lt;/span&gt;, &lt;span class="keyword"&gt;const&lt;/span&gt; &lt;span class="type"&gt;void&lt;/span&gt; *&lt;span class="variable-name"&gt;buffer&lt;/span&gt;, &lt;span class="type"&gt;size_t&lt;/span&gt; &lt;span class="variable-name"&gt;length&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;&lt;span class="type"&gt;unsigned&lt;/span&gt; &lt;span class="type"&gt;char&lt;/span&gt; *&lt;span class="function-name"&gt;gcry_md_read&lt;/span&gt; (&lt;span class="type"&gt;gcry_md_hd_t&lt;/span&gt; &lt;span class="variable-name"&gt;hd&lt;/span&gt;, &lt;span class="type"&gt;int&lt;/span&gt; &lt;span class="variable-name"&gt;algo&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;&lt;span class="keyword"&gt;const&lt;/span&gt; &lt;span class="type"&gt;char&lt;/span&gt; *&lt;span class="function-name"&gt;gcry_strerror&lt;/span&gt; (&lt;span class="type"&gt;gcry_error_t&lt;/span&gt; &lt;span class="variable-name"&gt;err&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;&lt;span class="keyword"&gt;const&lt;/span&gt; &lt;span class="type"&gt;char&lt;/span&gt; *&lt;span class="function-name"&gt;gcry_strsource&lt;/span&gt; (&lt;span class="type"&gt;gcry_error_t&lt;/span&gt; &lt;span class="variable-name"&gt;err&lt;/span&gt;);&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Есть и другие, но для примера достаточно.&lt;br /&gt;&lt;br /&gt;Лисповые обертки практически изоморфны C-шным прототипам, и пишутся моментально, думаю SWIG тут будет блистать, хотя не проверял и не совсем уверен. Я тут немного хитрю и ставлю тип &lt;code&gt;:pointer&lt;/code&gt; для всех типов, о которых я точно знаю, что это указатель. По честному надо было бы сделать &lt;code&gt;typedef&lt;/code&gt;'ы, тоже поддерживаемые CFFI.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;(defcfun (&lt;span class="string"&gt;"gcry_md_open"&lt;/span&gt; gcry-md-open) gcry-error-t&lt;br /&gt;  &lt;span class="string"&gt;"open message disgest handle"&lt;/span&gt;&lt;br /&gt;  (handle &lt;span class="builtin"&gt;:pointer&lt;/span&gt; &lt;span class="builtin"&gt;:pointer&lt;/span&gt;)&lt;br /&gt;  (algo &lt;span class="builtin"&gt;:int&lt;/span&gt;)&lt;br /&gt;  (flags &lt;span class="builtin"&gt;:unsigned-int&lt;/span&gt;))&lt;br /&gt;&lt;br /&gt;(defcfun (&lt;span class="string"&gt;"gcry_md_close"&lt;/span&gt; gcry-md-close) &lt;span class="builtin"&gt;:void&lt;/span&gt;&lt;br /&gt;  &lt;span class="string"&gt;"close message digest handle"&lt;/span&gt;&lt;br /&gt;  (handle &lt;span class="builtin"&gt;:pointer&lt;/span&gt;))&lt;br /&gt;&lt;br /&gt;(defcfun (&lt;span class="string"&gt;"gcry_strerror"&lt;/span&gt; gcry-strerror) &lt;span class="builtin"&gt;:string&lt;/span&gt;&lt;br /&gt;  (err gcry-error-t))&lt;br /&gt;&lt;br /&gt;(defcfun (&lt;span class="string"&gt;"gcry_strsource"&lt;/span&gt; gcry-strsource) &lt;span class="builtin"&gt;:string&lt;/span&gt;&lt;br /&gt;  (err gcry-error-t))&lt;br /&gt;&lt;br /&gt;(defcfun (&lt;span class="string"&gt;"gcry_md_write"&lt;/span&gt; gcry-md-write) &lt;span class="builtin"&gt;:void&lt;/span&gt;&lt;br /&gt;  (handle &lt;span class="builtin"&gt;:pointer&lt;/span&gt;)&lt;br /&gt;  (buf &lt;span class="builtin"&gt;:string&lt;/span&gt;)&lt;br /&gt;  (len size-t))&lt;br /&gt;&lt;br /&gt;(defcfun (&lt;span class="string"&gt;"gcry_md_read"&lt;/span&gt; gcry-md-read) &lt;span class="builtin"&gt;:pointer&lt;/span&gt;&lt;br /&gt;  (handle &lt;span class="builtin"&gt;:pointer&lt;/span&gt;)&lt;br /&gt;  (algo &lt;span class="builtin"&gt;:int&lt;/span&gt;))&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Теперь мы получили интерфейс идентичный  С-шному. Без него вообще можно было бы обойтись, и везде использовать макрос &lt;code&gt;foreign-funcall&lt;/code&gt;, позволяющий вызвать любую функцию по символу в разделяемой библиотеке с аргументами любых типов. Но я решил их написать чтобы задокументировать интерфейс как он выглядит в ЛИСПе и сделать дальшейший код был более понятным. В разных вариантах FFI для Python'а постоянной проблемой были output параметры. Например, gcry_md_open возвращает результат в виде указателя, которых сохраняется в параметре handle (так что handle это фактически двойной указатель). В SWIG'е мне пришлось бы делать странные аннотации, а также  читать довольно много примеров как это делается. В CFFI - красота. На помощь приходит макрос CFFI &lt;code&gt;with-foreign-object&lt;/code&gt;:&lt;br /&gt;    &lt;pre&gt;&lt;br /&gt;(&lt;span class="keyword"&gt;defun&lt;/span&gt; &lt;span class="function-name"&gt;md-open&lt;/span&gt; (algo)&lt;br /&gt;  (&lt;span class="keyword"&gt;with-foreign-object&lt;/span&gt; (handle &lt;span class="builtin"&gt;:pointer&lt;/span&gt;)&lt;br /&gt;    (&lt;span class="warning"&gt;check-gcry-error&lt;/span&gt; (gcry-md-open handle algo 0)&lt;br /&gt;                 (mem-ref handle &lt;span class="builtin"&gt;:pointer&lt;/span&gt;))))&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;CFFI выделяет память под один объект типа &lt;code&gt;:pointer&lt;/code&gt;, и связывает указатель на эту память с переменной handle. Память CFFI старается выделить на стеке. Дальше вызывается &lt;code&gt;gcry-md-open&lt;/code&gt; с правильным указателем в качестве параметра. Макрос &lt;code&gt;check-gcry-error&lt;/code&gt; проверяет код ошибки libgcrypt, если 0 то выаолняет вторую форму и возвращает ее значение, если нет, то возвращает nil, и информацию об ошибках. Вот его определение:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;(&lt;span class="keyword"&gt;defmacro&lt;/span&gt; &lt;span class="function-name"&gt;check-gcry-error&lt;/span&gt; (call-form &lt;span class="type"&gt;&amp;amp;optional&lt;/span&gt; result-form)&lt;br /&gt;  `(&lt;span class="keyword"&gt;let&lt;/span&gt; ((err ,call-form))&lt;br /&gt;     (&lt;span class="keyword"&gt;if&lt;/span&gt; (zerop err)&lt;br /&gt;         ,result-form&lt;br /&gt;         (values nil (cons (gcry-strerror err)&lt;br /&gt;                           (gcry-strsource err))))))&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Итак, уже можно более менее по лисповски открывать handle. Раз мы уже так обернули &lt;code&gt;gcry-md-open&lt;/code&gt;, то для симметрии можно уже и &lt;code&gt;gcry-md-close&lt;/code&gt; обернуть. Кроме того, я обернул &lt;code&gt;gcry-md-read&lt;/code&gt; и &lt;code&gt;gcry-md-write&lt;/code&gt; чтобы в эти функции запихивать векторы. И еще: handle нужно закрывать в любом случае, что бы ни произошло, и тут вся красота макросов в стиле &lt;code&gt;with-&lt;/code&gt; ЛИСПа (см. &lt;code&gt;with-hash-algorithm&lt;/code&gt;).&lt;br /&gt;&lt;br /&gt;    &lt;pre&gt;&lt;br /&gt;(&lt;span class="keyword"&gt;defun&lt;/span&gt; &lt;span class="function-name"&gt;md-close&lt;/span&gt; (handle)&lt;br /&gt;  (gcry-md-close handle))&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;(&lt;span class="keyword"&gt;defun&lt;/span&gt; &lt;span class="function-name"&gt;md-write&lt;/span&gt; (h v)&lt;br /&gt;  (&lt;span class="keyword"&gt;let&lt;/span&gt; ((len (length v)))&lt;br /&gt;    (&lt;span class="keyword"&gt;with-foreign-object&lt;/span&gt; (data &lt;span class="builtin"&gt;:unsigned-char&lt;/span&gt; len)&lt;br /&gt;      (&lt;span class="keyword"&gt;loop&lt;/span&gt; for i from 0 below len&lt;br /&gt;           do (setf (mem-aref data &lt;span class="builtin"&gt;:unsigned-char&lt;/span&gt; i) (aref v i)))&lt;br /&gt;      (gcry-md-write h data len))))&lt;br /&gt;       &lt;br /&gt;(&lt;span class="keyword"&gt;defun&lt;/span&gt; &lt;span class="function-name"&gt;md-read&lt;/span&gt; (h algo)&lt;br /&gt;  (&lt;span class="keyword"&gt;let*&lt;/span&gt; ((c-digest (gcry-md-read h algo))&lt;br /&gt;         (len 20) &lt;span class="comment-delimiter"&gt;; &lt;/span&gt;&lt;span class="comment"&gt;cheating - 20 bytes is only for SHA-1, I don't need&lt;br /&gt;&lt;/span&gt;                  &lt;span class="comment-delimiter"&gt;; &lt;/span&gt;&lt;span class="comment"&gt;anything else, but generally it's a bug&lt;br /&gt;&lt;/span&gt;         (v (make-array len &lt;span class="builtin"&gt;:element-type&lt;/span&gt; '(unsigned-byte 8))))&lt;br /&gt;    (&lt;span class="keyword"&gt;progn&lt;/span&gt;&lt;br /&gt;      (&lt;span class="keyword"&gt;loop&lt;/span&gt; for i from 0 below len&lt;br /&gt;         do (setf (aref v i) (mem-aref c-digest &lt;span class="builtin"&gt;:unsigned-char&lt;/span&gt; i)))&lt;br /&gt;      v)))&lt;br /&gt;&lt;br /&gt;(&lt;span class="keyword"&gt;defmacro&lt;/span&gt; &lt;span class="function-name"&gt;with-hash-algorithm&lt;/span&gt; (h algo &lt;span class="type"&gt;&amp;amp;body&lt;/span&gt; body)&lt;br /&gt;  `(&lt;span class="keyword"&gt;multiple-value-bind&lt;/span&gt; (,h err) (md-open ,algo)&lt;br /&gt;     (&lt;span class="keyword"&gt;if&lt;/span&gt; ,h&lt;br /&gt;         (&lt;span class="keyword"&gt;unwind-protect&lt;/span&gt; (&lt;span class="keyword"&gt;progn&lt;/span&gt; ,@body (md-read ,h ,algo))&lt;br /&gt;           (md-close ,h))&lt;br /&gt;         (&lt;span class="warning"&gt;error&lt;/span&gt; &lt;span class="string"&gt;"error: ~a ~a"&lt;/span&gt; (car err) (cdr err)))))&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Теперь, если я хочу посчитать хеш нескольких кусков данных, я пишу примерно так (кусок кода, проверяющего PGP подпись):&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;           (&lt;span class="keyword"&gt;with-hash-algorithm&lt;/span&gt; h hash-alg&lt;br /&gt;             (md-write h #(#x99))&lt;br /&gt;             (md-write h (num-&amp;gt;2octet (1+ (packet-len whole-packet))))&lt;br /&gt;             (md-write h #(4))&lt;br /&gt;             (md-write-packet h whole-packet)&lt;br /&gt;             (md-write h #(#xB4))&lt;br /&gt;             (md-write h (num-&amp;gt;4octet (packet-len user-id-packet)))&lt;br /&gt;             (md-write-packet h user-id-packet)&lt;br /&gt;             (md-write-packet h hashed-data)&lt;br /&gt;             (md-write h (vector #x04 #xFF))&lt;br /&gt;             (md-write h (num-&amp;gt;4octet hashed-data-len)))&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Уверен, что существуют гораздо более правильные и красивые варианты оборачивания такого интерфейса в CL, но мне такой нравится и для меня сработало хорошо.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7702415956280909075-3655077966367449133?l=lisplearn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lisplearn.blogspot.com/feeds/3655077966367449133/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://lisplearn.blogspot.com/2009/04/cffi.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7702415956280909075/posts/default/3655077966367449133'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7702415956280909075/posts/default/3655077966367449133'/><link rel='alternate' type='text/html' href='http://lisplearn.blogspot.com/2009/04/cffi.html' title='CFFI и немного простых макросов'/><author><name>Валерий Замараев</name><uri>http://www.blogger.com/profile/08940019495293368111</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7702415956280909075.post-2968748664737897719</id><published>2009-03-18T12:53:00.000-07:00</published><updated>2009-03-19T03:43:51.074-07:00</updated><title type='text'>Решил пободаться с Hunchentoot'ом</title><content type='html'>У меня на моем макбуке стоит SBCL, LispWorks Personal, Allegro CL Express, Clozure CL.&lt;br /&gt;Hunchentool решил ставить на SBCL, так как все связанное с  ASDF там уже идет в комплекте и настроено. Кажется Hunchentoot нормально не работает из-за того, что SBCL собран без поддержки нитей (из macports). Пробую теперь Clozure CL - там еще надо разобраться с ASDF.&lt;br /&gt;&lt;br /&gt;Вообще обилие реализаций Common Lisp не раздражает, как в Scheme, где они все совешенно не похожи друг на друга, а даже наоборот - есть из чего выбирать.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7702415956280909075-2968748664737897719?l=lisplearn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lisplearn.blogspot.com/feeds/2968748664737897719/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://lisplearn.blogspot.com/2009/03/hunhentoot.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7702415956280909075/posts/default/2968748664737897719'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7702415956280909075/posts/default/2968748664737897719'/><link rel='alternate' type='text/html' href='http://lisplearn.blogspot.com/2009/03/hunhentoot.html' title='Решил пободаться с Hunchentoot&apos;ом'/><author><name>Валерий Замараев</name><uri>http://www.blogger.com/profile/08940019495293368111</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7702415956280909075.post-6650432036432063503</id><published>2009-03-16T13:56:00.001-07:00</published><updated>2009-03-16T13:58:11.913-07:00</updated><title type='text'>Пакеты, файлы, зависимости</title><content type='html'>Понятно, что пакеты как просто namespace не связанные прямо с файлами исходников - это по-лисповски так и должно быть. Вот только не понятно пока, что я как программист от этого выигрываю?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7702415956280909075-6650432036432063503?l=lisplearn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lisplearn.blogspot.com/feeds/6650432036432063503/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://lisplearn.blogspot.com/2009/03/blog-post_16.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7702415956280909075/posts/default/6650432036432063503'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7702415956280909075/posts/default/6650432036432063503'/><link rel='alternate' type='text/html' href='http://lisplearn.blogspot.com/2009/03/blog-post_16.html' title='Пакеты, файлы, зависимости'/><author><name>Валерий Замараев</name><uri>http://www.blogger.com/profile/08940019495293368111</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7702415956280909075.post-7302196610554926919</id><published>2009-03-07T02:51:00.000-08:00</published><updated>2009-03-08T15:00:44.225-07:00</updated><title type='text'>Мда, не всегда все просто</title><content type='html'>Python 3.0:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;with open("/tmp/file.txt") as f:&lt;br /&gt;    for line in f:&lt;br /&gt;        print(line)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Common LISP:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;(with-open-file (f #p"/tmp/file.txt")&lt;br /&gt;   (loop for line = (read-line f nil)&lt;br /&gt;      while line&lt;br /&gt;      do (print line)))&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7702415956280909075-7302196610554926919?l=lisplearn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lisplearn.blogspot.com/feeds/7302196610554926919/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://lisplearn.blogspot.com/2009/03/blog-post_07.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7702415956280909075/posts/default/7302196610554926919'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7702415956280909075/posts/default/7302196610554926919'/><link rel='alternate' type='text/html' href='http://lisplearn.blogspot.com/2009/03/blog-post_07.html' title='Мда, не всегда все просто'/><author><name>Валерий Замараев</name><uri>http://www.blogger.com/profile/08940019495293368111</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7702415956280909075.post-6222416213901174319</id><published>2009-03-07T00:43:00.000-08:00</published><updated>2009-03-07T00:45:54.470-08:00</updated><title type='text'>CLOS и окошки!</title><content type='html'>Читаю &lt;span style="font-weight:bold;"&gt;Keene S.E. Object Oriented Programming in Common Lisp&lt;/span&gt;. Как же надоело что во всех книжках по ООП в качестве примеров - окна! Напоминает времена когда каждый студент считал своим долгом написать под DOS'ом свою оконную систему.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7702415956280909075-6222416213901174319?l=lisplearn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lisplearn.blogspot.com/feeds/6222416213901174319/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://lisplearn.blogspot.com/2009/03/clos.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7702415956280909075/posts/default/6222416213901174319'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7702415956280909075/posts/default/6222416213901174319'/><link rel='alternate' type='text/html' href='http://lisplearn.blogspot.com/2009/03/clos.html' title='CLOS и окошки!'/><author><name>Валерий Замараев</name><uri>http://www.blogger.com/profile/08940019495293368111</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7702415956280909075.post-6854342581493760561</id><published>2009-03-03T14:43:00.000-08:00</published><updated>2009-03-03T14:49:12.874-08:00</updated><title type='text'>AllegroCache</title><content type='html'>Одна из причин нового всплеска моего интереса к ЛИСПу - это существование такой штуки как AllegroCache. Писал о не длинный пост, но он куда-то пропал и не опубликовался, второй раз облом. Но в кратце - существуют всякие объектные базы данных, но фактически это какой-то нижний уровень, обеспечивающий ACID и базовые операции хранения данных (что-то вроде Berkley DB) с навернутыми сверху механизмами сериализации/десериализации классов в данном конкретном языке. При этом есть еще индексы и прочее. Вобщем - доступ к таким данным - это типичная задача для DSL. Хотя разработчики AllegroCache пошли дальше ии внедрили такой persistence непосредственно в CLOS.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7702415956280909075-6854342581493760561?l=lisplearn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lisplearn.blogspot.com/feeds/6854342581493760561/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://lisplearn.blogspot.com/2009/03/allegrocache.html#comment-form' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7702415956280909075/posts/default/6854342581493760561'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7702415956280909075/posts/default/6854342581493760561'/><link rel='alternate' type='text/html' href='http://lisplearn.blogspot.com/2009/03/allegrocache.html' title='AllegroCache'/><author><name>Валерий Замараев</name><uri>http://www.blogger.com/profile/08940019495293368111</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7702415956280909075.post-8603830993909086870</id><published>2009-03-03T14:27:00.000-08:00</published><updated>2009-03-03T14:29:14.797-08:00</updated><title type='text'>Изучаем ЛИСП</title><content type='html'>Меня уже довольно давно интересует ЛИСП. Я уже успел прочитать SICP, и даже проработать большинство упражнений. Теперь хочется перейти к Common LISP'у, и отмечать в этом блоге свой прогресс. Цель - писать еженедельно какую-то маленькую программку, хоть задачку какую-то. Очень хочется также применения лиспа к более менее реальным задачам.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7702415956280909075-8603830993909086870?l=lisplearn.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://lisplearn.blogspot.com/feeds/8603830993909086870/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://lisplearn.blogspot.com/2009/03/blog-post.html#comment-form' title='Комментарии: 1'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7702415956280909075/posts/default/8603830993909086870'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7702415956280909075/posts/default/8603830993909086870'/><link rel='alternate' type='text/html' href='http://lisplearn.blogspot.com/2009/03/blog-post.html' title='Изучаем ЛИСП'/><author><name>Валерий Замараев</name><uri>http://www.blogger.com/profile/08940019495293368111</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry></feed>
