|
|
You are viewing the most recent 25 entries.
26th November 2009
2:58pm: Минилисп
Написал интерпретатор минилиспа, который, в принципе, уже можно как-то использовать. Для программирования пока не пригоден, он уже готов к тому, чтобы на нем можно было развернуть (в смысле слова bootstrap) настоящий Лисп. ftp://ftp.zhtw.org.ru/pub/zlisp/current/zlisp.pax.bz2В зачаточном виде поддерживается unicode. Программа должна быть в utf-8. avl@ikemefuna:~/work/zlisp$ ./minilisp arc> (assign 垃圾邮件 (fn (鸡蛋) (fn (x) (+ x 鸡蛋))))
arc> (assign egg1 (垃圾邮件 1))
arc> (assign egg2 (垃圾邮件 2))
arc> (egg1 15) 16 arc> (egg2 10) 12
Оптимизация хвостового вызова есть. Реализована через С++-исключения. Это уменьшает скорость всего интерпретатора на gcc где-то в 10 раз. Мне нравится Арк, поэтому я, в основном, копирую его функциональность. Полной совместимости добиться пока не пытаюсь. Ближайшие планируемые изменения: добавить annotate, и реализовать через него макрос mac (макрос создания макросов) на уровне самого Лиспа (как у Грэема), а не на уровне интерпретатора. После этого язык станет практически полноценным. Сейчас для сборки нужен gcc45 и bmake (переносммый NetBSD make). Makefile плохой, т. к. расчитывает на присутствие gcc45 в конкретном месте, но это легко исправить, а мне пока не мешает. Почему, собственно, интерпретатор? Потому что нет никакого желания продолжать писать на C++ что-либо, а интерпретатор позволит перейти на Лисп уже сейчас. Останеться только написать комплятор на самом Лиспе, скомпилировать себя, используюя интерпретатор и вуаля, готов полноценный Лисп.
24th November 2009
10:15pm: Слова-паразиты в языках программирования
Мне кажется, что идея исползования точки в списке параметров функции гениальна. CL-евский аналог &rest по сравнению с точкой выглядит убого. Вообще, в контексте списка параметров функции есть куча неиспользуемых семантик, которые хоть и медленно, но все же осваиваются. В Арке, например имя параметра можно заключать в скобки с префиксом o (от optional) и необязательным значением по-умолчанию: (def f (a b (o c 10)) <body>) означает, что f принимает три параметра a, b и с, причем c — необязательный, и со значением по-умолчанию 10. На мой взгляд, идея отличная. Сравните с &optional в CL! Но это еще что. Недавно я наткнулся на полный отвал башки. Представьте себе, что може означать такое объявление: (def repeat ('n . 'body) ...)Вот чем хороша точка в списке параметров? Тем, что если вы видите ее впервые, вы скорее всего правильно поймете ее смысл. Тут — та же идея, но гораздо круче. Апостроф означает (quote ...), а зачем может понадобиться апостроф в списке аргументов? Правильно, чтобы «выключить» вычисление аргументов, т. е. для объявления макросов. Понятно, что это всего лишь «сырая» идея. Во что она может вылиться можно прочитать у некого diiq. Он там вокруг этого строит вообще совершенно новый Лисп. Даже если вам не нравится, к чему он пришел в конечном счете, согласитесь, идея квотирования аргументов — гениальна, не меньше! Забудьте про макросы! Они больше «не нужны», достаточно старого доброго def :-). Сам Пол Грэм осваивает неиспользуемые семантики очень интенсивно. Например, в классическом Лиспе структура данных на функциональной позиции не имеет смысла. В Арке — это неявный sref. Коротко и гениально. В комментариях к Акру можно найти переживания о том, что семантика имени на функциональной позиции никак не используется. Там же предложено несколько вариантов ее освоения. Попробуйте придумать, что может означать выражение ('f x). Наделяя смыслом то, что раньше смысла не имело, можно увеличить выразительность языка, не увеличивая многословности. Или, что тоже самое, — уменьшить размер программ, не уменьшая функциональности. В естественном языке слова и фразы, не несущие смысла (или несущие мало смысла), называют паразитами. Проводя аналогию, можно сказать, что CL'вские &rest и &optional &mdash паразиты, а программы на Джаве, C# и подобных языка — это сплошной мат и заикания.
18th November 2009
12:53pm: Victor Wooten
Самая интересная басовая партия из всех, что я когда-либо слышал.
14th November 2009
1:10am: Безладовый бас
Мое последнее бессмысленное приобретение:  Раньше никогда не играл ни на каком безладовом инструменте. Было маленькое исключения, на первом курсе держал в руках скрипку-четвертушку, на которой мне удалось изобразить Синий платочек. Безладовый бас в тысячу раз интересней обычной бас-гитары (или просто гитары — не важно). Дело не в том, что играть сложнее, а в том, что пока ты не можешь это спеть, ты точно не сможешь это сыграть, в то время как на ладовых (или на клавишных) инструментах можно играть абсолютно механически. Ну и плюс в этом диапазоне частот биения в терции можно чуть ли не отсчитывать вслух, такие они редкие.
13th November 2009
11:30pm: Александр Степанов
В Википедии приведены очень интересные цитаты Александра Степанова, но если прочитать несколько интервью с ним, то интересного узнаешь гораздо больше. Я бы даже сказал, что то, что в Википедии — не самое интересное. Q: ...What do you think of Java? A: ...It keeps all the stuff that I never use in C++ - inheritance, virtuals - OO gook - and removes the stuff that I find useful. It might be successful - after all, MS DOS was - and it might be a profitable thing for all your readers to learn Java, but it has no intellectual value whatsoever. В: Когда и по какому поводу вам пришла в голову эта идея? (Об STL.) О: ...Это была еще не очень совершенная идея. Пройдя через много ступеней, я со временем развил ее, сделав то, что сейчас называется стандартной библиотекой шаблонов в языке C++ - Standard Template Library, STL. Это часть языка, которая прописывает основные структуры данных и алгоритмы на них. Эта идея совершенно не зависит от языка, но в некоторых языках ее легче воплотить, а в некоторых труднее. В C++ ее удалось воплотить с трудом. Даже после того, как я уговорил его создателя Бьерна Страуструпа, своего хорошего друга, внести некоторые изменения в язык C++. Q: ...How did you come to these C++ code idioms? A: ... But it took me many years to discover all the techniques. And I had many false starts. For example, I spent years trying to find some use for inheritance and virtuals, before I understood why that mechanism was fundamentally flawed and should not be used. I am very happy that nobody could see all the intermediate steps - most of them were very silly. Q: A frequent dilemma for me was: should I design this function as a member function or as a generic (global) function? what has been the rationale of this decision in STL? A: Make it global if it at all possible. И еще много, много всяких прикольных фраз.
4:36pm: Традиции
Кого-то из дирекции студгородка клюнул жареный петух в жопу. Всем сотрудникам нужно принести выписку из домовой книги, справку о составе семьи и выписку из финансово-лицивого счета по месту постоянной регистрации. Удивительно, но денег на билет до места постоянной регистрации почему-то не предложили. Мне повезло, я зарегистрирован в Муроме (340 км от Москвы), так что это не мега-проблема. На вопрос зачем эти документы нужны ответили (дословно): «для продления срока проживания в общежитии». А на попытку уточнить сказали (дословно): «Мы все так делаем каждый год!» В общем, я это так понял: в студгородке есть такая традиция. Вот мы с вами каждый год празднуем день рождения, а в студгородке каждый год собирают справки. Зачем? Глупый вопрос, зачем мы день рождения празднуем? Просто так, для удовольствия.
8th November 2009
12:59am: Tailcall
Такая ситуация: есть две функции на C++ ref eval(ref e, ref env, bool tailcall) и ref apply(ref fn, ref args, bool tailcall)они являются обертками над ref dispatch(call c), который в блоке try/catch вызывает actual_eval и actual_apply. Перехватывая специальное исключение, вместо выхода зацикливается, реализуя, таким образом, оптимизацию tailcall. Возникает философский вопрос, нужно ли при выполнени хвостового вызова писать return: return eval(expr, env, true), если совершенно ясно, что eval ничего не возвращает (точнее возвращает, но через эксепшн)? Если не писать, то gcc навязчиво ругается на отсутствие return. Вот дурак. UPD: Кстати, такая оптимизация tailcall замедляет работу программы в ~10 раз.
5th November 2009
4:15pm: Строки
Как вы думаете, в языке программирования вообще нужны два вида строк? Я имею в виду обычные и с поддержкой уникода. В Арке, например, только один тип и я вот все больше склоняюсь к тому же: вполне хватает сток из байт, в которых можно хранить все, что угодно, например utf-8 последовательности. При этом символьного типа тоже достаточно только одного, который бы хранил символы из UCS4 (тоже как в Арке). У Пола Грема в исходниках Арка в коментариях есть куча интересных идей. Одна из них, например, избавиться вообще от строкового типа, а оставить только имена (symbols). Напомню, что массивов в Арке не было изначально. Нужно будет обязательно все их выписать и перевести на русский.
2:57pm: The God, the Devil and the NetBSD.
Наткнулся тут на супер инересное обсуждение в рассылке netbsd-advocacy.
4th November 2009
7:33pm: Искусственный недоинтеллект
А вы слышали, что в gcc 4.6 планируют добавить модуль suggest. Теперь, если программист ошибся, компилятор попытается исправить ошибку за него. В засисимости от ключей, он может как предложить наиболее часто встречающиеся варианты замены, так и вообще не уведомить пользователя об исправлении. В 4.6 suggest можно будет задать ключами, а в будущих версиях планируется его включить по-умолчанию. Ну как? Представили? Страшно стало? Это, конечно, шутка. Но меня скоро по ночам будут мучать кошмары от того, что происходит в мире софта! Компьютеры через 100 лет захватят планету и истребят нас! Dpkg-шные скрипты в Ubuntu пользуются утилитами из PATH пользователя, не устанавливая свой! Вы вот сходу можете сказать, что делать, если apt-get remove не удаляет пакет, из-за того, что его postrm-скрипт что-то там нашел у меня в системе, что ему не понравилось? Что в такой ситуации вообще делать обычному пользователю? Убунтушные бинарники почти все (а может и не почти) находят so-шки отовсюду. Вот поставил я из pkgsrc какой-нибудь пакет и на тебе, бац, sshd перестал запускаться! Почему? Хрен знает. Система настолько умная, что она решила больше не пользоваться своей старой libcrypto, а нужно подцепить новую. Вот кто собирал этот софт? -Wl,-rpath вообще для кого придуман? Линукс умный? FreeBSD не глупее! Поставил я себе пару утилит из pkgsrc и бац(!) софт из портов перестал собираться! Почему? Да все просто: потому что у меня видите ли pkg-config в путях новый появился. А в базе нового pkg-config'а ничего нет. Все эти примеры по большому счет элементарные ошибки в системе сборки и их легко исправить. Но ведь есть GNU Autotools, которые не по ошибке, а совершенно намеренно наделены искуственным недоинтеллектом. Они созданы для того, чтобы находить в моей системе даже то, о чем я сам не знаю. Все правильно, я-то кто? Я — тупой программист, а они — разумные существа, живущие в вашей системе собственной жизнью. Торжественно клянусь никогда ни при каких обстоятельствах ни за какие деньги не пользоваться GNU Autotools. Пусть Алексей Чеусов доделает свой mk-configure, и тогда все смогут спать спокойно без опасения, что компьютеры из будущего пришлют нам терминатора.
7:07pm: LL(1)?
Кто-нибудь когда-нибудь обращал внимание на то, что грамматика Лисповских списков с точкой (для указания произвольного cdr) не является LL(1) и не может быть к ней приведена ни избавлением от левой рекурсии, ни левой факторизацией? E → a | (L) | (X . E) L → ε | E L X → E L
5:05pm: Возвращение
Недавно вышла новвая версия отличного дистрибутива Линукса — Ubuntu. В этот день я перешел на FreeBSD. Теперь все как в старые добрые времена, только еще лучше, потому что FreeBSD теперь и правда работает на моем ноутбуке. В смысле, мне теперь ради нее не нужно отказываться от того, к чему я привык — теперь она просто работает. До того, как я купил свой последний ноут, а это было как раз перед выходом FreeBSD 7.0, на старом ноутбуке я использовал FreeBSD 6.x, и она более-менее работала. Но на новом мне пришлось перейти на Ubuntu Linux, потому что FreeBSD не смотря на то, что я к ней очень привык, и правда было невозможно польоваться: 1. Были глюки с ACPI: при работе от аккумулятора все страшно тормозило, при подсоединении питания, в исходный режим она не возвращалась. 2. 7-я ветка и все предыдущие падают при попытке вытащить USB-ностиель неотмонтировав. Не то чтобы, это было очень нужно, просто у меня был кардридер с плохим USB-разъемом, а еще при большой нагрузке перезагружался контроллер внешнего винта. Я потом купил нормальный, но это не решило проблему с кардридером. 3. Но новом ноутбуе стояла неподдерживаемая Wifi-карточка на чипе bcm4311. Линукс тогда ее тоже не поддерживал, но на Линуксе по крайней мере исправно работал ndiswrapper, а под FreeBSD 32-разряный ndis карточку не видел, а 64-разрядный, вообще, ронял систему. 4. Драйверы Nvidia не рабоют в 64-разрядной FreeBSD (до сих пор, кстати). 5. Линуксовский flash-плагин ронял firefox на каждом втором flash-ролике. Ради FreeBSD я был готов отказываться от очень многого. Я долго искал решения этих проблем в интернете, и в конце концов что-то решил, что-то обошел. Во-первых я смирился с 32-разрядной FreeBSD, это решало проблему с Nvidia. Проблемы с ACPI тоже решались хитрыми sysctl-ами. Но жить без Wifi и терпеть падения системы из-за плохого раъема USB в кардридере — это перебор. Ubuntu, причем amd64-версия, поддерживала все из коробки, кроме разве что WiFi, но он заработал через ndiswrapper. Мое отношение к Линуксу было приблизительно такое: я его ненавижу, ну так, более-менее терплю. Но, увы, FreeBSD суждено было отойти на второй план. Если быть честным, то большая часть того, чем мне не нравится Линукс, это дело привычки. За пару недель я смирился, перепривык, перенастроил все так, чтобы было похоже на BSD. Но после первого же обновления Ubuntu показала себя во всей красе. Второе обновление — и «это кино я уже когда-то видел». Но черт бы сним, я же не тупой юзер, я могу решить любые проблемы, если они решаются. Ради справедлисвости скажу, что и у FreeBSD с обновлением не все гладко. Однако у меня ни разу не было такого, чтобы новая версия перестала работать с железом, с котороым все работало раньше. С установленным софтом из портом бывало много проблем, но все они всегда решались одинаково просто. Линукс же «развивается» так интенсивно, что ни в чем нельзя быть уверенным. После обновления до 9.10, у меня в Ubuntu перестал работать тачпад! Я уверен, что это можно решить, но до тачпада руки не дошли, потом что перестала работать Wifi-карточка. В Линуксе есть 3(!) способа заставить работать мой Wifi: ndiswrapper, b43 и wl. Раньше работали b43 и ndis. Сейчас все они распознают карточку, но не видят сеть. Проклял линукс в очередной раз, потратил несколько часов в поисках решения проблемы, и вспомнил, что FreeBSD как раз вот-вот выпустят 8.0. Уже RC2 доступен. А Release Candidat во FreeBSD -- это все равно, что Super-Extra-Mega-Stable в Линуксе. Поставил на отдельный раздел поиграться, и увидел что заработал 64-битный ndiswrapper! Wifi-карточка увидилась и зараборала. Проблем с ACPI нет. Грубое вытаскивание флешки не приводит к падению. А на Nvidia-вский драйвер я забил. Спасибо Абдулле Ариффу, стандартный nv с его патчем распознает мою видюху. Последняя проблема — flash. 8.0 поддерживает бинарную совместимость с новым 32-битным Линуксом. Теперь www/linux-f10-flashplugin10 замечательно работает. Более того, теперь flash стал играться лучше! Поклонники Линукса, вы мне, конечно, не поверите, но падлой буду, и мамой клянусь, честное слово flash под FreeBSD перестал тормозить и занимает меньше процессороного времени. В Линуксе с родным, кошерным nvidia-драйвером, flash при развертывании на весь экран подтормживал, была заметна волна при перерисовке. Во FreeBSD с убогим nv, и с тем же самым Линуксовским же проигрывателем flash играется замечательно. Я рад как никогда.
4:14pm: Удалил себя из Вконтакта
Во Вконтакте либо не было кнопки удалить, либо они исчезла. Но при попытке все там запретить и выйти откуда только можно, в какой-то момент он начал говорить, что моя страница была удалена владелцем. Я не заметил после чего именно. Ну и отличненько. Из Одноклассников я удалился уже давно. Я все еще присутствую в Моем круге. Фотки есть в Пикасе.
29th October 2009
12:37pm: Почти рекурсивные функции
Объявляя глобальную рекурсивную функцию, она на самом деле остается рекурсивной только до тех пор, пока ее имя не переопределено. Т. е. если эту функцию сохранить в другом месте, а старое имя связать, например, с другой функцией, то та старая будет вызывать вместо себя новую: guile> (define (f x n) (if (= n 0) x (f (+ x 1) (- n 1)))) guile> (f 10 20) 30 guile> (define g f) guile> (define (f x n) x) ; в этот момент исходная функция перестала быть рекурсивной guile> (f 10 20) 10 guile> (g 10 20) ; сюрприз! g внутри вызывает не себя, а f (впрочем, именно так, как в теле и сказано) 11
Если хочется «поистине рекурсивную» функцию, то можно ее объявить с помощью letrec+lambda: (define f (letrec ((self (lambda (x n) (if (= n 0) x (self (+ x 1) (- n 1)))))) self))
Тут, функция f в теле вызывает себя не по имени f, а по имени self, которое находится в локальной области видимости, т. е. не может быть переопределено. (Это может быть еще и эффективней, но может и не быть.) Обычно в диалектах Лиспа для объявления анонимных рекурсивных функций уже есть макрос, разворачивающийся в то, что я тут написал. Ну и Y-комбинатор никто не отменял.
21st October 2009
2:26pm: Стрелки в vim'е
Меня не перестает удивлять насколько много людей используют vim и передвигаются по тексту клавишами-стрелками. Когда-то давно, когда я только начал использовать vim, для меня, вообще, было сюрпризом узнать, что кто-то использует vim не для того, чтобы иметь возможность передвигаться по тексту с помощью клавиш h, j, k и l. Я был уверен на 100%, что единственная причина, почему люди используют vim — это возможность не переносить руки с основной позиции на клавиатуре при передвижении по тексту. Я печатаю быстро, вслепую, десятью пальцами, на двух раскладках и давно. До vim'а я долгое время пользовался emacs'ом, а когда перешел на vim, очень радовался, что теперь в нем для передвижения по тексту не нужно удерживать сtrl (в emacs'е для передвижения используются комбинации с ctrl), т. е. даже тогда давно я не мог предположить, что кто-то может пользовался стрелками тогда, когда есть возможность не переносить руки с основной позиции. «Даже» потому, что в emacs-е это не очень-то удобно, ведь влево и вправо (ctrl+b и ctrl+f) и вверж и вниз (ctrl+p и ctrl+n) в emacs'е правильно набирать с разными ctrl-ами, вправо и влево — с правмым ctrl'ом, а вверх и вниз — с левым. Из-за этого неудобства, vim показался чудом. Все остальные фичи vim'а и emacs'а я узнал существенно позже. Но также как качество ресторана я определяю в первую очередь по вкусу еды в нем (а не потому, что там улыбаются кассиры, они могут засунуть свою улыбку себе в жопу, если у них хреновая еда), текстовый редактор я назову хорошим только в том случае, когда в нем удобно набирать текст. И мне абсолютно до лампочки то, что во всяких Visual Studi'ях и Borland'овских редакторах есть автокомплит, хренит, подсказки, исправления, и вообще искусственный интеллект, если в них нельзя нормально быстро набирать и исправлять текст, или если в них недетерминированное поведение (как, например в MS Word'е). То, что в emacs'е и vim'е и всяких opensource IDE многие такие вещи уже тоже давно реализованы, я вообще не говорю, потому что это абсолютно неважно, если не выполнено главное условие. В столовой на Соколе, где готовят, как сейчас говорят, «чурки», эти чурки супер-вежливые и приветливые, причем вежливые без какой-либо корпоративной политики, они не говорят «сударь» и пр. корпоративный бред и не следят, чтобы на лице постоянно висела фальшивая улыбка. Они производят впечатление добрых, хороших, приветливых и вежливых людей. Но, если бы я захотел прорекламировать эту столовую, я бы скорее всего про все это забыл. Знаете почему? Потому что в этой столовой вкусно готовят. О хорошем персонале можно говорить сравнивая два ресторана, если в них вкусная еда. Если нет, то наплевать на то, насколько там вежливые официанты и кассиры. Если тексовый редактор не позволяет редактировать текст удобно и быстро, то не играет никакой роли, какие в нем есть «фичи». Так с чего я начал? С того, что я продолжаю узнавать все новых и новых людей, которые пользуются vim'ом и передвигаются по тексту стрелками! А когда стрелки не работают (прописан неверный тип терминала и пр.), то они не могут ничего в нем сделать. Для меня это тоже самое, что придти в эту столовую на Соколе и заказать там хот-дог, а когда там скажут «у нас этого нет», подумать «Вот блин, тупые чурки, у них даже хот-дога нет! Понаехали, мать их!».
20th October 2009
9:06pm: Let over lambda
Купил наконец книжку Let Over Lambda. Замечательнейшая книга. Пока прочитал только 3 главы (ококло четверти), но уже готов цитировать каждый абзац. Как и On Lisp Пола Грэма, книжка хорошо дает понять, что такое Лисп на самом деле. Но для меня даже важнее то, что в ней объяснены причины того, почему Common Lisp такой, какой он есть. Почему он Lisp-2, зачем нужна эта гремучая смесь лексических и динамических области видимости и пр. То есть не просто рассказано, что CL вот такой (я лично многие такие его «фичи» до недавнего времени называл уродствами), а объяснено откуда ноги растут, почему он такой, как это можно использовать и, в большинстве случаев, почему это круто. С крутизной можно и не соглашаться, конечно, но это ничего не меняет — книжка великолепная. Содержание. Вся книга от начала и до конца посвящена макросам. Это настоящая жесть :-). Разоблачаются все виды дублирования кода. В тысячу первый раз убеждаюсь, что псевдокод в книгах по программированию — признак лени авторов. Нет лучшего способа описать алгоритм в книге (или на доске), чем дать код на реальном языке программирования. Если кажется, что на реальном языке получится слишком непонятно или слишком длинно из-за ненужных деталей, то нужно тупо выкинуть такой язык программирования. В случае с Лиспом, нет ни одной причины писать на псеводоязыке (кроме лени, повторюсь). Рекомендую всем. Одна из лучших книг, что я читал.  (Посмотрите, что на левой стороне разворота!)
13th October 2009
2:38pm: Приехал третий уницикл
Суперточные и педантичные немцы послали уницикл не по тому адресу, который я указывал в заказе. Послали по billing, а не по shipping address-у. А адрес я указывал другой, потому что в общежитии легко теряются квитанции, которые сваливаются на стол в общую кучу, и которые каждый день нужно сортировать, чтобы найти свою. Но мне повезло и знакомый эту квитанцию заметил и принес (Алексей, спасибо!). Получилось даже немного удобнее, но сам факт ошибки подрывает доверие к магазину. Кроме того, в этом уницикле, как и в предыдущем, колесо устанавливалось слегка косо, поэтому мне опять пришлось подложить картонную прокладку под левый подшипник, с ней все выровнялось. Итак, забрал его с почты.  В такой комплектации.  Теперь наша коллекция велосипедов выглядит так.  Новый уницикл великолепен. Сильно отличается от двух предыдущих. Секрет в том, что на нем установлены шатуны длиной 150 мм. А на обоих предыдущих были 175-миллиметровые. От этого на нем труднее удержаться на кочках, но существенно легче ездить по ровной дороге. Легче крутить педали с большой частотой, поэтому максимальная скорость выше, кроме того его не так сильно болтает вправо-влево (из-за массы шатунов, педалей и ног), гораздо легче поворачивать и разворачиваться, ездить назад, да и вообще все приемы получаются лучше. Но вместе с этим на нем и упасть проще.  Другие преимущества: выглядит красивее, на раме есть упор для ног (на 26-дюймовом тоже был, а на 20-дюймовом — нет), более удобное сидение и покрышка для фристайла. Есть и недостаток: нет упора снизу для штыря, на котором крепится сиденье, и он входит в раму насквозь и может провалиться до самого колеса и заблокировать его. Такое, правда, вряд ли случится в реальности, но все равно неприятно. Теперь мы катаемся вместе с Таней с почти одинаковой скоростью.
8th October 2009
2:16pm: А знаете ли вы, что...
... несмотря на то, что в стандарте Scheme нет человеческих макросов (а есть только убогий define-syntax и пр.), Guile их все равно поддерживает, а Mzscheme — нет. Guile — молодец, а Mzscheme — говно. При этом Guile поддерживает define-syntax на уровне библиотеки, а Mzscheme якобы(!) тоже поддерживает нормальные макросы (модуль defmacro.ss), однако не дайте себя обмануть, Mzscheme-овский defmacro — это дешевая подделка! Скажем, мне нравиться синтаксис Arc'а для введения локальных переменных. Он гораздо красивее, чем оригинальный scheme-овский let. Сравните сами. Arc: (with (a 10 b 20) ...)
Scheme: (let ((a 10) (b 20)) ...)
Так вот, процедуру, разбивающую (a 10 b 20) на пары, имело бы смысл вынести из тела макроса. (def pair (l) (if (null? l) '() (let ((tail (cdr l))) (if (null? tail) (list l) (cons (list (car l) (cadr l)) (pair (cdr tail)))))))
Однако Mzscheme не позволяет использовать эту pair внутри defmacro. Следующий код работает в Guile, но не работает в Mzscheme. (defmacro mac macro `(defmacro ,@macro)) (mac def (name args . body) `(define (,name ,@args) ,@body)) (mac fn lamb `(lambda ,@lamb)) (mac with (params . body) `((fn ,(map car (pair params)) ,@body) ,@(map cadr (pair params))))
Не удивительно, почему Лисп непопулярен. На мой взгляд Лисп хорош именно тем, что на нем можно написать любой другой язык, а без макросов это сделать невозможно. Так на каком Лиспе тогда писать? CL — уродство, но кроме него, получается, стандартизированного ничего нет, поэтому либо уродливо, либо непереносимо.
1st October 2009
1:39am: Маленькая надежда на счастье
Сегодня я на кафедре собрал и почти настроил машину с двухядерным Атлоном II, 2800 ГГц. Памяти пока немного (сколько было сразу): 1 ГБ, но надеюсь в ближайшее время поставить 4 ГБ (а может и 8). Чипсет AMD 770. Диск один, старый SCSI 70-гиговый 10-тысячник Seagate. Надеюсь скоро его зазеркалируем. Если все пойдет хорошо, то «пустим» туда студентов. ОС — NetBSD 5.0.1 (amd64). Называется chinua.umc8.ru (в честь нигерийского писателя) и доступна по IPv6. Пока на ней никто (кроме меня) не заведен, в ее существовании можно убедиться только по stats.umc8.ru (только по IPv6), но скоро можно будет и зайти. Для сравнения производительности: bzip2 на ней работает в 9.3 раза быстрее, чем на axp4 (21164, 533 МГц), а учитывая два ядра, получаем коэффициент 18.6! Других тестов пока не делал.
30th September 2009
12:49am: Вики УМЦ-8
На страничке wiki.umc8.ru теперь будут публиковаться лабораторные работы по информатие для первокурсников 8-го факультета МАИ и, возможно, другие материалы. В данный момент там почти ничего нет. Есть, однако, задание к 5-й лабораторке (по Тьюрингу).
28th September 2009
4:57am: Крокодил Данди
Видели когда-нибудь человека, который ловит крокодилов? Вот он какой:  (крокодиловая ферма в Мелакке)
4:16am: Фрукты
Пересматривал фотографии из Малайзии и нашел много интересных, которые я еще не выложил. Например, фотографии из Taman Wawasan (парк Wawasan) в Путраджае. Бананы,  ананасы,  кокосы,  рамбутаны,  и каучуковое дерево.  Между прочим, по-малайски волос — rambut. А еще смешно: кокос — kelapa, а kepala — голова, легко перепутать :-).
26th September 2009
8:24pm:
У вас так бывает, когда что-то, что в общем-то нравилось всю жизнь и что постоянно или периодически (но часто) вас занимало, начинает тускнеть и казаться неинтересным? Не то чтобы перестало нравиться, а просто надоело, стало казаться, что в этой области интересного больше ничего не может быть. Не вы не можете найти, а вообще нет. А потом бам! И кажется, как я мог так думать?!! Это же бесконечно интересно и никогда не перестанет быть интересным. Когда я был в Малайзии, я от безделия начал читать книжки по физике. Нет, не для того, чтобы готовиться к лекциям (там особо не к чему было готовиться), а так, для себя, от скуки. И бам! Я наткнулся на книжки Фейнмана. Аналогичное бам в области программирования произошло со мной, когда я узнал, что такое Лисп (до него казалось, что принципиально нового я уже ничего не узнаю). Недавно то же произошло в области музыки. Мне плавно и долго музыка начинала надоедать вообще вся. И вот бам, я послушал Victor'а Wooten'а, а потом и Bela Fleck and the Flecktons. Про уницикл и говорить нечего. И так понятно, насколько это для меня круто.
12:48am: * * *
В свете вот этого, совсем неудивительно. А у нас, блин, едешь по парку на уницикле, и на тебя показывают пальцем. Так и хочется ответить: «Несчастные вы люди, честное слово».
22nd September 2009
2:39pm: Ездить на уницикле назад — легко
Ну, не так легко, как вперед, конечно, но и не сложно.  (фото Анастасии Чупруновой) Просто ехать назад начало получаться уже давно, но ехать продолжительно не падая и хоть как-то маневрировать — только в последние дни. А тем временем, новый 24-дюймовый freestyle-уницикл уже на пути из Германии в Россию. 26-дюймовый подходит для прогулок и поездок, на 20-дюймовом хорошо учиться трюкам (хотя не без проблем: при резком повороте с большим наклоном, педаль чиркает по асфальту, хотя может просто нужно купить более короткие шатуны). А 24 дюйма — что-то среднее, надеюсь, подойдет и для того и для другого. А кроме того, можно будет гулять вдвоем (на 20-и и 26-дюймовом слишком уж большая разница в скорости).
Powered by LiveJournal.com
|
|