• list годный лисп-срач для бутербродного прочтения habrahabr.ru , а больше всего впечатлило изложение habrahabr.ru

    У вас отступы съехали. Это важно. sprunge.us/IZVP?cl
    Код на лиспе читается не слева направо (и не как английский, cnupm ;]), а как дерево.

    Корень — if. У него два потомка. Первый — условие (начинается с and), второй — then_expression (начинается с genurl). Условие — это and от двух. (> number -1) и (< number (1- (length pcl-files-map))). Т.е. число находится в диапазоне от -1 до pcl-files-map.

    then_expression — это вызов функции genurl с символом pcl-chapter-view (в других языках обычно используется что-то вроде enum) и именованным параметром chapter равным первому элементу списка, являющегося number'ным элементом массива pcl-files-map. «Аналог» (first (aref pcl-files-map number)) в C — list_head(pcl_files_map[number]);


    В одном абзаце прояснился лисп, в общем)

Replies (17)

  • @kb, ... кони, люди...
    Вообще я в шоке от того, что на хабре поднимаются такие споры. Раны лисперы оседали на ЛОРе, в жуйке и других, специализированных коммьюнити, а сейчас они полезли на новичков... Страшно.
    Я уже привык к тому, что лисперы это слепые идиоты, которые просто не способны понять что такое программирование сегодня, что такое хорошо, а что такое плохо. Уже устал с ними бороться и спасать людей. Сейчас просто игнорирую узколобых, но если они пошли с такими статьями на хабр...
    Стоит готовиться к тому, что некоторые личности станут рекламировать кубейсик и турбопаскаль для разработки веб-приложений.
  • @iorlas, ок, я вижу что ты ненавидишь лисп, только не понимаю, тебе не нравится синтаксис или язык сам по себе? А лисперы — они везде, даже в ЖЖшечках love5an.livejournal.com :-)
  • @kb, Да, я сначала подумал что ты дал ссылку на этот великий высер такого борца за лисп.
    А сложно сказать что такое язык, поэтому я скажу что сам синтаксис, семантика, а, исходя из этого, и главная мысль языка.
    Я и не спорю что реализация хорошая, что библиотеки хорошие, возможности большие, но....
    Лисп это не язык, это строительный материал.
  • @iorlas, Меня всё больше и больше в последнее время корёжит от уродливости питоновских анонимных функций, от уродливости разросшихся условий (из-за того, что "a and b", а не and(a, b) — при больших и толстых условиях (а еще и с or'ами) код похож на говно. А еще недавно наткнулся на уродливость yield, не позволяющего "пробросить" yield'ы субрутины, правда нашел PEP, в котором предложено сделать синтаксис "yield from ...". Вот думаю, к чему бы это (нене, не лисп, но что-то точно надо интересное искать)).
  • @kb, Условия? Ну они везде одни и те же. Если тебе хочется аналог (and a b c), то можешь использовать all. В конце концов, отступы это ещё не всё, и остальное нужно форматировать так, чтобы было понятно.
    yield? Ну не знаю что не так, не понял твоей проблемы. Мои задачи решало везде как и следовало.
    Лямбды? Возможно, Гвидо не о том думал когда их делал такими какими сделал, но я предпочитаю следовать такой логике, которая оправдывает текущую реализацию лямбд и выгодно их подчёркивает: использование больших лямбд делает код сложным и трудночитаемым, через-чур трудным для понимания(да, я сам на опыте убедился). Поэтому выгоднее для больших лямбд использовать именно фукцнии(к слову, не забывай что обычные функции тоже служат замыканиями когда объявляются в теле другой функции). Лямбды же служат небольшими блоками кода, которые должны выполнить нестандартную функцию со стандартными объектами, но не добавить слишком много строк кода и сложности в код же.
  • @iorlas, Везде да не везде, в общем, лисп тому пример. Всё предложенное — какие-то грязные хаки и отговорки) только еще большее уродство получается) Насчет yield — я про python.org . То есть, пишешь ты, значит, функцию, которая делает yield каких-то значений. Ты разбиваешь задачу на две подзадачи, каждая из которых — генератор. Тебе нужно всего-то-навсего прокинуть значения вызванных подфункций. И что же? Приходится делать for item in items: yield item. Это ладно, фиг с ним. Две строчки — не так много. Но есть и другие моменты, которые надо "прокидывать" (StopIteration и проч). Короче, почитай PEP, достаточно интересно.

    Еще не хватает Erlang'овских (в лиспе, говорят, тоже есть) штук типа [First | Rest] в приеме параметров. Все-таки все большим уродством кажется использование переменных там, где их могло не быть.

    Короче люблю я питон, но до идеала еще далеко.

    p.s.: The Tiger Lillies интересны
  • @iorlas, кстати, можт (раз уж ты здесь) помоги мне с вот этим разобраться mail.python.org :-)
  • @kb, Да, с yield и правда требуется немного поработать чтобы выполняли нужное?
    А с остальным что не так? На самом деле всё достаточно просто и логично. Форматируй код как следует, изучай пайтон, не делай плохо и ни в чём не будешь нуждаться.
    А до идеала слишком далеко. Вектор развития пошёл в попу с третьим питоном(отказ от %, заморозка синтаксиса и никаких работ по языку этому свидетели). Хз чего ждать.
  • @iorlas, синтаксис достаточно хорош, чтоб его заморозить и подтянуть PyPy, который, кстати, уже надо пробовать. Сейчас главное — скорость нагнать и реализации сторонние. PyPy уже быстр, и пилят его, вроде, порядошно.

    По поводу "... как следует, изучай ..., не делай плохо и ни в чём не будешь нуждаться." — борода, какая-то. Это можно сказать где угодно о чем угодно)
  • @kb, Про дип копи сказать ничего не могу, не юзал(я вообще не так много использую advanced-фишки языков), но про рекурсию сразу скажу: ты в __getattr__ запрашиваешь аттрибут до выхода из функции. Т.е. во время передачи параметра self.d в dir(), делается вызов __getattr__.
    Точно не помню, но, вроде, это обходится всеми компайл-тайм символами(помести d в тело класса, а не в __init__, ведь все функции это ран-тайм, а всё что не известно в компайл-тайм — идёт через __getattr__).
  • @iorlas, дык __getattr__ должен работать только если не найден аттрибут такой, а он тожен быть найден. Не путай __getattr__ с __getattribute__
  • @iorlas, аа, понял
  • @kb, Нет, ну правда. Если у тебя куча выражений и нужно проверить их через and, то нужно использовать all, которы принимает на вход именно list, а не набор аргументов.
  • @iorlas, прекрасно. Почему нельзя было сделать просто *args? Обязательно список принимать?)
  • @kb, Это же питон, он и так прекрасен, везде бывают свои грехи. Да и вообще, предназначение all — проверять именно списки, т.е. обычное дело это вызов all(something), а так пришлось бы делать all(*something), что добавит трудность в понимании(именно с взгляда, до того, как мозг начнёт думать о семантике).
    Если у тебя ряд больших условий, то просто перемещай их на новые строчки, делая один отступ.
    Вообще дай пример, интересно взглянуть на проблему.
  • @iorlas, та хуле думать, бери да пиши громадные условия с кучей and, or, многими вложениями функций и так далее) По теме — наткнулся только что daniweb.com ))
  • @kb, Ужас, что ещё сказать. В коде вопроса отступ относительно скобки — вешать, стрелять, убивать.
    Решение забавное, но логика относится к классу сложных задач, на которые нормально выкладывать много строк кода и это не жалко, хотя да, можно было бы и элегантнее.