На самом деле
(setq (hash (make-hash-table :test #'equal))
превращяется в:
class FileDb(dict):
def push(self, name, size, dir):
try:
self[(name, size)].append(dir)
except KeyError:
self[(name, size)] = [dir]
filedb = FileDb()
На питоне это необходимо сделать т.к. в питоновском словаре одному
ключу соответствует одно значение. В лисповом hash-table (поправь если я ошибаюсь) могут хранится несколько элементов с одинаковыми ключами.
В данной задаче требуемое поведение контейнера совпадает с
дефалтовским поведением контейнеров в лиспе. Питоновский контейнер
надо адаптировать к задаче. Если в задаче можно будет использовать тот факт что одному ключу соответствует одно значение, то ситуация
изменится на противоположную.
(push "/foo" (gethash (list "file.txt" 777) hash))
превращается в
filedb.push('file.txt', 777, '/foo')
В лиспе требуется оперировать с лишними сущносями типа gehash и list.
У питона здесь преимущество.
лисповое
(defun find-and-get (h &key (count 0) (cmp #'>))
(let ((r nil))
(maphash (lambda (k v)
(when (funcall cmp (length v) count)(push (list k v) r))) h)
r))
> превращаецо в:
def find_and_get(cond=lambda n: n > 0):
for (f, s), dirs in filedb.iteritems():
if cond(len(dirs)):
for d in dirs:
yield (f, s, d)
> в котором три (!) управляющих конструкции которые в лисповой версии
> заменены на функции и макросы
А почему ты пощитал именно управляющие конструкции, а не что-то
другое? Не макросы и не функции.
Имхо, эта фраза должна звучать так: "в котором три (всего!)
управляющих конструкции которые в лисповой версии заменены на
функции (!) и макросы(!!!)"
> Бесполезное образование структуры данных. Всяк, независимо
> от знания питона, встретив это в тексте, должен будет найти
> её определение, чёбы понять чё оно делает. Это по вашему
> делает прогу более читабельной, а?
По моему это стандартный аргумент против макросов :-)
Типа для того чтобы понять как что-то работает, надо найти его
определение. Но ты ведь в курсе что по этому поводу сказал Грэм. :-)
Или нет?
Короче, ты передёргиваешь.
P.S. Хочется таки посмотреть на лисповую прогу с БД.
> ну, типо если есь информация, которая позволит построить код и пощитать значения в время компиляции - делает, а если нет, например чясь данных извлекается из устройства ввода - оставляет на рантайм.
это полностью здорово. Проблема в том что непонятно что нужно пытаться посчитать в рантайм, а что нет -- потому что неизвестно сколько будет работать функция и завершится ли она.
Не согласен. Это будет архисложная задача. И выиграет тот язык у которого будет меньший рост сложности решения в зависимости от роста сложности задачи. Это будет победа именно языка.
запросто. Но такая хня получяецо. Всё-таки, какая форма записи для например "добавить в хеш х по ключю к значение а" кажецо тебе наиболее удобной? В смысле, не из существующих а вообще?
> Пусть лисперы, змеефилы и сиплюсплюсовцы напишут для неё по боту. Чей бот выиграет, того язык и лучший.
Есть такая штука http://www.icfpcontest.org. Там в прошлом году как раз ботов программировать и надо было. Можно использовать любой язык. Так вот питон там не рулит, что в принципе понятно (зато в том году он был на третьем месте по популярности). А что не понятно, так это то что там лисп тоже не рулит.
1:1 то же самое, что у меня на плюсах, только без "шума" явной статической типизации. Ну, то что у вас хеш, а у меня map (который в GNU STL унутре черно-красное дерево) - это детали реализации.
Да, еще, для плёхо говорьящихь на CL - а что будет с вашей прогой, если сделать
> > STL подглядывать, на тему "а какая у нас семантика
> а в лиспе всё одинаковое :P
Дащаз. map-ом простым по хешу разве пройти можно? Фиг, maphash. А вот в STL все алгоритмы работают по итераторам, которые очень generic - главное, чтобы "модель" совпадала, а какой там конкретно тип - пофик.
> В этом чёто есь, да. Но дело не в том, что лехче читаецо, а что лехче _пишецо_, ибо читать прогу всёодно по большей чясти комп будет.
Нет, нет, и нет. См. Perl (я его очень хорошо знаю, ибо это мой рабочий инструмент). Он очень выразительный и гибкий (на спор - любая программа на Perl-with-whole-CPAN короче, чем аналог на CL), но если этим злоупотребить, то будет больно - через неделю не вспомнишь, что ж ты блин такое написал.
Только поэтому питон вообще и начали использовать, в остальном он перла ничем ровно не лучше. Та ж история с C++ vs. Java, имхо.
> > ну, типо если есь информация, которая позволит построить код и пощитать значения в время компиляции - делает, а если нет, например чясь данных извлекается из устройства ввода - оставляет на рантайм.
> это полностью здорово. Проблема в том что непонятно что нужно пытаться посчитать в рантайм, а что нет -- потому что неизвестно сколько будет работать функция и завершится ли она.
Если есть границы между "чистым" и "интересным" кодом (в смысле, чисто аппликативным и имеющим сайд-эффекты) (как в Haskell, например), то, наверное, можно что-то сделать эдакое.
I am trying some examples from practicalcommonlisp.pdf, but can't run some code described there (page 54. I tried on ACL and SBCL, got the same result):
> На питоне это необходимо сделать т.к. в питоновском словаре одному ключу соответствует одно значение. В лисповом hash-table (поправь если я ошибаюсь) могут хранится несколько элементов с одинаковыми ключами.
в любом ИМХО хештабле ключ уникальный. В лисповом к этому ключю присобачен список, один штук. Т.е. значение одно, но оно не примитивново типа а списох.
> В данной задаче требуемое поведение контейнера совпадает с дефалтовским поведением контейнеров в лиспе. Питоновский контейнер надо адаптировать к задаче.
Дык в этом и вся соль, чё поведение высокоуровневово языка стремицо к человечьему представлению задачи, а менее низкоуровневый нужно адаптировать многочисленными дополнительными подробностями.
> У питона здесь преимущество.
в том, чё нужно изготавливать нужные контейнеры вручную вместо использования готовых?
> А почему ты пощитал именно управляющие конструкции, а не что-то другое? Не макросы и не функции.
А ты пощитай и макросы и функции в обеих, чё я один всё должен делать?
> Имхо, эта фраза должна звучать так: "в котором три (всего!) управляющих конструкции которые в лисповой версии заменены на функции (!) и макросы(!!!)"
Тоже самое в принципе. Но на практике, конструкцию с функциями можно приспособить к более другой задаче, заменив функцию на другую. А управляющие конструкции - низкоуровневы по природе, не адаптируюцо. Я уже спрашивал, станет ли асм высокоуровневым если в нево добавить списки и хеши и ещё? Там ведь по сути ничё кроме управляющих конструкций нету.
> По моему это стандартный аргумент против макросов :-)
аха, только такую простую задачю можно и без них удалось, а вот в питоне без бесполезной структуры не обошлось.
> Типа для того чтобы понять как что-то работает, надо найти его определение. Но ты ведь в курсе что по этому поводу сказал Грэм. :-) Или нет?
не
> Короче, ты передёргиваешь.
а твоя прога длиннее и запутаннее
> P.S. Хочется таки посмотреть на лисповую прогу с БД.
> Не согласен. Это будет архисложная задача. И выиграет тот язык у которого будет меньший рост сложности решения в зависимости от роста сложности задачи. Это будет победа именно языка.
Ну, врядли. Любой алгоритм можно реализовать и на асме, и даже на питоне при желании. Вопрос во времени и силах только.
> 1:1 то же самое, что у меня на плюсах, только без "шума" явной статической типизации. Ну, то что у вас хеш, а у меня map (который в GNU STL унутре черно-красное дерево) - это детали реализации.
а тот факт, чё лисповые выражовывания в полстроки на ... нужно сочинить и потом вполэкрана запечятлеть?
> а что будет с вашей прогой, если сделать (push "/foo" (gethash (list "file.txt" 777) hash)) раз эдак 10?
Ну будет добавлено 10 значений в список с данным ключём.
> (на спор - любая программа на Perl-with-whole-CPAN короче, чем аналог на CL),
По символам/строкам - возможно, но логически вряд ли. Хотя достоверно не ведаю, мне перл незнаком
> но если этим злоупотребить, то будет больно - через неделю не вспомнишь, что ж ты блин такое написал.
Лисповые проги поэтому и выглядят ненамного короче питоньих например, потому что в их довольно длинные токены навроде make-hash-table, как раз чёбы легче разобраться было. Ну и незамысловатые логические конструкции, тоже способствуют.
(:TITLE "Roses" :ARTIST "Kathy Mattea" :RATING 7 :RIPPED T) . T)
Это откуда? ^^^
T в конце -- это не список, очем тебе и говорит ошибка. Убери точку
и T все будет хорошо :)
> can't run some code described there
the trouble is ". T" persence at the end of *db* list.
This code will work fine:
(setq *db* '((:TITLE "dbxd" :ARTIST "ewtw" :RATING 0 :RIPPED T)
(:TITLE "safas" :ARTIST "asg" :RATING 0 :RIPPED T)
(:TITLE "Home" :ARTIST "Dixie Chicks" :RATING 9 :RIPPED T)
(:TITLE "Fly" :ARTIST "Dixie Chicks" :RATING 8 :RIPPED T)
(:TITLE "Roses" :ARTIST "Kathy Mattea" :RATING 7 :RIPPED T)
(:TITLE "Home" :ARTIST "Dixie Chicks" :RATING 9 :RIPPED T)
(:TITLE "Fly" :ARTIST "Dixie Chicks" :RATING 8 :RIPPED T)
(:TITLE "Roses" :ARTIST "Kathy Mattea" :RATING 7 :RIPPED T)))
(remove-if-not #'(lambda (cd) (equal (getf cd :artist) "Dixie Chicks")) *db*)
I don't know why the ". T" appeared here because I am one of
so called "bydlocoders" horde and did not read such a book yet.
Surely several things has been changed in the lisp language
since the book was wrote and possible not all examples
will work without applying some adjustments to that.
Если уж взялся писать на английском: на LOR большинством голосов адекватным переводом слова "быдло" признано слово "cattle". Так что гордо зови себя cattlecoder ;)
> а тот факт, чё лисповые выражовывания в полстроки на ... нужно сочинить и потом вполэкрана запечятлеть?
Еще раз и по-русски, пожалуйста. Я, честно, не понял смысл этой фразы совершенно. Вы о том, что лисповая программа короче? Данивапрос, это с самого начала было ясно. А вот утверждение, что она "оперирует абстракциями более выского порядка", чем плюсовая я готов оспорить.
Да, кстати, было бы нехорошо с вашей стороны придираться к стилю - я на С++ не писатель, да и времени потратил на нее немного (минут 15, наверное, вместе чтением доков). Я даже знаю в ней одну явную глупость (FileId::Eq - на самом деле не Eq, а Less - до меня не сразу доперло, что множество, естественно, хочет оператор упорядочения, а не равнества), и одну design deficiency - add_file должен принимать на вход сразу объект FileID, а не (name, size) - так абстрактнее и правильнее.
> > а что будет с вашей прогой, если сделать (push "/foo" (gethash (list "file.txt" 777) hash)) раз эдак 10?
> Ну будет добавлено 10 значений в список с данным ключём.
Т.е. программа будет работать (in my book) некорректно. Потому как pathname у нас все же уникальный должен быть.
Перл и питон ~ одинаковы, лисп вдвое более многословен (и даже "хуже" С!).
> но логически вряд ли. Хотя достоверно не ведаю, мне перл незнаком
Логически они будут одинаковы. И на C оно будет такое же, логически (ну, может будет некий кусок для "поднятия абстракции" - типа реализации абстрактных типов, которых нету в языке).
> Это охтоп хреново собратый, на ём ничё не запускаецо. Я пару раз пробовал.
Руби, однако, в свое время так запыхтел, шо аж свист шел. И Эйфель тоже очень неплохо завелся. С Питончиком было похуже. Но студенты тоже запустили и даже тиклевый интерфейс с биндингом к MySQL прикрутили.
Не, ну я конечно понимаю, Лисп -- особо продвинутый язык...
> Не запускается msi или сам лисп после установки? Что говорит?
Сам Лисп. Пишет про отвал sbcl.exe с pid таким-то, а потом заявляет, что не может найти файл /usr/local/lib/sbcl//sbcl.core. Ежу понятно, что такого пути в офтопе нет. Однако попытка скопировать sbcl.core в соответствующую папку cygwin тоже результатов не дает.
> А вот утверждение, что она "оперирует абстракциями более выского порядка", чем плюсовая я готов оспорить.
ладно, попробуй. Вот такая конструкция например: "a.name < b.name || a.size < b.size", почему в твоей нужно было её заводить вручную а лисповае итак справилось? Или например обращение к элементу хеша по определённому ключю _разное_ для тово чёбы добавить директорий туда и извлечь имеющиеся там? Почему утя в проге многчисленные size_t, а лисповое без них обходицо? и вконце концов ты ведь
> поленился я три (почти) одинаковых функтора рисовать.
а в лисповом однин хватило "вернуть элементы, удовлетворяющие условью:..."?
Вобщем, ИМХО никаких шансов.
> Да, кстати, было бы нехорошо с вашей стороны придираться к стилю
я разве придирался? де? 8()
>>> а что будет с вашей прогой, если сделать (push "/foo" (gethash (list "file.txt" 777) hash)) раз эдак 10?
>> Ну будет добавлено 10 значений в список с данным ключём.
> Т.е. программа будет работать (in my book) некорректно. Потому как pathname у нас все же уникальный должен быть.
программа работает просто замечятельно. Потому что добавление происходит алгоритмом обхода дерева каталохов, где повторений нету. Можно было бы организовать проверку (при желании) но я счёл в рамках этой задачи излишним.
> Перл и питон ~ одинаковы, лисп вдвое более многословен (и даже "хуже" С!).
Ещё раз, дело не в многословии как таковом! Зряшные сокращения, ухудшающие понимание, также вредны, как кучя безсмысленново пустово трёпа.
> Логически они будут одинаковы. И на C оно будет такое же, логически
почему же они тогда не? Готов выклать прогу, логическая длина которой такая же как лисповой, на той же задаче с файлами?
> ну, может будет некий кусок для "поднятия абстракции" - типа реализации абстрактных типов, которых нету в языке
так в этом всё и дело. Реализуеш тип специально для своей задачи => не существует достаточно абстрактново готового, который удалось бы использовать, и созданный тоже недостаточно абстрактен, ибо в другой задаче придёцо реализовать _другой_ тип.
ну незнаю, я несколько раз (!) пытался запустить разные проги на охтопе. Последний раз это было висуальная студия 2003, а до неё какая-то игрушка, и ниодно не заработало.
>Сам Лисп. Пишет про отвал sbcl.exe с pid таким-то, а потом заявляет, что не может найти файл /usr/local/lib/sbcl//sbcl.core. Ежу понятно, что такого пути в офтопе нет. Однако попытка скопировать sbcl.core в соответствующую папку cygwin тоже результатов не дает.
Рад бы помочь, но виндов уже на машине давно нет. Было предупреждение, что статус "experimental". Это означает, что жалобы пока не принимаются. Вполне возможно, что можно как-то заставить работать. Путь там в каком-нибудь sbclrc переставить или еще что. Лучше на этот счет почитать мэйлинг-листы типа sbcl-help или на gmane (gmain.lisp.steel-bank.general). Может быть, там ответы найдутся? Или гууугл. :)
> хорошый повод размять пальцы и взаполучить дополнительное финансирования, переделывая в очередной раз прогу под уползший питон,
Не надо грязи! Мои проги, написанные под Питон 1.5, работают без изменений на 2.4, и даже Си-шные расширения компилируются без изменений (и работают, ага).