<?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-26472930</id><updated>2012-02-16T17:50:04.678+02:00</updated><category term='windows'/><category term='asdf'/><category term='lisp'/><category term='common-lisp'/><category term='cl-gtk2'/><category term='clojure'/><category term='zlib'/><category term='reader-macro'/><category term='utf8'/><title type='text'>128 k</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://andy128k.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26472930/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://andy128k.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>andy128k</name><uri>http://www.blogger.com/profile/11404034355392966133</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_zMpWK9TTbKQ/SBtnSf3XmLI/AAAAAAAAAC8/6qQzFR29BGE/S220/avatar.png'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>4</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-26472930.post-7827382931250269582</id><published>2011-10-09T17:42:00.000+03:00</published><updated>2011-10-09T17:42:30.666+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='clojure'/><category scheme='http://www.blogger.com/atom/ns#' term='reader-macro'/><title type='text'>Впечатления от Clojure</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Пришлось мне столкнуться по-службе с Clojure. Мои впечатления от знакомства:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Первое, что бросается в глаза — это дурацкие [] и {} вместо расово верных (). Не скажу, что они упрощают чтение кода, ИМХО разница невелика. А вот написание усложняют (по крайней мере мне). Набирать закрывающие сущее мучение; вылазит вот такое &lt;b&gt;))}))])&lt;/b&gt; безобразие и сиди считай скобки. Так недалеко и до JavaScript с его вечными &lt;b&gt;});});});&lt;/b&gt;&lt;/li&gt;&lt;li&gt;Зато, эти же самые [] и {} позволяют сделать конфиг с симпатичным синтаксисом почти-JSON.&lt;div style="background-color: #eeffee; border: 1px solid #bfb; font-family: monospace; margin: 20px 0; padding: 20px;"&gt;{&lt;br /&gt;&amp;nbsp; &lt;span style="color: purple;"&gt;:listen&lt;/span&gt; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: purple;"&gt;:host&lt;/span&gt; &lt;span style="color: blue;"&gt;"localhost"&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: purple;"&gt;:port&lt;/span&gt; &lt;span style="color: blue;"&gt;8080&lt;/span&gt;&lt;br /&gt;&amp;nbsp; }&lt;br /&gt;&amp;nbsp; &lt;span style="color: purple;"&gt;:db&lt;/span&gt; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: purple;"&gt;:host&lt;/span&gt; &lt;span style="color: blue;"&gt;"localhost"&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: purple;"&gt;:port&lt;/span&gt; &lt;span style="color: blue;"&gt;5432&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: purple;"&gt;:database&lt;/span&gt; &lt;span style="color: blue;"&gt;"database"&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: purple;"&gt;:user&lt;/span&gt; &lt;span style="color: blue;"&gt;"root"&lt;/span&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: purple;"&gt;:password&lt;/span&gt; &lt;span style="color: blue;"&gt;"secret"&lt;/span&gt;&lt;br /&gt;&amp;nbsp; }&lt;br /&gt;}&lt;/div&gt;&lt;/li&gt;&lt;li&gt;Жутко неудобно писать императивный код. Мутабельность здесь не любят. Код, конечно, от этого становится чище, но времени на написание уходит чуть больше.&lt;/li&gt;&lt;li&gt;Нет многострочных комментариев. Пришлось написать reader macro, добавляющий комментарии в стиле Common Lisp.&lt;div style="background-color: #eeffee; border: 1px solid #bfb; font-family: monospace; margin: 20px 0; padding: 20px;"&gt;(&lt;b&gt;defn&lt;/b&gt; dispatch-reader-macro [ch fun]&lt;br /&gt;&amp;nbsp; (&lt;b&gt;let&lt;/b&gt; [dm (.get (&lt;b&gt;doto&lt;/b&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (.getDeclaredField clojure.lang.LispReader&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style="color: blue;"&gt;"dispatchMacros"&lt;/span&gt;)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (.setAccessible &lt;span style="color: blue;"&gt;true&lt;/span&gt;))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style="color: blue;"&gt;nil&lt;/span&gt;)]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; (aset dm (int ch) fun)))&lt;br /&gt;&lt;br /&gt;(&lt;b&gt;defn&lt;/b&gt; read-comment [rdr pipe]&lt;br /&gt;&amp;nbsp; (&lt;b&gt;loop&lt;/b&gt; [s &lt;span style="color: blue;"&gt;nil&lt;/span&gt;]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; (&lt;b&gt;let&lt;/b&gt; [c (.read rdr)]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (&lt;b&gt;if-not&lt;/b&gt; (&lt;b&gt;and&lt;/b&gt; s (= c (int &lt;span style="color: blue;"&gt;\#&lt;/span&gt;)))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; (&lt;b&gt;recur&lt;/b&gt; (= c pipe))))))&lt;br /&gt;&lt;br /&gt;(dispatch-reader-macro &lt;span style="color: blue;"&gt;\|&lt;/span&gt; read-comment)&lt;/div&gt;&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Единственное неудобство: нужно делать &lt;b&gt;&lt;code&gt;require&lt;/code&gt;&lt;/b&gt; во всех файлах, где эти комментарии используются.&lt;/div&gt;&lt;/li&gt;&lt;li&gt;Очень понравился Leiningen. Собрать с его помощью jar-файл и запустить его на сервере оказалось очень просто. Сделано "для людей".&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26472930-7827382931250269582?l=andy128k.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andy128k.blogspot.com/feeds/7827382931250269582/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26472930&amp;postID=7827382931250269582' title='Комментарии: 19'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26472930/posts/default/7827382931250269582'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26472930/posts/default/7827382931250269582'/><link rel='alternate' type='text/html' href='http://andy128k.blogspot.com/2011/10/clojure.html' title='Впечатления от Clojure'/><author><name>andy128k</name><uri>http://www.blogger.com/profile/11404034355392966133</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_zMpWK9TTbKQ/SBtnSf3XmLI/AAAAAAAAAC8/6qQzFR29BGE/S220/avatar.png'/></author><thr:total>19</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26472930.post-8122401755130995735</id><published>2011-04-01T06:38:00.000+03:00</published><updated>2011-04-01T06:38:28.406+03:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='utf8'/><category scheme='http://www.blogger.com/atom/ns#' term='cl-gtk2'/><category scheme='http://www.blogger.com/atom/ns#' term='common-lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='windows'/><title type='text'>GtkFileChooser и Win32</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Вчера всплыла интересная проблема. File-chooser в CL-GTK2 не правильно работает с не-ASCII именами файлов.&lt;br /&gt;&lt;br /&gt;Оказалось, что win32-версия GTK+ определяет два набора функций:&lt;br /&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;первый содержит те-же функции, что и unix-версия, но работающие с локальной кодировкой (а не utf8);&lt;/li&gt;&lt;li&gt;второй набор работает с utf8, но все функции имеют суффикс _utf8.&lt;/li&gt;&lt;/ul&gt;Самое интересное то, что файл gtkfilechooser.h с помощью препроцессора переименовывает функции из второго набора и скрывает из первого. DLL же экспортирует оба набора и CL-GTK2 как ни в чём ни бывало использует первый, неправильный набор.&lt;br /&gt;&lt;br /&gt;Оказалось, что не все функции легко исправить потому, что они генерировались отдельным скриптом. Трудность заключалась в том, что нужно было генерировать reader macros. Символы #+win32 упорно не желали печататься как следует. Получалась никуда не годная ерунда вроде такой: |#+WIN32|&lt;br /&gt;&lt;br /&gt;После долгих мучений родился такой workaround:&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color: #eeffee; border: 1px solid #bfb; padding: 20px;"&gt;(&lt;b&gt;defclass&lt;/b&gt; print-readtime-condition ()&lt;br /&gt;&amp;nbsp; ((condition &lt;b&gt;&lt;span style="color: #a64d79;"&gt;:initarg&lt;/span&gt;&lt;/b&gt; &lt;b&gt;&lt;span style="color: #a64d79;"&gt;:condition&lt;/span&gt;&lt;/b&gt;)))&lt;br /&gt;&lt;br /&gt;(&lt;b&gt;defmethod&lt;/b&gt; print-object ((o print-readtime-condition) stream)&lt;br /&gt;&amp;nbsp; (&lt;b&gt;format&lt;/b&gt; stream &lt;span style="color: blue;"&gt;"#~A"&lt;/span&gt; (&lt;b&gt;slot-value&lt;/b&gt; o 'condition)))&lt;/div&gt;&lt;br /&gt;Теперь макрос-генератор может выводить условия так:&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color: #eeffee; border: 1px solid #bfb; padding: 20px;"&gt;(&lt;b&gt;make-instance&lt;/b&gt; 'print-readtime-condition &lt;b&gt;&lt;span style="color: #a64d79;"&gt;:condition&lt;/span&gt;&lt;/b&gt; :+win32)&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Результаты ночных бдений: &lt;a href="https://github.com/andy128k/cl-gtk2"&gt;https://github.com/andy128k/cl-gtk2&lt;/a&gt;&lt;br /&gt;&lt;br /&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/26472930-8122401755130995735?l=andy128k.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andy128k.blogspot.com/feeds/8122401755130995735/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26472930&amp;postID=8122401755130995735' title='Комментарии: 6'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26472930/posts/default/8122401755130995735'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26472930/posts/default/8122401755130995735'/><link rel='alternate' type='text/html' href='http://andy128k.blogspot.com/2011/04/gtkfilechooser-win32.html' title='GtkFileChooser и Win32'/><author><name>andy128k</name><uri>http://www.blogger.com/profile/11404034355392966133</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_zMpWK9TTbKQ/SBtnSf3XmLI/AAAAAAAAAC8/6qQzFR29BGE/S220/avatar.png'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26472930.post-5202452041795189528</id><published>2010-03-02T23:39:00.000+02:00</published><updated>2010-03-02T23:39:32.434+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='zlib'/><category scheme='http://www.blogger.com/atom/ns#' term='lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='common-lisp'/><title type='text'>Ещё один велосипед</title><content type='html'>В программе, которую я пишу, понадобилась компрессия/декомпрессия из ZLib. Казалось бы, такая простая и распространённая штука должна быть уже реализована и отлажена. Но оказалось, что не всё так просто, есть несколько библиотек, но ни одна из них не покрывает всех моих скромных нужд.&lt;br /&gt;&lt;br /&gt;CL-ZIP: привязка к zlib. Всё бы ничего, но сделана на UFFI;&lt;br /&gt;Salza/Salza2: умеет только компрессировать;&lt;br /&gt;zlib: умеет всё, реализована на CL, но, как оказалось, работает через раз.&lt;br /&gt;&lt;br /&gt;В итоге я написал ещё одну :) &lt;a href="http://github.com/andy128k/cl-z"&gt;cl-z&lt;/a&gt;. Это простой биндинг к ZLib через CFFI.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/26472930-5202452041795189528?l=andy128k.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andy128k.blogspot.com/feeds/5202452041795189528/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26472930&amp;postID=5202452041795189528' title='Комментарии: 2'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26472930/posts/default/5202452041795189528'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26472930/posts/default/5202452041795189528'/><link rel='alternate' type='text/html' href='http://andy128k.blogspot.com/2010/03/blog-post.html' title='Ещё один велосипед'/><author><name>andy128k</name><uri>http://www.blogger.com/profile/11404034355392966133</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_zMpWK9TTbKQ/SBtnSf3XmLI/AAAAAAAAAC8/6qQzFR29BGE/S220/avatar.png'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-26472930.post-6126476778422633784</id><published>2009-12-01T09:43:00.010+02:00</published><updated>2009-12-01T11:20:22.752+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='asdf'/><category scheme='http://www.blogger.com/atom/ns#' term='common-lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='windows'/><title type='text'>ASDF и Windows</title><content type='html'>&lt;span style="font-size: large;"&gt;Что к чему&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;В asdf есть переменная *central-registry*, содержащая список директорий в которых ищутся asdf-системы. То есть, чтобы система была доступна&lt;br /&gt;для загрузки, нужно чтобы путь к её asd-файлу был в *central-registry*.&lt;br /&gt;&lt;br /&gt;Но систем много, и каждую прописывать в *central-registry* утомительно. Поэтому принято делать несколько иначе: прописывается путь к какой-то одной директории (например ~/.sbcl/systems/), а в эту директорию помещаются символические ссылки на asd-файлы.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Windows&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Очевидно, что в windows нет ссылок и, казалось бы, такой вариант не подходит. Но, к счастью, asdf неплохо настраивается и можно это&lt;br /&gt;ограничение обойти. Переменная *system-definition-search-functions* содержит список функций поиска asdf-систем.&lt;br /&gt;&lt;br /&gt;Вот такая функция и код добавления её в asdf. Эта функция обходит все директории из *central-registry* и просматривает в них все lnk-файлы,&lt;br /&gt;извлекает путь ссылки и сравнивает с именем искомой системы.&lt;br /&gt;&lt;br /&gt;&lt;pre class="code"&gt;(&lt;a class="symbol" href="http://www.lispworks.com/reference/HyperSpec/Body/m_defun.htm"&gt;&lt;i&gt;defun&lt;/i&gt;&lt;/a&gt; search-for-system-in-windows (system)&lt;br /&gt;  (&lt;a class="symbol" href="http://www.lispworks.com/reference/HyperSpec/Body/s_let_l.htm"&gt;&lt;i&gt;let&lt;/i&gt;&lt;/a&gt; ((system-name (asdf::coerce-name system)))&lt;br /&gt;    (&lt;a class="symbol" href="http://www.lispworks.com/reference/HyperSpec/Body/m_dolist.htm"&gt;dolist&lt;/a&gt; (dir asdf:*central-registry*)&lt;br /&gt;      (&lt;a class="symbol" href="http://www.lispworks.com/reference/HyperSpec/Body/m_dolist.htm"&gt;dolist&lt;/a&gt; (lnk (&lt;a class="symbol" href="http://www.lispworks.com/reference/HyperSpec/Body/f_dir.htm"&gt;directory&lt;/a&gt; (&lt;a class="symbol" href="http://www.lispworks.com/reference/HyperSpec/Body/f_merge_.htm"&gt;merge-pathnames&lt;/a&gt; (&lt;a class="symbol" href="http://www.lispworks.com/reference/HyperSpec/Body/f_eval.htm"&gt;eval&lt;/a&gt; dir) "*.lnk")))&lt;br /&gt;        (&lt;a class="symbol" href="http://www.lispworks.com/reference/HyperSpec/Body/s_let_l.htm"&gt;&lt;i&gt;let&lt;/i&gt;&lt;/a&gt; ((system-path (parse-windows-shortcut lnk)))&lt;br /&gt;          (&lt;a class="symbol" href="http://www.lispworks.com/reference/HyperSpec/Body/m_when_.htm"&gt;when&lt;/a&gt; (&lt;a class="symbol" href="http://www.lispworks.com/reference/HyperSpec/Body/f_stgeq_.htm"&gt;string-equal&lt;/a&gt; system-name (&lt;a class="symbol" href="http://www.lispworks.com/reference/HyperSpec/Body/f_pn_hos.htm"&gt;pathname-name&lt;/a&gt; system-path))&lt;br /&gt;            (&lt;a class="symbol" href="http://www.lispworks.com/reference/HyperSpec/Body/s_ret_fr.htm"&gt;&lt;i&gt;return-from&lt;/i&gt;&lt;/a&gt; search-for-system-in-windows system-path)))))))&lt;br /&gt;&lt;br /&gt;(&lt;a class="symbol" href="http://www.lispworks.com/reference/HyperSpec/Body/m_pshnew.htm"&gt;pushnew&lt;/a&gt; #'search-for-system-in-windows&lt;br /&gt;  asdf:*system-definition-search-functions*)&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Этот код был бы неполным без этого фрагмента &lt;a href="http://paste.lisp.org/display/91121"&gt;http://paste.lisp.org/display/91121&lt;/a&gt;&lt;br /&gt;&lt;div class="entry"&gt;&lt;table cellspacing="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td valign="top" width="100%"&gt;&lt;table cellspacing="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="datecontent"&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;wbr&gt;&lt;/wbr&gt;Здесь вся машинерия разбора lnk-файлов.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: large;"&gt;Варианты&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Очевидно, что можно сделать всё это ещё проще. Можно вместо lnk-файлов придумать, скажем, symlink-файлы -- простые текстовые файлы с путями внутри. Тогда чтение таких файлов будет тривиальным и кода будет поменьше.&lt;br /&gt;&lt;br /&gt;Любители Windows могут сделать регистрацию и поиск asd-файлов даже в реестре. :)&lt;br /&gt;&lt;br /&gt;Ну а так как функций поиска может быть несколько, то можно все эти способы сочетать.&lt;br /&gt;&lt;span style="font-size: large;"&gt;&lt;br /&gt;Резюме&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Остаётся добавить этот код в пользовательский файл инициализации, и можно пользоваться.&lt;br /&gt;Для SBCL это будет $HOME/.sbclrc&lt;br /&gt;для Clozure CL: $HOME/ccl-init.lisp&lt;br /&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/26472930-6126476778422633784?l=andy128k.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://andy128k.blogspot.com/feeds/6126476778422633784/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=26472930&amp;postID=6126476778422633784' title='Комментарии: 6'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/26472930/posts/default/6126476778422633784'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/26472930/posts/default/6126476778422633784'/><link rel='alternate' type='text/html' href='http://andy128k.blogspot.com/2009/12/asdf-windows-asdf-central-registry-asdf.html' title='ASDF и Windows'/><author><name>andy128k</name><uri>http://www.blogger.com/profile/11404034355392966133</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://bp1.blogger.com/_zMpWK9TTbKQ/SBtnSf3XmLI/AAAAAAAAAC8/6qQzFR29BGE/S220/avatar.png'/></author><thr:total>6</thr:total></entry></feed>
