1. Куча / Говнокод #25540

    +1

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    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
    63. 63
    64. 64
    65. 65
    66. 66
    67. 67
    68. 68
    69. 69
    70. 70
    71. 71
    72. 72
    73. 73
    74. 74
    75. 75
    76. 76
    # это комментарий #
    COMMENT это понятно что COMMENT
    CO это тоже ко-ко-коментарий CO
    
    CO функция принимает 3 параметра типа INT и возвращает ссылку на массив CO
    PROC range = (INT start, end, step)REF[]INT : (
        INT length = ABS((end - start) % step);
        NEW [0 : length - 1]INT result; CO массив в куче CO
        CO LWB —– нижний индекс массива, UPB —– верхний CO
        FOR i FROM LWB result TO UPB result
        DO
            result[i] := start + i * step
        OD;
        result CO функции возвращают результат последнего вычесленного выражения CO
    );
    
    CO можно определять свои операторы CO
    OP RANGE = (INT start, end)REF[]INT: range(start, end, (start < end | 1 | -1));
    PRIO RANGE = 5; CO для бинарных операторов нужно задать приоритет, у сложения/вычитания приоритет = 6 CO
    
    CO для операторов возможна перегрузка по количеству и типу аргументов CO
    OP RANGE = (INT end)REF[]INT: 0 RANGE end;
    
    OP ACCUM = ([]INT x, PROC(INT,INT)INT f)INT : (
        INT length = UPB x - LWB x;
        IF length = 0 THEN
            1
        ELIF length = 1 THEN
            x[LWB x]
        ELSE
            INT result;
            result := x[LWB x];
            FOR i FROM LWB x + 1 TO UPB x
            DO
                result := f(result, x[i])
            OD;
            result
        FI
    );
    PRIO ACCUM = 5;
    
    CO правый операнд у ACCUM —– лямбда CO
    OP ! = (INT x)INT: 1 RANGE x + 1 ACCUM ((INT x, y)INT: x * y);
    
    printf(($g(0), "! = ", g(0), l$, 7, !7));
    
    OP MAP = ([]INT x, PROC(INT)INT f)REF[]INT : (
        NEW [LWB x : UPB x]INT result;
        FOR i FROM LWB x TO UPB x
        DO
            result[i] := f(x[i])
        OD;
        result
    );
    PRIO MAP = 5;
    
    PROC pow = (INT x, n)INT: x ^ n;
    
    CO каррирование CO
    printf(($g(0), " "$, RANGE 10 MAP pow(2, )));
    print(new line);
    
    OP FOREACH = (REF[]INT x, PROC(REF INT)VOID f)VOID : (
        FOR i FROM LWB x TO UPB x
        DO
            f(x[i])
        OD
    );
    PRIO FOREACH = 5;
    
    REF[]INT a = -5 RANGE 6;
    a FOREACH ((REF INT x)VOID:
        x := x ^ 2
    );
    
    printf(($g(0), " "$, a))

    https://tio.run/##jVVdbxJBFH3nV1xbTXZ1iaBpNVQfkFIlKV2C1T40mJBIkYRgUzFdEx@wtRpTPx70hyCWlkLBvzDzF/wj9dw7s0uBmgiF7syce@fOuecM5Xr1ZX3xbvX8fJ70F72nRqT6aqTO8O6qISbauqV66pTmYxk/n8@urUe438AN9TcMhhjqjzJrQQCHOP5Sx6oriePR18wGGT8mUe/1PhL29QfV09@wiywP8TlTbdXVe3Sbt@aoNufQe/zEu/R4mnKoUPVIdbDFierwov5kI/U7vA/VANn3CTnbxEl5FsEdrqBQ9DO0U25UK3SfHM71qlneaXpUaTz38FzZdovZlc0Sr6TIiRFe/FyvNKrNF4hJP3jsOABT3ES6dM2ELQl2LbtBmwmE2oA4JSXXTuXV63pzCSVMlsR/KFZ/BH8oj1MAsrrxgP60fvxpfSdh5li@T0mIOgKvff1uIo9qe/SkMA7qgI6WPrBhNvGKX6QarRT9vGxgSqJ1XyLNSHDLBs4vM7tZK1Hqvjkv3UCO63JkQfnL5uA221SDL2mU/sqNauEQJ8AN9GeRyJ7IDYcZYOEI4V31izXY0YfMjV0YshLHC6yQY5lmJeGUaELMMDwSzoAbicC6wtqAxaw/QyZSVE9WmSkuALu39CFn8QtUTK89zM4qJNJGymjIuSgeM6B7PKK3lMQnnnRRUqGY86OMC0YDR1wMqZ/SUdb6EOc5mCkIYwhkCKLscU5w5CNexTGsdRjWAxwG8Ai6F65GY2JuWhIZ07ZczYaitMXQomF1lxZj2hky3CaLQb/A3z6W@mbSXjQDbCANRI4Ou7JnrczPfPBfCAqvipEx6XQDJplP2EXMot3ApjOZJ3nGGtsGHrHLOdLDx@W5LfefhmbxB/ApWyIwWs6tjJcTtP4ouxYZIilP2dWLkOQkJNiUVCWLfJyNVi5cBFMOY3uFceO1KcMG8F4y9GsQoS7YdTLhlmOePaSuldwIFVp2jDbXQy4WijVkdMH66bdYDTLiOyhSBd9FLDiDDq8eKAf9/Mkqtb28EvYxcKWBSdtAcx4T7Ti2dW8MJsAd84btvL1TazS3HOdq1Um4Hs1xsjmPzKh@1aM7Hl25wzbjrfLpwqVCsCKYudrlujbcpgytpekmzTRhogH/uiu3nDHnk1dkRLKplSmWH6Xtl7sRTx41QhqeUcM2oc92EcOKE42Xzc/GNEk0B2IMycmEbITszi2PXCZK0E6jskv1WqNimcMxs@nMIy4hYikkEBOsXfepn1sGi/IvZPC/6ZlkJGJhvC8zEW1dxkR8wZ5hcSlWjoBOWA7kxJWkJGMgDgJbt2KXqUYIKbvu@flf
    Давайте течь от "Algol-68".

    Запостил: BOKCEJIbHblu_nemyx, 13 Апреля 2019

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

    • Я оценил.
      Ответить
    • Давайте разбирать.

      Сам синтаксис –— жуткая смесь «Си» и «Паскаля». Ну они и вышли из «Алгола», только разделились на остроконечников и тупоконечников.

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

      Встроенные операторы для определения границ индекса массива. Эти операторы унаследовали Паскаль (в виде функций High и Low) и язык Ада (в виде атрибутов 'First, 'Last, 'Range, 'Length), но проигнорировал язык Си. В сишке вообще арифметика указателей для бесконечной ленты вместо нормальных массивов, как будто мы собираемся реализовывать машину Тьюринга или интерпретатор Брейнфака.

      Динамические массивы в куче с произвольными диапазонами индексов.

      Анонимные функции.

      Неужели всё это было в 1968-м году?

      Про каррирование жду пояснений.
      Ответить
      • > в 1968-м
        А в лиспе в это время уже GC был.
        Ответить
      • У функции pow в строке 60 отсутствует один аргумент, в таком случае возвращается функция которая принимает недостаюшие параметры.
        Ответить
        • Вместо того, чтобы описывать новую функцию или выражение, возвращающее лямбду, достаточно написать вызов функции с опущенными аргументами (как в
          этом примере pow(2,)) и всё? Так коротко?
          Ответить
          • показать все, что скрытоvanished
            Ответить
            • Именно поэтому я за «PHP»:
              <?php
              function pow2_($x) {
                  return pow(2, $x);
              }
              
              function pow_2($x) {
                  return pow($x, 2);
              }
              Ответить
              • У вас тут мокренько...
                Ответить
                • <?php
                  
                  function apply_first_argument($callback, $arg) {
                      return function()use($arg, $callback) {
                          $other_args = func_get_args();
                          array_unshift($other_args, $arg);
                          return call_user_func_array($callback, $other_args);
                      };
                  }
                  
                  function apply_last_argument($callback, $arg) {
                      return function()use($arg, $callback) {
                          $other_args = func_get_args();
                          array_push($other_args, $arg);
                          return call_user_func_array($callback, $other_args);
                      };
                  }
                  
                  $pow2_ = apply_first_argument(pow, 2);
                  $pow_2 = apply_last_argument(pow, 2);
                  echo '2 ^ 3 = ' . $pow2_(3) . PHP_EOL;
                  echo '3 ^ 2 = ' . $pow_2(3) . PHP_EOL;


                  https://ideone.com/QO1oCh
                  Ответить
                  • показать все, что скрытоvanished
                    Ответить
                    • Интересно.

                      Если я правильно понял, то std::bind позволяет передавать аргументы в любом порядке. Т. е. можно сделать std::bind(f, _3, _2, _1), чтобы аргументы подставились задом наперёд?
                      Ответить
                      • > _3, _2, _1
                        Чёрт, 'J' меня испортил, я сперва подумал, что это отрицательные числа.
                        Ответить
                    • Я придумал:

                      <?php
                      
                      function ArgumentMixer($callback) {
                          return function()use($callback) {
                              $args = func_get_args();
                              shuffle($args);
                              return call_user_func_array($callback, $args);
                          };
                      }
                      
                      function trivial_print() {
                          echo implode(' ', func_get_args()) . PHP_EOL;
                      }
                      
                      $funny_print = ArgumentMixer('trivial_print');
                      
                      $funny_print('пить', 'меньше', 'надо'); 
                      $funny_print('пить', 'меньше', 'надо');
                      $funny_print('пить', 'меньше', 'надо');
                      $funny_print('пить', 'меньше', 'надо');
                      $funny_print('пить', 'меньше', 'надо');
                      $funny_print('пить', 'меньше', 'надо');


                      https://ideone.com/XN0Y4Y
                      Ответить
                    • А для сишки кто-нибудь пытался реализовать (кроме Царя; у него стрёмный вариант, потому что полагается на протухшие данные в стеке)?
                      Ответить
                      • Для сишки сложно. А вот так это будет реализовано на C#:
                        using System;
                        using System.Reflection;
                        
                        public class Test
                        {        
                        	delegate T Param<T>(params object[] args);
                            static Param<T> skipArg<T>(Type type, string method, int ind, object value, Type[] types = null)
                            {
                                MethodInfo mi;
                                if (types == null) mi = type.GetMethod(method);
                                else mi = type.GetMethod(method, types);
                                return delegate (object[] _args)
                                {
                                    int len = _args.Length;
                                    object[] args = new object[len + 1];
                                    Array.Copy(_args, 0, args, 0, ind);
                                    Array.Copy(_args, ind, args, 1 + ind, len - ind);
                                    args[ind] = value;
                                    return (T)mi.Invoke(null, args);
                                };
                            }
                         
                            static void Main()
                            {
                                Param<double>
                                    pow2_ = skipArg<double>(typeof(Math), "Pow", 0, 2),
                                    pow_2 = skipArg<double>(typeof(Math), "Pow", 1, 2);
                                Console.WriteLine("2 ^ 3 = {0}", pow2_(3)); // 2 ^ 3 = 8
                                Console.WriteLine("3 ^ 2 = {0}", pow_2(3)); // 3 ^ 2 = 9
                            }
                        }

                        https://ideone.com/WiUFJi
                        Ответить
                      • j123123 в треде про конференцию поехавших крестовиков что-то такое делал, полностью валидное.
                        Ответить
            • Тут статический строгий петух, если обосрался то не сконпилится.
              Ответить
        • показать все, что скрытоvanished
          Ответить
      • Думаю, для 60-х это оказалось слишком сложным, потому его и обоссали.
        Ответить
    • Какая большая сцылка.
      Ответить

    Добавить комментарий