Ну, принято так - даже полупустая строка считается строкой кода.
> По символам ИМХО минимум вдвое длиньше будет.
Ну, это несерьезно. Если считать по символам (== литерам), то программа вывода на печать письма Татьяны к Онегину будет сложнее твоего кода престановок. Считать пос символам (== токенам языка) - вряд ли будет преимущество у любого из вариантов. Считать надо по "времени понимания средним программистом", но как это посчитаешь?
> росто не представляю, как в их в одном списке и целое и строка и например структура уживёцо
Если _список_ полиморфный, то да, трабла... Хотя через указатели, с нужными операторами - должно получиться.
Но (как я понял) ты говорил об _алгоритмах_, определенных на НЕ-полиморфных множествах ("если вместо 'eq записать '=, это будет работать только с целыми, а 'string= только с строками.").
> не тхреадсейфное. фтобку
Разве? Какие-то древние версии - не были, а современные - уже вполне.
Мы коллеги 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])
(для нашего уважаемого коллеги)
Невозможное возможно!!!!!
> Ну, принято так - даже полупустая строка считается строкой кода.
лиспопрогу я могу всю в одну строку записать, а на сях - всякие #include и #ifdef есь. Вот ещё тогда преимущество лиспа: любая прога на сях длиннее любой проги на лиспе!
> дык по ссыле у чела трабла есь или он выдумал её?
В его голове - точно есть. Он ее объяснить не может/не хочет. Из всего нытья я понял одно: "Python неаккуратненький, плохаааая змея!"
> любая прога на сях длиннее любой проги на лиспе!
Ну, если мерять так, как выгодно - оно конечно ;)
Я тут стал внималтельно смотреть на твой фрагмент кода с целью переписать - не понял, зачем там присваивания "i = get_uid", "i = d_mode", "i = d_sock"? В них какой-то эзотерический смысл, которого я не догоняю?
> Но (как я понял) ты говорил об _алгоритмах_, определенных на НЕ-полиморфных множествах
Я совсем иное имел в виду. В лиспе _я_ решаю, полиморфное или нет. Если например я щитаю что в этом списке должны быть только строки, могу ввести такое ограничение "естественным" способом, без применения проверки к каждому элементу.
>> не тхреадсейфное. фтобку
> Разве? Какие-то древние версии - не были, а современные - уже вполне.
Ну тогда ладно, замнём. всё равно в лиспе ООП настолько лучше реализовано, что с++ никакой stl не спасёт.
> Я тут стал внималтельно смотреть на твой фрагмент кода с целью переписать - не понял, зачем там присваивания "i = get_uid", "i = d_mode", "i = d_sock"? В них какой-то эзотерический смысл, которого я не догоняю?
i - этап выполнения этого. Этапы маркированы get_uid, d_mode итд. На каждом этапе выполнения есь набор заюзаных ресурсов. Если где-то посередине ашыпко, можно потом сообщить где именно чё нетак и походу освобождать ресурсы типо
Потому что в лиспе есь возможность определить, с каким типом связана переменная. А в с++ нету возможности определить, на куда указывает тот же void* например.
> Потому что в лиспе есь возможность определить, с каким типом связана переменная.
Динамическая типизация, всё понятно. Но и многие вкусности CLOS - они от динамической типизации и динамической природы самого языка.
А статическая типизация - очень полезная вещь, особенно при рефакторинге (ненавижу это слово :( ). Убил бы за возможность статической типизации в Python.
> На каждом этапе выполнения есь набор заюзаных ресурсов
Ну... то есть фрагмент, который ты привел - не полон?
почти полон. Я потом внутро if() связанное с i дописывал, но это не суть важно. Если твой аналог будет давать информацию на каком этапе и по какой причине глюк (например, нет прав доступа или ещё что), т.е. устанавливать i в корректное значение, этого вполне достаточно будет.
>>После часа изысков удалось сократить функцию до одной строки:
> Ребята, вам на конкурс Obfuscated Python. Не думал, что даже на Python можно писать настолько непонятно 8)
Да уж отожги так отожгли. Хотя справедливости ради надо сказать что по части Obfuscated Code Перл вне конкуренции, например в этой ветке перл вообще больше смахивал на brainfuck :-)
> ошибкам нинакой компилер не помеха, проверето неоднократно
Ааааа.... вот оно в чем дело :) Статическая типизация - это как раз _помеха_ ошибкам. А ты перепутал ее с _гарантией_ от ошибок. Никакой компилятор не является гарантией - но они даже и не претендуют.
> А динамическая типизация _обычно_ не нужна. И уж точно - она позволяет оставаться в программе ошибкам, которые элементарно отлавливаются компилятором.
Ты не видел boo?
Язык с закосом под Python но со статической тиизацией, но для переменной можно сказать что у неё тип duck и именно эта переменная становится динамически типизованой. Прикольно.
> Язык с закосом под Python но со статической тиизацией
Не видел. Мне нужно именно в Питоне, с его инструментальной поддержкой и библиотеками. В принципе, мне хватило бы даже checker'а вроде Си-шного lint. Но ни pychecker, ни pylint такого не умеют :(
> А ты всё-таки попробуй переписать приведённый мной участок с готами, и сравним.
Не могу поверить, что повелся на это 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;
Кстати - чтобы это переписать, мне понадобился почти час. Если считать меня средним Си-программистом,
делай выводы о том, каково сопровождать твои программы ;)
Почему мои? твои. Согласись, твой вариант более многабукф... Да ещё скобок маловато, а любой продвинутый редактор умеет парность скобок проверять и текст выделять меж ими итд...
Мой вариант пока что никто не пытался понять и переписать. На переписывание твоего варианта я потратил около часа - из них на набор текста минут 10-15.
> Согласись, твой вариант более многабукф
Насчет букф - согласен. Насчет симолов/токенов - не согласен.
Фишка-то именно в том, чтобы понять из _кода_. Когда в реальности кто-то полезет разбираться, тебя может уже не быть под рукой 8)
> Там вродн прозрачно всё.
Но это записано так, как я за 15 лет ни разу не видел. Похоже на работу студента, который открыл для себя оператор "," и то, что "||" и "&&" вычисляют/не вычисляют свои правые операнды при нужде.
> Мне нужно именно в Питоне, с его инструментальной поддержкой и библиотеками. В принципе, мне хватило бы даже checker'а вроде Си-шного lint. Но ни pychecker, ни pylint такого не умеют :(
А как ты себе вообще представляешь Питон со статической типизацией? Это уже не питон будет вовсе...
P.S. Интересно, а почему здесь уже 187 сообщений, а мы всё ещё не в десятке? :-)
> Интересно, а почему здесь уже 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 лет
и отсылает им емайл. Ну-ка, как это будет выглядеть на перле/питоне?
> Кстати, в рамках PyPy есть нечто, называемое RPython. Мне _кажется_, это Питон со статической типизацией.
PyPy жесть. Причём насколько я понимаю в RPython даже настраивается сколько ты позволяешь динамизма в коде. Но вот будет ли он при этом отлавливать ошибки как компилятор и что вообще из этого получится непонятно.
Я надеюсь на Python для .NET или Java c возможностью загрузки бинарных расширений от CPython-а, или все писатели расширений перейдут на rctypes и тогда будет мне счасте.
Да я уже и не знаю 8/ По работе-то я драйверы пишу, да проги управления большими шкафами с железом. В основном - Си/Си++, ассемблер. Питона там относительно немного - тесты, морды. Питон - это больше для души. Поэтому и участвую во флэймах вроде этого (плюс полезные линки попадаются :))
Пишешь модуль расширения на питоне с использованием ctypes, а затем их extension compiler компилирует то что ты написал в натуральный машинный код и заменяет вызовы ctypes на нативные вызовы этих функций.
Таким образом модуль расширения написанный на ctypes сможет быть использован (по идее) на любой сборке PyPy в том числе и .NET и Java, когда такие появятся. Имхо должны появиться.
Заодно я так понимаю что они могут сделать Питон без GIL (OMFG, ПИТОН БЕЗ GIL!!!)
Он мне кажется (субъективно) таким неуклюжим, всякие эти многочисленные xrange xlat [a:b]... А ништяков вроде комплексных чисел и rationalize нету совсем.
Ну нифига себе, если 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. Имхо в питоне лучше, т.е существует инвариант: