LINUX.ORG.RU
Ответ на: комментарий от ero-sennin

> читал все чужие проги и как надо их модифицировал по моему хотению, я б тогда на работу не ходил. :)

Дык утя работа читать проги или модифицировать?

bugmaker ★★★★☆
()
Ответ на: комментарий от bugmaker

>> Так как насчет результатов соревнования?

>Ну взял бы и поанализировал коды пока я дрыхъ

Уже. Мне _твой_ анализ интересен.

tailgunner ★★★★★
()
Ответ на: комментарий от bugmaker

На самом деле

(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. Хочется таки посмотреть на лисповую прогу с БД.

redvasily
()
Ответ на: комментарий от bugmaker

> Ништо не ново под луною, увы. И только наивные юношы питоноеды продолжают изобретать и изобретать...

Назвать Замулина "юношей-питоноедом" - это ты мощно задвинул, внушаить 8) Аффтар, пешы исчо.

tailgunner ★★★★★
()
Ответ на: комментарий от bugmaker

> ну, типо если есь информация, которая позволит построить код и пощитать значения в время компиляции - делает, а если нет, например чясь данных извлекается из устройства ввода - оставляет на рантайм.

это полностью здорово. Проблема в том что непонятно что нужно пытаться посчитать в рантайм, а что нет -- потому что неизвестно сколько будет работать функция и завершится ли она.

dilmah ★★★★★
()
Ответ на: комментарий от bugmaker

> бесполезно, тут выйграет не йазыг а алгоритм.

Не согласен. Это будет архисложная задача. И выиграет тот язык у которого будет меньший рост сложности решения в зависимости от роста сложности задачи. Это будет победа именно языка.

ugoday ★★★★★
()
Ответ на: комментарий от ero-sennin

> А ты умеешь модифицировать не читая? :P

запросто. Но такая хня получяецо. Всё-таки, какая форма записи для например "добавить в хеш х по ключю к значение а" кажецо тебе наиболее удобной? В смысле, не из существующих а вообще?

bugmaker ★★★★☆
()
Ответ на: Предлагаю соревнование от ugoday

> Пусть лисперы, змеефилы и сиплюсплюсовцы напишут для неё по боту. Чей бот выиграет, того язык и лучший.

Есть такая штука http://www.icfpcontest.org. Там в прошлом году как раз ботов программировать и надо было. Можно использовать любой язык. Так вот питон там не рулит, что в принципе понятно (зато в том году он был на третьем месте по популярности). А что не понятно, так это то что там лисп тоже не рулит.

А рулят там Haskell, Dylan и O'Caml

redvasily
()
Ответ на: комментарий от bugmaker

> итд.

> Комментарии?

1:1 то же самое, что у меня на плюсах, только без "шума" явной статической типизации. Ну, то что у вас хеш, а у меня map (который в GNU STL унутре черно-красное дерево) - это детали реализации.

Да, еще, для плёхо говорьящихь на CL - а что будет с вашей прогой, если сделать

(push "/foo" (gethash (list "file.txt" 777) hash))

раз эдак 10?

anonymous
()
Ответ на: комментарий от bugmaker

> > STL подглядывать, на тему "а какая у нас семантика

> а в лиспе всё одинаковое :P

Дащаз. map-ом простым по хешу разве пройти можно? Фиг, maphash. А вот в STL все алгоритмы работают по итераторам, которые очень generic - главное, чтобы "модель" совпадала, а какой там конкретно тип - пофик.

anonymous
()
Ответ на: комментарий от bugmaker

> В этом чёто есь, да. Но дело не в том, что лехче читаецо, а что лехче _пишецо_, ибо читать прогу всёодно по большей чясти комп будет.

Нет, нет, и нет. См. Perl (я его очень хорошо знаю, ибо это мой рабочий инструмент). Он очень выразительный и гибкий (на спор - любая программа на Perl-with-whole-CPAN короче, чем аналог на CL), но если этим злоупотребить, то будет больно - через неделю не вспомнишь, что ж ты блин такое написал.

Только поэтому питон вообще и начали использовать, в остальном он перла ничем ровно не лучше. Та ж история с C++ vs. Java, имхо.

anonymous
()
Ответ на: комментарий от dilmah

> > ну, типо если есь информация, которая позволит построить код и пощитать значения в время компиляции - делает, а если нет, например чясь данных извлекается из устройства ввода - оставляет на рантайм.

> это полностью здорово. Проблема в том что непонятно что нужно пытаться посчитать в рантайм, а что нет -- потому что неизвестно сколько будет работать функция и завершится ли она.

Если есть границы между "чистым" и "интересным" кодом (в смысле, чисто аппликативным и имеющим сайд-эффекты) (как в Haskell, например), то, наверное, можно что-то сделать эдакое.

anonymous
()
Ответ на: Предлагаю соревнование от ugoday

> Пусть лисперы, змеефилы и сиплюсплюсовцы напишут для неё по боту. Чей бот выиграет, того язык и лучший.

Нет. Чей бот выиграет, тому и времени не жальче, где-то так. Или, если это будет оплаченный конкурс - "тот и лучше программист".

Для таких задач, имхо, haskell лучше всех (он, собственно, под них заточен), и практика всяких подобных конкурсов это подтверждает.

anonymous
()
Ответ на: комментарий от anonymous

sorry, cant type in Russian.

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):

CL-USER> *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) . T)
CL-USER>

CL-USER> (remove-if-not
#'(lambda (cd) (equal (getf cd :artist) "Dixie Chicks")) *db*)

And got the following backtrace:

The value T is not of type LIST.
[Condition of type TYPE-ERROR]

Restarts:
0: [ABORT-REQUEST] Abort handling SLIME request.
1: [TERMINATE-THREAD] Terminate this thread (#<THREAD "new-repl-thread" {B52FA39}>)

Backtrace:
0: (REMOVE-IF-NOT #<FUNCTION (LAMBDA (CD)) {BC8F91D}> ((: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) . T))
1: (SB-INT:EVAL-IN-LEXENV (REMOVE-IF-NOT (FUNCTION (LAMBDA # #)) *DB*) #<NULL-LEXENV>)
2: (SWANK::EVAL-REGION "(remove-if-not
#'(lambda (cd) (equal (getf cd :artist) \"Dixie Chicks\")) *db*)
" T)

it is supposed to be the Common Lisp, but it doesn't work.

anonymous
()
Ответ на: комментарий от redvasily

> На питоне это необходимо сделать т.к. в питоновском словаре одному ключу соответствует одно значение. В лисповом hash-table (поправь если я ошибаюсь) могут хранится несколько элементов с одинаковыми ключами.

в любом ИМХО хештабле ключ уникальный. В лисповом к этому ключю присобачен список, один штук. Т.е. значение одно, но оно не примитивново типа а списох.

> В данной задаче требуемое поведение контейнера совпадает с дефалтовским поведением контейнеров в лиспе. Питоновский контейнер надо адаптировать к задаче.

Дык в этом и вся соль, чё поведение высокоуровневово языка стремицо к человечьему представлению задачи, а менее низкоуровневый нужно адаптировать многочисленными дополнительными подробностями.

> У питона здесь преимущество.

в том, чё нужно изготавливать нужные контейнеры вручную вместо использования готовых?

> А почему ты пощитал именно управляющие конструкции, а не что-то другое? Не макросы и не функции.

А ты пощитай и макросы и функции в обеих, чё я один всё должен делать?

> Имхо, эта фраза должна звучать так: "в котором три (всего!) управляющих конструкции которые в лисповой версии заменены на функции (!) и макросы(!!!)"

Тоже самое в принципе. Но на практике, конструкцию с функциями можно приспособить к более другой задаче, заменив функцию на другую. А управляющие конструкции - низкоуровневы по природе, не адаптируюцо. Я уже спрашивал, станет ли асм высокоуровневым если в нево добавить списки и хеши и ещё? Там ведь по сути ничё кроме управляющих конструкций нету.

> По моему это стандартный аргумент против макросов :-)

аха, только такую простую задачю можно и без них удалось, а вот в питоне без бесполезной структуры не обошлось.

> Типа для того чтобы понять как что-то работает, надо найти его определение. Но ты ведь в курсе что по этому поводу сказал Грэм. :-) Или нет?

не

> Короче, ты передёргиваешь.

а твоя прога длиннее и запутаннее

> P.S. Хочется таки посмотреть на лисповую прогу с БД.

Потом, ближе к утру или завтре.

bugmaker ★★★★☆
()
Ответ на: комментарий от tailgunner

> Аффтар, пешы исчо.

спасибо, ещё много буду. До топ 1 дофига осталось :(

bugmaker ★★★★☆
()
Ответ на: комментарий от ugoday

> Не согласен. Это будет архисложная задача. И выиграет тот язык у которого будет меньший рост сложности решения в зависимости от роста сложности задачи. Это будет победа именно языка.

Ну, врядли. Любой алгоритм можно реализовать и на асме, и даже на питоне при желании. Вопрос во времени и силах только.

bugmaker ★★★★☆
()
Ответ на: комментарий от anonymous

> 1:1 то же самое, что у меня на плюсах, только без "шума" явной статической типизации. Ну, то что у вас хеш, а у меня map (который в GNU STL унутре черно-красное дерево) - это детали реализации.

а тот факт, чё лисповые выражовывания в полстроки на ... нужно сочинить и потом вполэкрана запечятлеть?

> а что будет с вашей прогой, если сделать (push "/foo" (gethash (list "file.txt" 777) hash)) раз эдак 10?

Ну будет добавлено 10 значений в список с данным ключём.

bugmaker ★★★★☆
()
Ответ на: комментарий от anonymous

> Дащаз. map-ом простым по хешу разве пройти можно? Фиг, maphash.

исключительно для удобства. Если ненравицо - (type-of) в зубы, делаеш макрос который с любым контейнером работаит. В макросе пара строк всево будет.

bugmaker ★★★★☆
()
Ответ на: комментарий от anonymous

> (на спор - любая программа на Perl-with-whole-CPAN короче, чем аналог на CL),

По символам/строкам - возможно, но логически вряд ли. Хотя достоверно не ведаю, мне перл незнаком

> но если этим злоупотребить, то будет больно - через неделю не вспомнишь, что ж ты блин такое написал.

Лисповые проги поэтому и выглядят ненамного короче питоньих например, потому что в их довольно длинные токены навроде make-hash-table, как раз чёбы легче разобраться было. Ну и незамысловатые логические конструкции, тоже способствуют.

bugmaker ★★★★☆
()
Ответ на: комментарий от anonymous

(:TITLE "Roses" :ARTIST "Kathy Mattea" :RATING 7 :RIPPED T) . T) 
                                                Это откуда? ^^^

T в конце -- это не список, очем тебе и говорит ошибка. Убери точку 
и T все будет хорошо :)

Zubok ★★★★★
()
Ответ на: комментарий от anonymous

> 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.

bugmaker ★★★★☆
()
Ответ на: комментарий от Zubok

I found my mistake! *db* was initialized as (defvar *db* t) but it must be (defvar *db* nil)

thanks a lot

anonymous
()
Ответ на: комментарий от bugmaker

Если уж взялся писать на английском: на LOR большинством голосов адекватным переводом слова "быдло" признано слово "cattle". Так что гордо зови себя cattlecoder ;)

tailgunner ★★★★★
()
Ответ на: комментарий от bugmaker

> а тот факт, чё лисповые выражовывания в полстроки на ... нужно сочинить и потом вполэкрана запечятлеть?

Еще раз и по-русски, пожалуйста. Я, честно, не понял смысл этой фразы совершенно. Вы о том, что лисповая программа короче? Данивапрос, это с самого начала было ясно. А вот утверждение, что она "оперирует абстракциями более выского порядка", чем плюсовая я готов оспорить.

Да, кстати, было бы нехорошо с вашей стороны придираться к стилю - я на С++ не писатель, да и времени потратил на нее немного (минут 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 у нас все же уникальный должен быть.

anonymous
()
Ответ на: комментарий от bugmaker

> > (на спор - любая программа на Perl-with-whole-CPAN короче, чем аналог на CL),

> По символам/строкам - возможно,

Вот тебе сравнение размеров бенчмарков:

http://shootout.alioth.debian.org/debian/benchmark.php?test=all&lang=all&...

Перл и питон ~ одинаковы, лисп вдвое более многословен (и даже "хуже" С!).

> но логически вряд ли. Хотя достоверно не ведаю, мне перл незнаком

Логически они будут одинаковы. И на C оно будет такое же, логически (ну, может будет некий кусок для "поднятия абстракции" - типа реализации абстрактных типов, которых нету в языке).

anonymous
()
Ответ на: комментарий от bugmaker

>> P.S. Хочется таки посмотреть на лисповую прогу с БД.

> Потом, ближе к утру или завтре.

Кстати, я бы тоже не отказался посмотреть на применение биндингов к MySQL или SQLite. Буду очень благодарен...

eugine_kosenko ★★★
()
Ответ на: комментарий от bugmaker

> Это охтоп хреново собратый, на ём ничё не запускаецо. Я пару раз пробовал.

Руби, однако, в свое время так запыхтел, шо аж свист шел. И Эйфель тоже очень неплохо завелся. С Питончиком было похуже. Но студенты тоже запустили и даже тиклевый интерфейс с биндингом к MySQL прикрутили.

Не, ну я конечно понимаю, Лисп -- особо продвинутый язык...

eugine_kosenko ★★★
()
Ответ на: комментарий от yyk

> Не запускается msi или сам лисп после установки? Что говорит?

Сам Лисп. Пишет про отвал sbcl.exe с pid таким-то, а потом заявляет, что не может найти файл /usr/local/lib/sbcl//sbcl.core. Ежу понятно, что такого пути в офтопе нет. Однако попытка скопировать sbcl.core в соответствующую папку cygwin тоже результатов не дает.

А что, под цигнусью он таки нормально собирается?

eugine_kosenko ★★★
()
Ответ на: комментарий от anonymous

> А вот утверждение, что она "оперирует абстракциями более выского порядка", чем плюсовая я готов оспорить.

ладно, попробуй. Вот такая конструкция например: "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 у нас все же уникальный должен быть.

программа работает просто замечятельно. Потому что добавление происходит алгоритмом обхода дерева каталохов, где повторений нету. Можно было бы организовать проверку (при желании) но я счёл в рамках этой задачи излишним.

bugmaker ★★★★☆
()
Ответ на: комментарий от anonymous

> Перл и питон ~ одинаковы, лисп вдвое более многословен (и даже "хуже" С!).

Ещё раз, дело не в многословии как таковом! Зряшные сокращения, ухудшающие понимание, также вредны, как кучя безсмысленново пустово трёпа.

> Логически они будут одинаковы. И на C оно будет такое же, логически

почему же они тогда не? Готов выклать прогу, логическая длина которой такая же как лисповой, на той же задаче с файлами?

> ну, может будет некий кусок для "поднятия абстракции" - типа реализации абстрактных типов, которых нету в языке

так в этом всё и дело. Реализуеш тип специально для своей задачи => не существует достаточно абстрактново готового, который удалось бы использовать, и созданный тоже недостаточно абстрактен, ибо в другой задаче придёцо реализовать _другой_ тип.

bugmaker ★★★★☆
()
Ответ на: комментарий от eugine_kosenko

ну незнаю, я несколько раз (!) пытался запустить разные проги на охтопе. Последний раз это было висуальная студия 2003, а до неё какая-то игрушка, и ниодно не заработало.

bugmaker ★★★★☆
()
Ответ на: комментарий от eugine_kosenko

> гуглём же в момент ищецо

>> В гугле и не такое ищется. Беда в том, чтобы потом отобрать подходящие результаты.

я крайне редко захожу на вторую строницу поиска гугля. Если задать в строку поиска "windows sbcl" результат аппеарицо на первой же странице.

bugmaker ★★★★☆
()
Ответ на: комментарий от eugine_kosenko

>> а змеееды не ждут, оне свой питон всёвремя мутируют, иззачево он один но очень изменчивый

> И это есть гут.

хорошый повод размять пальцы и взаполучить дополнительное финансирования, переделывая в очередной раз прогу под уползший питон, понимаю...

bugmaker ★★★★☆
()
Ответ на: комментарий от eugine_kosenko

>Сам Лисп. Пишет про отвал sbcl.exe с pid таким-то, а потом заявляет, что не может найти файл /usr/local/lib/sbcl//sbcl.core. Ежу понятно, что такого пути в офтопе нет. Однако попытка скопировать sbcl.core в соответствующую папку cygwin тоже результатов не дает.

Рад бы помочь, но виндов уже на машине давно нет. Было предупреждение, что статус "experimental". Это означает, что жалобы пока не принимаются. Вполне возможно, что можно как-то заставить работать. Путь там в каком-нибудь sbclrc переставить или еще что. Лучше на этот счет почитать мэйлинг-листы типа sbcl-help или на gmane (gmain.lisp.steel-bank.general). Может быть, там ответы найдутся? Или гууугл. :)

Zubok ★★★★★
()
Ответ на: комментарий от bugmaker

> хорошый повод размять пальцы и взаполучить дополнительное финансирования, переделывая в очередной раз прогу под уползший питон,

Не надо грязи! Мои проги, написанные под Питон 1.5, работают без изменений на 2.4, и даже Си-шные расширения компилируются без изменений (и работают, ага).

tailgunner ★★★★★
()
Ответ на: комментарий от eugine_kosenko

> Пишет про отвал sbcl.exe с pid таким-то, а потом заявляет, что не может найти файл /usr/local/lib/sbcl//sbcl.core.

Запусти sbcl --core _полный_путь_к_sbcl.core

Или установи предварительно SBCL_HOME на каталог с sbcl.core

Под цигвиком собирается как и под mingw. Нормально.

yyk ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.