LINUX.ORG.RU

Ответ на: комментарий от tailgunner

просто не представляю, как в их в одном списке и целое и строка и например структура уживёцо

> STL

не тхреадсейфное. фтобку. Хотя и им не очень представляю как сделать.

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

> Какой смысел пустые/полупустые строки щитать?

Ну, принято так - даже полупустая строка считается строкой кода.

> По символам ИМХО минимум вдвое длиньше будет.

Ну, это несерьезно. Если считать по символам (== литерам), то программа вывода на печать письма Татьяны к Онегину будет сложнее твоего кода престановок. Считать пос символам (== токенам языка) - вряд ли будет преимущество у любого из вариантов. Считать надо по "времени понимания средним программистом", но как это посчитаешь?

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

> росто не представляю, как в их в одном списке и целое и строка и например структура уживёцо

Если _список_ полиморфный, то да, трабла... Хотя через указатели, с нужными операторами - должно получиться.

Но (как я понял) ты говорил об _алгоритмах_, определенных на НЕ-полиморфных множествах ("если вместо 'eq записать '=, это будет работать только с целыми, а 'string= только с строками.").

> не тхреадсейфное. фтобку

Разве? Какие-то древние версии - не были, а современные - уже вполне.

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

Мы коллеги redvasily по работе :-)
После часа изысков удалось сократить функцию до одной строки:

def permutations(e):
    if len(e) == 1 or e.insert(0, reduce(lambda x, y: x + y, [[list(p)[:i] + [e[0]] + list(p)[i:] for i in xrange(len(e))] for p in permutations(e[1:])])) is None: return list(e[0])

(для нашего уважаемого коллеги)
Невозможное возможно!!!!!

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

> Мы коллеги redvasily по работе :-)

>После часа изысков удалось сократить функцию до одной строки:

Ребята, вам на конкурс Obfuscated Python. Не думал, что даже на Python можно писать настолько непонятно 8)

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

> Ну, принято так - даже полупустая строка считается строкой кода.

лиспопрогу я могу всю в одну строку записать, а на сях - всякие #include и #ifdef есь. Вот ещё тогда преимущество лиспа: любая прога на сях длиннее любой проги на лиспе!

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

> дык по ссыле у чела трабла есь или он выдумал её?

В его голове - точно есть. Он ее объяснить не может/не хочет. Из всего нытья я понял одно: "Python неаккуратненький, плохаааая змея!"

> любая прога на сях длиннее любой проги на лиспе!

Ну, если мерять так, как выгодно - оно конечно ;)

Я тут стал внималтельно смотреть на твой фрагмент кода с целью переписать - не понял, зачем там присваивания "i = get_uid", "i = d_mode", "i = d_sock"? В них какой-то эзотерический смысл, которого я не догоняю?

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

> Но (как я понял) ты говорил об _алгоритмах_, определенных на НЕ-полиморфных множествах

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

>> не тхреадсейфное. фтобку

> Разве? Какие-то древние версии - не были, а современные - уже вполне.

Ну тогда ладно, замнём. всё равно в лиспе ООП настолько лучше реализовано, что с++ никакой stl не спасёт.

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

> Я совсем иное имел в виду. В лиспе _я_ решаю, полиморфное или нет.

В Си++ - тоже, только по-другому. Шаблон - там полиморфизма (на run-time) не будет, список указателей и виртуальные функции - будет.

> всё равно в лиспе ООП настолько лучше реализовано, что с++ никакой stl не спасёт.

Просто Страуструп выбрал другие tradef-off'ы. Зато в Лиспе (AFAIK) нет проверки типов на этапе компиляции и type-safe контейнеров.

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

> Я тут стал внималтельно смотреть на твой фрагмент кода с целью переписать - не понял, зачем там присваивания "i = get_uid", "i = d_mode", "i = d_sock"? В них какой-то эзотерический смысл, которого я не догоняю?

i - этап выполнения этого. Этапы маркированы get_uid, d_mode итд. На каждом этапе выполнения есь набор заюзаных ресурсов. Если где-то посередине ашыпко, можно потом сообщить где именно чё нетак и походу освобождать ресурсы типо

switch (i) {

case поломалос1: ослободим_это

case поломалос2: и это тож

break;

case поломалос3:...

}

или ещё чёнть сделать взависимости.

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

> нет проверки типов на этапе компиляции

есь опциональная возможнось в некоторых

> type-safe контейнеров.

Потому что в лиспе есь возможность определить, с каким типом связана переменная. А в с++ нету возможности определить, на куда указывает тот же void* например.

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

> Потому что в лиспе есь возможность определить, с каким типом связана переменная.

Динамическая типизация, всё понятно. Но и многие вкусности CLOS - они от динамической типизации и динамической природы самого языка.

А статическая типизация - очень полезная вещь, особенно при рефакторинге (ненавижу это слово :( ). Убил бы за возможность статической типизации в Python.

> На каждом этапе выполнения есь набор заюзаных ресурсов

Ну... то есть фрагмент, который ты привел - не полон?

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

> После часа изысков удалось сократить функцию до одной строки:

Ну и как, оно того стоило? А любую прогу на лиспе можно сократить до одной строки просто нажимая J в виме :P

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

почти полон. Я потом внутро if() связанное с i дописывал, но это не суть важно. Если твой аналог будет давать информацию на каком этапе и по какой причине глюк (например, нет прав доступа или ещё что), т.е. устанавливать i в корректное значение, этого вполне достаточно будет.

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

>>После часа изысков удалось сократить функцию до одной строки:

> Ребята, вам на конкурс Obfuscated Python. Не думал, что даже на Python можно писать настолько непонятно 8)

Да уж отожги так отожгли. Хотя справедливости ради надо сказать что по части Obfuscated Code Перл вне конкуренции, например в этой ветке перл вообще больше смахивал на brainfuck :-)

Вот ещё пара прикольных ссылок:

http://99-bottles-of-beer.net/language-python-796.html

Но перл, разумеется опять вне конкуренции :-)

http://99-bottles-of-beer.net/language-perl-737.html

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

>> Ребята, вам на конкурс Obfuscated Python. Не думал, что даже на Python можно писать настолько непонятно 8)

> Да уж отожги так отожгли. Хотя справедливости ради надо сказать что по части Obfuscated Code Перл вне конкуренции

В Перле это нормальный стиль, но в Питоне - кощунство! Сотрите - проклянут вас именем Гвидо 8)

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

> Убил бы за возможность статической типизации в Python.

Ну ты погорячился, статическая типизация сильно ограничивает.

В Python3K запланирован Optional Static Typing да и то это будет не статическая типизация, а интерфейсы, адаптация и generic функции.

А вот за интерфейсы с адаптацией, да чтоб и вся стандартная библиотека была под это переписана я бы уже убил :-)

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

да, прога на перле хреново читается но хорошё смотрится...

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

>> Убил бы за возможность статической типизации в Python.

>Ну ты погорячился

Это я еще мягко выразился

> статическая типизация сильно ограничивает

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

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

интересно, когда ... дорастёт до уровня лиспа, им тоже прекратят пользоваться и станут материть на форумах?

кстати, где наш друх и соратник Die-Hard, зажогший этот флейм?

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

> позволяет оставаться в программе ошибкам, которые элементарно отлавливаются компилятором.

ошибкам нинакой компилер не помеха, проверето неоднократно

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

> ошибкам нинакой компилер не помеха, проверето неоднократно

Ааааа.... вот оно в чем дело :) Статическая типизация - это как раз _помеха_ ошибкам. А ты перепутал ее с _гарантией_ от ошибок. Никакой компилятор не является гарантией - но они даже и не претендуют.

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

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

Ты не видел boo?

Язык с закосом под Python но со статической тиизацией, но для переменной можно сказать что у неё тип duck и именно эта переменная становится динамически типизованой. Прикольно.

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

> Ты не видел boo?

> Язык с закосом под Python но со статической тиизацией

Не видел. Мне нужно именно в Питоне, с его инструментальной поддержкой и библиотеками. В принципе, мне хватило бы даже checker'а вроде Си-шного lint. Но ни pychecker, ни pylint такого не умеют :(

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

> А ты всё-таки попробуй переписать приведённый мной участок с готами, и сравним.

Не могу поверить, что повелся на это 8)

#define BAIL_OUT(l, errmsg...) do { fprintf(stderr, errmsg); goto l; } while (0)

        s = -1;
        dpy = getenv("DISPLAY");
        if (!dpy)
                BAIL_OUT(err, "DISPLAY variable is not set\n"); 
        else if ((pwd = getpwuid(geteuid()) == NULL)
                BAIL_OUT(err, "You're homeless, pasportless, jobless :D\n");

        snprintf(dstdir, UNIX_PATH_MAX, "%s/%s%s-%s", tmpdir, COMM_DIR, dpy, pwd->pw_name);
        /* это должно быть отдельной функцией */
        if (stat(dstdir, &fs) == -1)
                if (errno = ENOENT) {
                        if (mkdir(dstdir, S_IFDIR | S_IRWXU) == -1)
                                BAIL_OUT(err_d_create, "can't create %s\n", dstdir);
                        if (stat(dstdir, &fs) == -1)
                                BAIL_OUT(err_d_stat2, "can't stat created %s\n", dstdir);
                }
                else
                        BAIL_OUT(err, "stat %s failed", dstdir);

        if (geteuid() != fs.st_uid)
                BAIL_OUT(err_get_uid, "EUID/FS_UID mismatch (%d/%d)\n", geteuid(), fs.st_uid);
        else if (getegid() != fs.st_gid)
                BAIL_OUT(err_get_gid, "EGUID/FS_GUID mismatch (%d/%d)\n", getegid(), fs.st_gid);
        else if (S_IFDIR != (S_IFDIR & fs.st_mode))
                BAIL_OUT(err_d_isdir, "%s not a directory\n", dstdir);
        else else if (S_IRWXU != (0777 & fs.st_mode) && chmod(COMM_DIR, S_IRWXU) == -1)
                BAIL_OUT(err_d_mode, "wrong mode %o, and chmod failed\n", fs.st_mode);                                )                                                                                

        snprintf(sa.sun_path, UNIX_PATH_MAX, "%s/%s", dstdir, COMM_SOC);
        DEBUG_MSG(printf ("sock is %s\n", sa.sun_path));
        s = socket(PF_UNIX, SOCK_STREAM, 0);
        if (s == -1)
                BAIL_OUT(err_d_sock);
        /* странный какой-то код - либо мы присоединяемся к серверу, либо становимся им */
        connect(s, (struct sockaddr *) &sa, sizeof (sa));
        if (errno == ECONNREFUSED)
                BAIL_OUT(err_d_connrefused, "connection to %s refused", sa.sun_path);
        errno = EADDRINUSE;
        unlink(sa.sun_path);
        if (bind(s, (struct sockaddr *) &sa, sizeof (sa)) == -1)
                BAIL_OUT(err_d_bind, "can't bind %s", sa.sun_path);
        else if (listen(s, 1) == -1)
                BAIL_OUT(err_d_listen, "can't listen on %s\n", sa.sun_path);
        return s;

err_d_connrefused:
err_d_bind:
err_d_listen:
        // ....
        if (s != -1)
                close(s);
        return -1;                         


Кстати - чтобы это переписать, мне понадобился почти час. Если считать  меня средним Си-программистом,
делай выводы о том, каково сопровождать  твои программы ;)

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

Почему мои? твои. Согласись, твой вариант более многабукф... Да ещё скобок маловато, а любой продвинутый редактор умеет парность скобок проверять и текст выделять меж ими итд...

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

Да ещё с макросами не совсем удачно ИМХО. чёнибудь типо

#define XYU(T,L) if (!(T)) goto L;

Я бы более одобрил, хотя такой читабельности и быстроты понимания тож не особо прибавил бы.

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

> Почему мои? твои.

Мой вариант пока что никто не пытался понять и переписать. На переписывание твоего варианта я потратил около часа - из них на набор текста минут 10-15.

> Согласись, твой вариант более многабукф

Насчет букф - согласен. Насчет симолов/токенов - не согласен.

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

> Да ещё с макросами не совсем удачно ИМХО

Ядерная традиция. Хорошо обоснованная ИМХО.

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

Фишка-то именно в том, чтобы понять из _кода_. Когда в реальности кто-то полезет разбираться, тебя может уже не быть под рукой 8)

> Там вродн прозрачно всё.

Но это записано так, как я за 15 лет ни разу не видел. Похоже на работу студента, который открыл для себя оператор "," и то, что "||" и "&&" вычисляют/не вычисляют свои правые операнды при нужде.

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

> Мне нужно именно в Питоне, с его инструментальной поддержкой и библиотеками. В принципе, мне хватило бы даже checker'а вроде Си-шного lint. Но ни pychecker, ни pylint такого не умеют :(

А как ты себе вообще представляешь Питон со статической типизацией? Это уже не питон будет вовсе...

P.S. Интересно, а почему здесь уже 187 сообщений, а мы всё ещё не в десятке? :-)

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

> А как ты себе вообще представляешь Питон со статической типизацией?

Type inference, опциональное объявление типов параметров (в стиле adaptation, но проверяемое компилятором/чекером).

> Это уже не питон будет вовсе...

Я же не хочу, чтобы запретили динамическую типизацию. Но в 90% случаев, статической типизации мне достаточно.

Кстати, в рамках PyPy есть нечто, называемое RPython. Мне _кажется_, это Питон со статической типизацией.

> а почему здесь уже 187 сообщений, а мы всё ещё не в десятке? :-)

Не уважают... :/

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

Аха, а твой похоже на работу скубента, который этих операторов ещё не проходил, но сумел выкрутицо при помощи операторов, извесных ему ещё по бейсику

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

> Интересно, а почему здесь уже 187 сообщений, а мы всё ещё не в десятке?

это несомненно заговор. Но мы так просто не сдадимся, правильно?
 Итак, в нашей дальнейшей программе...

Ну вот например, кусок кода, взятый из 
http://en.feautec.pp.ru/store/fun-of-newlisp.html
куда он попал в свою очередь из лоровского же флейма

(do-select ((CustomerName CustomerEmail)
            :from Customers
            :where (> CustomerAge 100))
  (send-email CustomerEmail
              :subject "Congratulations!"
              :body (format nil
                            "Dear ~A, you won a prize! Call ~A."
                            CustomerName company-phone)))

Выбирает из дазы банных всех пиплов с возрастом более 100 лет
и отсылает им емайл. Ну-ка, как это будет выглядеть на перле/питоне?

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

фдисятке! ИМХО это первый тред из девелопа, попавший фдисятку...

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

> Кстати, в рамках PyPy есть нечто, называемое RPython. Мне _кажется_, это Питон со статической типизацией.

PyPy жесть. Причём насколько я понимаю в RPython даже настраивается сколько ты позволяешь динамизма в коде. Но вот будет ли он при этом отлавливать ошибки как компилятор и что вообще из этого получится непонятно.

Я надеюсь на Python для .NET или Java c возможностью загрузки бинарных расширений от CPython-а, или все писатели расширений перейдут на rctypes и тогда будет мне счасте.

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

> Ну-ка, как это будет выглядеть на перле/питоне?

Люди, которые шарят в ORM'ах, тебе, наверное, ответили бы. А я не шарю, поэтому скажу - и это мы могем (мы == Python 8))

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

> Так же неказисто и замысловато небось.

> А в чём ты шариш?

Да я уже и не знаю 8/ По работе-то я драйверы пишу, да проги управления большими шкафами с железом. В основном - Си/Си++, ассемблер. Питона там относительно немного - тесты, морды. Питон - это больше для души. Поэтому и участвую во флэймах вроде этого (плюс полезные линки попадаются :))

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

> А что такое rctypes? Это тоже из PyPy.

Пишешь модуль расширения на питоне с использованием ctypes, а затем их extension compiler компилирует то что ты написал в натуральный машинный код и заменяет вызовы ctypes на нативные вызовы этих функций.

Таким образом модуль расширения написанный на ctypes сможет быть использован (по идее) на любой сборке PyPy в том числе и .NET и Java, когда такие появятся. Имхо должны появиться.

Заодно я так понимаю что они могут сделать Питон без GIL (OMFG, ПИТОН БЕЗ GIL!!!)

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

> Питон - это больше для души.

Он мне кажется (субъективно) таким неуклюжим, всякие эти многочисленные xrange xlat [a:b]... А ништяков вроде комплексных чисел и rationalize нету совсем.

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

> эти многочисленные xrange xlat [a:b]

Ну нифига себе, если xrange и [a:b] неуклюжие, то можно попросить пример уклюжих вещей, которые решают те-же задачи.

Например:

for i in xrange(10): pass

Здесь xrange(10) возвращает итератор, который пробегает от 0 до 10, не включая 10.

В C ты пишешь:

for (int i = 0; i < 10; ++i) ;

Имхо С версия гораздо более неуклюжая.

[a:b] это слайс, т.е. для списка это новый список состоящий из элементов от а до b, исключая b. Единственный язык где я видел что-то подобное это Matlab, там это сделано точно так же, но вкючая b. Имхо в питоне лучше, т.е существует инвариант:

a тождественно равно a[:x] + a[x:]

Где это сделано лучше?

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