Змея / Говнокод #26778 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
  13. 13
  14. 14
  15. 15
  16. 16
  17. 17
  18. 18
  19. 19
  20. 20
  21. 21
  22. 22
  23. 23
  24. 24
  25. 25
  26. 26
  27. 27
  28. 28
  29. 29
  30. 30
  31. 31
  32. 32
  33. 33
  34. 34
  35. 35
  36. 36
  37. 37
  38. 38
  39. 39
  40. 40
  41. 41
  42. 42
  43. 43
  44. 44
  45. 45
  46. 46
  47. 47
  48. 48
  49. 49
  50. 50
  51. 51
  52. 52
  53. 53
  54. 54
  55. 55
  56. 56
  57. 57
  58. 58
  59. 59
  60. 60
  61. 61
  62. 62
# https://www.opennet.ru/opennews/art.shtml?num=53248
# Гвидо ван Россум предложил включить в Python операторы для сопоставления с образцом 

# Отмечается, что предложенные операторы позволят улучшить читаемость кода,
# упростят сопоставление произвольных Python-объектов и отладку, а также повысят
# надёжность кода благодаря возможности расширенной статической проверки типов. 

def http_error(status):
    match status:
        case 400:
            return "Bad request"
        case 401|403|404:
            return "Not allowed"
        case 418:
            return "I'm a teapot"
        case _:
            return "Something else"


# Например, возможна распаковка объектов, кортежей, списков и произвольных последовательностей
# для привязки переменных на основе имеющихся значений. Допускается определение вложенных
# шаблонов, использование в шаблоне дополнительных условий "if", применение масок ("[x, y, *rest]"),
# маппинга связок ключ/значение (например, {"bandwidth": b, "latency": l} для извлечения значений
# "bandwidth" и "latency" и словаря), извлечения подшаблонов (оператор ":="), использования именованных
# констант в шаблоне. В классах возможна настройка поведения при сопоставлении при помощи метода "__match__()". 

   from dataclasses import dataclass

   @dataclass
   class Point:
       x: int
       y: int

   def whereis(point):
       match point:
           case Point(0, 0):
               print("Origin")
           case Point(0, y):
               print(f"Y={y}")
           case Point(x, 0):
               print(f"X={x}")
           case Point():
               print("Somewhere else")
           case _:
               print("Not a point")

   match point:
       case Point(x, y) if x == y:
           print(f"Y=X at {x}")
       case Point(x, y):
           print(f"Not on the diagonal")


   RED, GREEN, BLUE = 0, 1, 2
   match color:
       case .RED:
           print("I see red!")
       case .GREEN:
           print("Grass is green")
       case .BLU
   E:
           print("I'm feeling the blues :(")

Какой прогресс)))
Ждем когда добавят цикл for как в сишке

Запостил: j123123 j123123, (Updated )

Комментарии (83) RSS

  • Из комментариев:

    > Python этим то и хорош, что не тащить всякий мусор в виде дублирующих операторов!
    > Посмотрите что с С++ сотворили, чужие исходники читать трудновато.
    > Меньше операторов это главное что отличает современные языки вроде Go, Rust в результате читаемость чужих исходников резко повышается!

    Предлагаю Brainfuck: там всего 8 операторов '+', '-', '<', '>', '[', ']', '.', ','
    Ответить
  • Второй пример — это уже не как в сишке. Это уже похоже на функциональные языки.
    Ответить
    • Есть идея: завернуть match в цикл, а внутри веток мудифицировать исходное выражение, чтобы на следующей итерации сработала другая ветка.

      Или такая идея: вызывать какую-нибудь функцию, которая будет реализовывать это фоллсру:
      def whereis(point):
             match point:
                 case Point(0, 0):
                     fallthrough(0)
                 case Point(0, y):
                     fallthrough(1)
                 case Point(x, 0):
                     fallthrough(2)
                 case Point():
                     fallthrough(3)
                 case _:
                     print("Not a point")
      def fallthrough(level):
          if (level < 1):
              print("Ku-ka-re-ku")
          if (level < 2):
              print("Kudkudah")
          if (level < 3):
              print("Kokokoko")
          if (level < 4):
              print("Kurlyk")
      Ответить
    • Надо чтоб гомоиконность, через которую чтоб компилтайм-библиотеки для фоллсру, регекспов, паттерн-матчинга и любого другого подобного говна запиливать. А не вот это вот намертво впиленное в сам язык говно
      Ответить
      • ГОМОИКОНА
        (((L I S P )( L I S P ) ( L I S P ) ( L I S P )))
        * (     \             \            )    \       *
        B(       )             \          )      )      B
        e(       `.             )         )       :     e
        a`        )             )        \)       )     a
        t \       ) )       )  \\\   --__ \\       :    t
        i  \      \)   _--~~          ~--__) \     )    i  
        n   \      \_-~                    ~-_\    )    n
        g    \_     \        _.--------.______\)   )    g
              \     \______(( _ ___ _ (_(__H  \   )      
        t      \   .  S ___)  ______ (_(____t  )  )     t
        h       (\ )   I ____)) APPLY\ (_____D  )_)     h
        e      ( (\)   C_____)  EVAL )  (___P   )  \    e
              (   (   _P_____)\______)  )) _) )     \    
        a     (    \  )__   \\_________)) (__)       )  a
        v    ( \    \____)   `----   --'             )  v
        e    (  \_          ___\       )_          _) ) e
        r   (              )    (     )  \            ) r
        a   (             )    (   λ   )  \           ) a
        g   (          ) )    (         )  \           )g
        e   (         ) )      (__)(___)    )          )e
        s  (           )        (    )       )         )s
        *  (          )         (    )       )         )*
        (((L I S P )( L I S P ) ( L I S P ) ( L I S P )))
        Ответить
  • Гвидо ван Россум предложил включить в Конституцию РФ операторы для сопоставления с образцом.
    Ответить
    • 1 июля состоится всеобщий референдум по принятию поправок в синтаксис Python.
      Ответить
          • Давайте перечислим способы обнуления eax. Тривиальные mov eax, 0 и xor eax, eax не предлагать.
            Ответить
            • lea eax, [0] и sub eax, eax тоже тривиальные и не предлагать?

              push dword 0
              pop eax

              zero dd 0
              ...
              mov eax, [zero]
              Ответить
                • Т.е. надо так:

                  shr eax, 16
                  shr eax, 16

                  shl eax, 16
                  shl eax, 16

                  Ну или shr rax, 32 и забить на старшие биты. Сами отвалятся после 32-битных операций.
                  Ответить
            • BTR eax, 0
              BTR eax, 1
              BTR eax, 2
              BTR eax, 3
              BTR eax, 4
              BTR eax, 5
              BTR eax, 6
              BTR eax, 7
              BTR eax, 8
              BTR eax, 9
              BTR eax, 10
              BTR eax, 11
              BTR eax, 12
              BTR eax, 13
              BTR eax, 14
              BTR eax, 15
              BTR eax, 16
              BTR eax, 17
              BTR eax, 18
              BTR eax, 19
              BTR eax, 20
              BTR eax, 21
              BTR eax, 22
              BTR eax, 23
              BTR eax, 24
              BTR eax, 25
              BTR eax, 26
              BTR eax, 27
              BTR eax, 28
              BTR eax, 29
              BTR eax, 30
              BTR eax, 31
              Ответить
              • вообще я в асме ни в зуб ногой, так что не пинайте, если что
                Ответить
                • Про BTR/BTS/BTC вообще мало кто знает. Даже авторы конпеляторов эти инструкции редко используют.
                  Ответить
                  • Это который битик выталкивает в регистр флагов? А какую семантику он должен отражать у компиляторов?
                    Ответить
                      • Понятно.

                        Я думал, просто ANDят с нужным числом, где нолики везде, кроме нужного бита.

                        Но получается гораздо больше действий
                        Ответить
                        • Не ну можно и a & (1 << n). Но так действий больше т.к. нужна единичка на входе.
                          Ответить
                          • Я анскильная макака.
                            Я делал когда-то так:

                            #define PETUH_BIT 0x10
                            #define KRESTUH_BIT 0x20
                            
                            if (flags & PETUH_BIT)

                            Вроде, работало.


                            Но через инструкцию правда круче.
                            Ты можешь просто сказать "дай мне бит номер 3" без всей этой ебли c эндом
                            Ответить
                            • Ну блин, если n неизвестно во время конпеляции, то ты не можешь так просто энд заюзать. Надо либо двигать либо юзать bt.
                              Ответить
                              • Можно надвигать себе любое число, но это будет тоже самое, да.

                                Как-то так случалось, то у меня не было неизвестного n, и даже наоборот: у меня была переменная, и я знал все флаги (или сам их писал, или брал из SDK)
                                Ответить
                            • А я недавно написал
                              if (flags & PETUH_BIT == 1)

                              И долго не мог понять, где обосрался. Да еще и дважды.
                              Прост в другом месте было == 0. Вот и инвертировал.
                              Ответить
                              • Какой багор )))

                                Видел, как некоторые пишут
                                if (flags & PETUH_BIT == PETUH_BIT)

                                и не обсираются. Наверное, тоже боятся неявных кастов в буль-буль.
                                Ответить
                              • А ведь сработает же, если питушачий бит крайний, а все другие флажки опущены
                                Ответить
                            • >Я анскильная макака.
                              >Я делал когда-то так:

                              >#define PETUH_BIT 0x10

                              >if (flags & PETUH_BIT)

                              Нееее. Анскильные макаки делали примерно так:

                              (a-(a/32*32))/16
                              Ответить
                              • > (a-(a/32*32))/16
                                Это уж скорее анскильные ма-те-ма-ти-ки.
                                Ответить
                                  • Какой багор )))
                                    А потом начали сдвигать, потому что деления не было плавающий питух тормозит.
                                    Ответить
                    • Этими инструкциями можно реализовать паскалевские множества или работу с битовыми полями.
                      Ответить
                      • Да, теперь понял.

                        Я просто привык, что все ANDят с числом, но с этой инструкией удобнее.

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

                        Если память не спит с другим, то так оно всё и было
                        Ответить
                    • А ещё есть интересные инструкции BSF и BSR.

                      Одна из них считает целую часть логарифма по основанию 2 исходного аргумента, а другая находит логарифм по основанию 2 наибольшего делителя, являющегося степенью двойки.
                      Ответить
                • Можно найти ноль в образе текущего экзешника (способ зависит от ОС). Нидлес и я находили нужные числа в PSP (в префиксе сегмента программы), когда соревновались в программировании в ASCII-кодах.
                  Ответить
                  • Нулей обычно в конце секции полно. Так что можно взять текущий адрес как call + pop и найти нули через repnz scasd.

                    З.Ы. А тьфу, для scasd уже понадобится 0. Придётся просто загружать и тестить.
                    Ответить
                  • > PSP

                    Ну в современных осях тоже должны найтись нули в тредлокал сегменте, на который ссылаются FS или GS.
                    Ответить
            • можно открыть процессор, найти этот регистр, и обнулить его
              Ответить
              • Ещё идея: сбросить все флаги, а потом PUSHF и POP EAX.
                Ответить
              • Искал по треду loop. Нашёл только это.
                Странно что никто не предложил такой способ

                za: loop za
                mov eax, ecx
                Ответить
              • Собственно эту заметку я и вспомнил, когда предложил перечислить способы обнуления eax. Спасибо за находку, я бы её вряд ли сходу нагуглил.

                >> вот чего тут нет - так это полных извращений, типа обнуления по одному
                биту, автогенерируемого кода и т.п.

                Придётся устранить это недоразумение. Есть идеи?
                Ответить
                • Ну вон выше есть пара-тройка полных извращений типа обнуления декрементом.
                  Ответить
                  • И обнуление по одному биту Fike предложил.

                    Осталось только позвать автогенерируемого кота.
                    Ответить
                    • > автогенерируемого

                      Мой пример с times 32. Он в 32 сложения раскроется.
                      Ответить
                        • Ну сейчас сложно в рантайме код генерить...

                          Но можно найти в библиотеках фрагменты, которые зануляют eax и возвращают управление. Они должны очень часто встречаться в сишном коде.
                          Ответить
                  • >есть пара-тройка полных извращений типа обнуления декрементом

                    Хм. Это первое что пришло мне в голову, когда посоны объявили спец. олимпиаду.
                    Ответить
              • > - вычисление синуса от Pi * n (умножать командой FMUL)
                это лучший имхо
                Ответить
  • Сиднейский филиал Австралийской радиовещательной корпорации (ABC) назвал шахматы расистским видом спорта, так как по правилам белые фигуры всегда ходят первыми и имеют преимущество над черными, а это является аллегорией расового насилия.
    Ответить
    • Там ещё и король с королевой неравноправны и не могут сменить свой гендер.
      Ответить
    • Политкорректные шахматы: белые фигуры не могут убивать чёрных.
      Ответить
      • А еще черные могут воровать у белых, например если черная фигура дошла до последней горизонтали, то надо чтоб играющий за белых заплатил бабла тому, кто за черных играет. И за черных конечно же только афро-американцы могут играть.
        Ответить
  • ВСЕХ ПОПРАВОК НЕ ПРОЧЕСТЬ
    МНОГА БУКАВ У НИХ ЕСТЬ
    МНОГА ТОЧЕК ЗАПЯТЫХ
    ЛИНИЙ РОВНЫХ И КРЕВЫХ
    НО НЕ ВАЖНО ЭТО НАМ
    ЗНАЕМ ЧТО ПОСТРОЕН ХРАМ
    ЗНАЕМ ЧТО ТИПЕРЬ ЖЫНА
    ТОЛЬКО С МУЖЕМ СПАТЬ ДОЛЖНА
    И ТИПЕРЬ УЖ САДОМИТ
    СИРОТУ НЕ ОСРАМИТ
    А НАШ ВЕЧНЫЙ ПЕРЗИДЕНТ
    БУДЕТ МНОГА-МНОГА ЛЕТ!
    Ответить
  • - Да,.. троюродные. - бросил Джим и выразительно посмотрел на проговорившегося Дениса. Тот втянул голову в плечи и засеменил за палатку.
    Ответить

Добавить комментарий для MAKAKA Отменить ответ

Переведи на "PHP", guest!

    А не использовать ли нам bbcode?


    8