1. Lua / Говнокод #25987

    0

    1. 001
    2. 002
    3. 003
    4. 004
    5. 005
    6. 006
    7. 007
    8. 008
    9. 009
    10. 010
    11. 011
    12. 012
    13. 013
    14. 014
    15. 015
    16. 016
    17. 017
    18. 018
    19. 019
    20. 020
    21. 021
    22. 022
    23. 023
    24. 024
    25. 025
    26. 026
    27. 027
    28. 028
    29. 029
    30. 030
    31. 031
    32. 032
    33. 033
    34. 034
    35. 035
    36. 036
    37. 037
    38. 038
    39. 039
    40. 040
    41. 041
    42. 042
    43. 043
    44. 044
    45. 045
    46. 046
    47. 047
    48. 048
    49. 049
    50. 050
    51. 051
    52. 052
    53. 053
    54. 054
    55. 055
    56. 056
    57. 057
    58. 058
    59. 059
    60. 060
    61. 061
    62. 062
    63. 063
    64. 064
    65. 065
    66. 066
    67. 067
    68. 068
    69. 069
    70. 070
    71. 071
    72. 072
    73. 073
    74. 074
    75. 075
    76. 076
    77. 077
    78. 078
    79. 079
    80. 080
    81. 081
    82. 082
    83. 083
    84. 084
    85. 085
    86. 086
    87. 087
    88. 088
    89. 089
    90. 090
    91. 091
    92. 092
    93. 093
    94. 094
    95. 095
    96. 096
    97. 097
    98. 098
    99. 099
    100. 100
    local money = 0
    local auto_money = 0
    local auto_money_lvl = 0
    local auto_money_buy = 50
    local bonus_money_lvl = 0
    local bonus_money_buy = 35
    local json_pip = require("json")
    local bacg = display.newRect(0,0,1080,1920)
    local button = display.newRect(160,190,175,175)
    button:setFillColor(0,0.4,0.3)
    local button_auto = display.newRect(70,400,111,111)
    button_auto:setFillColor(0,0.4,0.3)
    local button_bonus = display.newRect(250,400,111,111)
    button_bonus:setFillColor(0,0.4,0.3)
    local text = display.newText("Click", 161, 190, "consolas", 30)
    text:setFillColor(1,1,1)
    local text1 = display.newText("Money:", 64, -19, "consolas", 30)
    text1:setFillColor(0,0.1,0.8)
    local text2 = display.newText(money, 200, -16, "consolas", 30)
    text2:setFillColor(0,0.1,0.8)
    local text3 = display.newText("Auto", 70, 370, "consolas", 30)
    text3:setFillColor(1,1,1)
    local text4 = display.newText("click", 70, 400, "consolas", 30)
    text4:setFillColor(1,1,1)
    local text5 = display.newText(auto_money_buy, 70, 437, "consolas", 30)
    text5:setFillColor(1,1,1)
    local text6 = display.newText("Bonus", 250, 370, "consolas", 30)
    text6:setFillColor(1,1,1)
    local text7 = display.newText("click", 250, 400, "consolas", 30)
    text7:setFillColor(1,1,1)
    local text8 = display.newText(bonus_money_buy, 250, 437, "consolas", 30)
    text8:setFillColor(1,1,1)
    ocal button_shadow = display.newRect(160,280,175,10)
    button_shadow:setFillColor(0,0.3,0.4)
    local button_shadow_auto = display.newRect(70,460,111,10)
    button_shadow_auto:setFillColor(0,0.3,0.4)
    local button_shadow_bonus = display.newRect(250,460,111,10)
    button_shadow_bonus:setFillColor(0,0.3,0.4)
    local copyright = display.newText("KernelCoreSW 2018-2019", 163, 490, "consolas", 23)
    copyright:setFillColor(0,0.1,0.8)
    local function flapBird (event)
      if(event.phase == "began") then
       ---lvl
       if(bonus_money_lvl == 0) then
         money = money + 1
        end
        if(bonus_money_lvl == 1) then
         money = money + 2
        end
    --И еще такого говнаролла штук 10
    text2.text = money
    end
    local function flapBird_bonus (event)
      if(event.phase == "began") then
        if(money >= bonus_money_buy) then
         money = money - bonus_money_buy
         bonus_money_buy = bonus_money_buy * 3
         bonus_money_lvl = bonus_money_lvl + 1
        end
        text2.text = money
        text8.text = bonus_money_buy
      end
    end
    local function onUpdate (args)
    
        if(auto_money > 40) then
      auto_money = 0
        end    
        ---------levels
        if(auto_money_lvl == 1) then
      if(auto_money == 40) then
       money = money + 1
       text2.text = money
      end
        end
        ---------levels end и еще такого говна штук 10
        auto_money = auto_money + 1
    end
    local function load_settings(fileName)
        local path = system.pathForFile(fileName, system.ResourceDirectory)
        local contents = ""
        local myTable = {}
        local file = io.open(path, "r")
        if(file) then
      contents = file:read("*a")
      myTable = json.decode(contents)
      io.close(file)
      return myTable
        end
        return nil
    end
    local settings = loadSettings("settings.json")
    if(settings) then
        money = settings.money
        auto_money = settings.auto_money
        auto_money_buy = settings.auto_money_buy
        auto_money_lvl = settings.auto_money_lvl
        bonus_money_lvl = settings.bonus_money_lvl
        bonus_money_buy = settings.bonus_money_buy
    end

    button:addEventListener("touch", flapBird)
    button_auto:addEventListener("touch", flapBird_auto)
    button_bonus:addEventListener("touch", flapBird_bonus)
    Runtime:addEventListener("enterFrame", onUpdate)

    Гейдев.

    Запостил: 3oJIoTou_xyu, 23 Октября 2019

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

    • Вопрос. Нахуя тут в lua сериализатор/десериализатор JSONа для своих сеттингов? Нахуя? Зачем? В чем прикол? Поясните логику сяго.
      Ответить
    • >--И еще такого говнаролла штук 10
      if(bonus_money_lvl == 18) then
           money = money + 19
          end

      ?

      какая трудолюбивая мартышка писала)


      auto_money_buy = settings.auto_money_buy
          auto_money_lvl = settings.auto_money_lvl

      так для КАЖДОЙ переменной?!
      ахахаха, какая трудолюбивая макака писала

      В луа 100500 способов есть серализовать таблицу.
      Нужно сделать таблицу настроек, и течь, это и быстрее и правильнее, и удобнее.

      Кашу из "логики", ui и сохранения файлов оставим за скобками
      Ответить
      • Да. Для каждой. Просто сюда не поместилось.
        Ответить
        • а потом надо добавить будет одну переменную во все места, ой)
          Ответить
          • В свое время, я тоже занимался такой подобной хуйней. Но там вынужденная мера была, так как текстовики довольно ветвисты и иногда нужны особые условия при определенных выборах.
            Но я все в рот ебал. Я сделал более лаконичную и по моему мнению правильную реализацию квестов - это через таблы и все это лоадить и тупо по индексам переходить и лоадить по мере необходимости и отрубать то что не нужно, а не все дерьмо держать в ОЗУ.
            globaltext = {
            [1] = {t = "ВЫ съели говно", 
                [1] = {"Теперь я хуй",2} , 
                [2] = {"Теперь я гей",2}, 
                [3] = {"Я какий петушок!",2, function() inv:add(dildo) end}}
            [2] = {t = "you dead suka",     
                [1] = {"Ну еба...",1}}}

            Чем так
            text  = 1;
            if text == 1 then
                textpnt = "ВЫ съели говно";
                if vib == 1 then
                    butt = "Теперь я хуй"
                   text  = 2;
                elseif vib == 2 then
                    butt = "Теперь я гей"
                   text  = 2;
                elseif vib == 3 then
                   butt = "Я какий петушок!"
                   text  = 2;
                  inv:add(dildo)
               end
            elseif  text == 2 then
                textpnt = "you dead suka";
                if vib == 1 then
                    butt = "Ну еба..."
                    text  = 1;
                end
            end
            Ответить
            • Разумеется декларативно писать лучше, чем императивно.

              Тем более что в Lua развесистые стредства для декларативного, оно для этого и сделано.
              Ответить
              • да, типа такова (см maze)
                function monster()
                  print("I am monster. Tell me how many balls do I have, or I will eat you")
                  local answer = io.read("*number")
                  io.read(1) --Number left "\n" unread
                  if answer == 42 then
                    print("Right")
                    return true
                  else
                    print("Looser")
                    return false
                  end
                end
                
                
                -- Describe your maze here in declarative way
                local entrance = {  
                  N = monster,
                  S = {
                    N = "exit",
                    W = monster
                  }
                }
                
                local directions = {"N", "S", "E", "W"}
                
                function engine() 
                  local room = entrance
                  while room ~= "exit" do
                    io.write("Where you wanna go ["..table.concat(directions, ",").."] ? ")
                    local direction = io.read()
                    print("Going "..direction.."...")
                    local nextStep = room[direction]    
                    if nextStep == nil then
                      print("You just felt in pit and died+")
                      return
                    elseif type(nextStep) == "function" then
                      if not nextStep() then
                        print("You died")
                        return        
                      end
                    else 
                      room = nextStep
                    end
                  end
                  print("Congrat!")
                end
                
                engine()
                Ответить
    • Хуй, ты в геймдеве?
      Ответить
      • он в один эсе, лол)

        хотя обычно луашники в гейдеве, да
        Ответить
        • Работаю в с 1с. Ради лулзов в свободное время в геймдеве.
          Ответить
          • на чом пишеш игры? луа?
            Ответить
            • Да. Используя двиг love2d - потому что комьюнити одно из пиздатейших (нету орущих долбоебов - они обходят его стороной), да и документация по нему простая. До него писал моды на всякие игоры: cortex command, fucktorio.
              Ответить
              • https://love2d.org/wiki/love.joystick.getNumBalls

                любовь палочка удовольствия возвращает количество яиц, ясно понятно)))


                забавно, надо попробовать на самом деле


                Доброго утра, кстати
                У вам там в Уссурийске уже утро
                Ответить
                • и еще трение тел
                  Create a friction joint between two bodies. A FrictionJoint applies friction to a body.
                  Ответить
                • Я не живу в Уссурийске. Но доброе утро.
                  Ответить
                  • Все, что восточнее сибири -- все Уссурийск, тыж понимаешь
                    Ответить
                    • https://sputnikipogrom.com/wp-content/uploads/2013/12/4abae5ed1c742b5b78f05501.jpg
                      Всё что восточнее Сибири - Китай.
                      Ответить
                      • Оптимисты учат английский
                        Реалисты учат китайский)
                        Ответить
                      • Ой!
                        Доступ к информационному ресурсу ограничен на основании Федерального закона от 27 июля 2006г. №149-ФЗ "Об информации, информационных технологиях и о защите информации".
                        Ответить
    • Переведи на "PHP".
      Ответить
      • Перевёл начало (всё не влезает):
        <?php
        $money = 0;
        $auto_money = 0;
        $auto_money_lvl = 0;
        $auto_money_buy = 50;
        $bonus_money_lvl = 0;
        $bonus_money_buy = 35;
        $json_pip = require("json");
        $bacg = display::newRect(0,0,1080,1920);
        $button = display::newRect(160,190,175,175);
        $button->setFillColor(0,0.4,0.3);
        $button_auto = display::newRect(70,400,111,111);
        $button_auto->setFillColor(0,0.4,0.3);
        $button_bonus = display::newRect(250,400,111,111);
        $button_bonus->setFillColor(0,0.4,0.3);
        $text = display::newText("Click", 161, 190, "consolas", 30);
        $text->setFillColor(1,1,1);
        $text1 = display::newText("Money:", 64, -19, "consolas", 30);
        $text1->setFillColor(0,0.1,0.8);
        $text2 = display::newText(money, 200, -16, "consolas", 30);
        $text2->setFillColor(0,0.1,0.8);
        $text3 = display::newText("Auto", 70, 370, "consolas", 30);
        $text3->setFillColor(1,1,1);
        $text4 = display::newText("click", 70, 400, "consolas", 30);
        $text4->setFillColor(1,1,1);
        $text5 = display::newText(auto_money_buy, 70, 437, "consolas", 30);
        $text5->setFillColor(1,1,1);
        $text6 = display::newText("Bonus", 250, 370, "consolas", 30);
        $text6->setFillColor(1,1,1);
        $text7 = display::newText("click", 250, 400, "consolas", 30);
        $text7->setFillColor(1,1,1);
        $text8 = display::newText(bonus_money_buy, 250, 437, "consolas", 30);
        $text8->setFillColor(1,1,1);
        $button_shadow = display::newRect(160,280,175,10);
        $button_shadow->setFillColor(0,0.3,0.4);
        $button_shadow_auto = display::newRect(70,460,111,10);
        $button_shadow_auto->setFillColor(0,0.3,0.4);
        $button_shadow_bonus = display::newRect(250,460,111,10);
        $button_shadow_bonus->setFillColor(0,0.3,0.4);
        $copyright = display::newText("KernelCoreSW 2018-2019", 163, 490, "consolas", 23);
        $copyright->setFillColor(0,0.1,0.8);


        Тут ещё надо оптимизировать код: заменить двойные кавычки на одинарные. Но я думаю, ты сам справишься.
        Ответить
        • зачем переводить говно с симпатичного язычка на говёный?
          Типа говно нужно писать на говне?
          Ответить
          • А на чём?
            Ответить
            • Херовоз, вот тебе вопрос.

              Пусть языки, не дающие пользователю возможность создавать subrange type[1], принадлежат множеству "языки, сосущие хуй".

              Назовите множество языков, обладающих следующими характеристиками
              * Язык не принадлежит множеству "языки, сосущие хуй"
              * Язык принадлежит множеству "императивные языки"
              * Язык не равен "язык программирования Паскаль"?

              1.
              Type
              PetuhIQ = 1..10;


              -------
              Кроме шуток: почему сабренджей нигде нету?
              Ответить
              • Язык Ада, например. Серьёзно, в нём можно объявлять даже контракты (предикаты, аспекты).

                http://govnokod.ru/25520#comment471813

                subtype Winter is Month
                with Static_Predicate => Winter in Dec | Jan | Feb;


                Заметь, Winter в этом примере — это даже не сабрендж, это произвольное подмножество.
                Ответить
                • Ада же наследница паскаля?
                  А почему при всем этом мы пишем на джаве?

                  зы: можно такое попыаться нахуивертить на шоблоёбло крестовом, но j123123 проклянёт сразу
                  Ответить
                  • Вообще множества и ренджи пришли из языка SETL. Гвидо и Мацумото тоже были вдохновлены этим языком. Вот подтверждение самого Гвидо:
                    https://mail.python.org/pipermail/python-dev/2000-August/008881.html

                    Офигеть. С создания языка SETL прошло больше 50 лет.
                    Ответить
                    • Однако и питон и Ruby ничего подобного не имеют, ну им простительно: они скриптовые.

                      Оба ЯПа кстати, это полная противоположность паскаля: Никлаус говорил, что лишние сущности не нужны. У нас есть type, а значит class, struct, хуют, итд -- это булщит.

                      В питоне у нас есть
                      * дикт
                      * класс
                      * дата класс
                      * тупла
                      * неймд тупла
                      * тайпд дикт

                      В руби есть
                      * hash
                      * class
                      * Struct
                      * OpenStruct
                      Ответить
                      • Когда Никлаус совсем поехал на устранении лишних сущностей, он придумал «Оберон». Но мне «Оберон» показался игрушечным. Его можно использовать разве что как учебный вместо «Бейсика».
                        Ответить
                        • > как учебный
                          Хорошая попытка, но учебный это всё таки твой Пассаль. И это подтверждается постоянными проёбами, отсутствием каких либо стандартов и полной потерей рынка.
                          Ответить
                        • > он придумал «Оберон»

                          Главная мысль в Обероне — это gc.
                          Который потом стал повсеместным явлением.
                          Ответить
                          • Вот ГЦ не нужен, кстати. Ей богу: проблем от него больше, чем радости.
                            Ответить
                      • >Никлаус говорил, что лишние сущности не нужны.
                        >У нас есть type, а значит class, struct, хуют, итд -- это булщит.

                        Всё правильно говорил.
                        Ответить
                      • Сейчас на руби кто-то пишет вообще?
                        Ответить
                        • Какой сейчас год?
                          Ответить
                        • https://www.netguru.com/blog/top-34-web-apps-built-with-ruby-on-rails


                          AirBnb, Ask.FM, Bloomberg, GitHub, SlideShare, ZendDesk, YellowPages, KickStarter, UrbanDictionary, и прочий ненужный шлак, про который никто не знает, и которым никто не пользуется
                          Ответить
                          • Из этого списка знаю только "GitHub".
                            Ответить
                          • Ещё вспомни движок «redmine», который используют в некоторых репозиториях кода.
                            Ответить
                    • Кстати, рендж есть и в python и ruby (в нем он частично от perl) но имеет совершенно иное значение
                      Ответить
              • У тебя тавтология Эйлера. Пассаль таки сосёт хуй.
                Ответить
              • Паскаль — говно.
                Но в нём было заложено много годных идей.
                Например писать тип после переменной, а не до. Или не делать из языка С++0z.

                >почему сабренджей нигде нету?

                Вот поскольку их нету, то в 2к19 у нас либо либо bounds checking, либо buffer overflow.

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

                А нужно так, чтоб любое обращение к строке/массиву по индексу, принимало только subrange [0..length-1].
                Ответить
                • > сабренджи

                  Что за питушня анскильная?
                  Ответить
                • Помню, у броманда была опция pcc, которая инструментацию для такого вставляла. Но не для строк. Вроде баундсы должны был определены в копулетайм.
                  Ответить
                  • Хочется чего-то такого.

                    Допустим есть имя пользователя, длина 1-32 символа.
                    Это String[1..32] (синтаксис условный, в крестошаблонах String<1,32>).

                    Например пароль: String[8..32].

                    Пустая строка String[0..0]

                    Строка фиксированного размера, например хеш-функция, возвращающая md5:
                    String<32,32> md5 (String input){
                    ...
                    }


                    Тогда конкатенация плюсом даёт сложение нижней и верхней границ. Конкатенация коммутативна: от перестановки строк местами тип не меняется.

                    String[0..4] + String[2..4] = String[2..8]


                    Взятие подстрок проверяется в компайл-тайме. Индексы — те самые диапазоны.
                    Ответить
                    • Нахуй ты отвечаешь уебку?
                      Ответить
                    • Питушочек, в каком компайл-тайме? Часто у тебя в индексах константы? Да и ничто не мешает тебе в сях определить структуру struct md5_t { char s[33]; }, и какой-нибудь "PVS-studio" тебе подсветит md5("pituh").s[42], или даже компилятор.
                      Ответить
                      • Да, хорошо, что божественная не делает лишних проверок и даже с -Wall не сообщает о детских ошибках, поэтому Карпову есть чем заняться.
                        Ответить
                      • поц-какаль еще может (в теории) сэкономить папять

                        Представь, сколько займет в памяти стул типа

                        Type dva_stula [0..1]
                        Ответить
                        • type dva_stula = 0..1;


                          Да, тут компилятор автовыведет тип хранилища (в данном случае он положит результат в байт, а не в интеджер).

                          Сишнику же придётся считать размер хранилища самому (считать двоичный логарифм и округлять в большую сторону).

                          Вот, например, переменная принимает значения от -9000 до +100500. В какой тип её класть? Придётся держать в уме лимиты int8_t, int16_t, int32_t, int64_t. Мы же не дураки и не будем использовать short int, int, long int, long long int, которые на разных платформах будут разными?
                          Ответить
                    • Давай я тогда расскажу, чего хочется мне

                      Некое подмножество языка, коее можно исполнять и в компайл тайме, и в рантайме (кто сказал constexpr?!).

                      Ограничения описываются декларативно.
                      type room: 1..99;
                      type name: String[1,20]; {можно еще NonBlank}


                      var r: room = 100; //упадет в комплайл тайме
                      r = q; //тут компилятор встроит проверку, и упадет в случае переполнения

                      можно запретить такие приравнивания, и требовать делать это явно, обрабатывая ошибки (через паттер матчинг конечно)


                      То-есть важно, что
                      1) ограничения описаны декларативно
                      2) по стандартам языка
                      3) понимаемы всеми

                      Вася потом может написать тулу, которая по струтуре таблицу в СУБД сгенерит и переведет язык констреинтов на констеинты SQL

                      А Маша может написать генератор формочек с валидацией по констреинтам в UI

                      Важно, что это описывается как-то внятно, и в одном месте
                      Ответить
                      • with Ada.Text_IO; use Ada.Text_IO;
                        with Ada.Integer_Text_IO; use Ada.Integer_Text_IO;
                         
                        procedure Test is
                                pragma Assertion_Policy (Check);
                        	subtype room is Integer range 1..99;
                        	r: room := 100;
                        begin
                            Put(r);
                        end;


                        test.adb:7:20: warning: value not in range of type "room" defined at line 6
                        test.adb:7:20: warning: "Constraint_Error" will be raised at run time


                        Тут поймали ошибку ещё во время компиляции.

                        А теперь пример посложнее:
                        with Ada.Text_IO; use Ada.Text_IO;
                        with Ada.Integer_Text_IO; use Ada.Integer_Text_IO;
                        with Ada.Numerics.Discrete_Random;
                         
                        procedure Test2 is
                                pragma Assertion_Policy (Check);
                        	subtype room is Integer range 1..99;
                                package RND is new Ada.Numerics.Discrete_Random (room);
                                G: RND.Generator;
                        	r, q: room;
                        begin
                            r := 99;
                            RND.Reset(G);
                            q := r + RND.Random(G); -- гарантируем невозможность проверки в компайлтайме
                            Put(q);
                        end;


                        Тут во время выполнения срабатывает проверка:
                        raised CONSTRAINT_ERROR : test2.adb:14 range check failed

                        Компилятор добавил отладочную информацию, которую потом вывел в сосноль дефолтный обработчик исключения.
                        Ответить
                        • addl	%edx, %eax // та самая операция сложения, приводящая к переполнению
                          	testl	%eax, %eax // проверка на 0
                          	jle	L2
                          	cmpl	$99, %eax // проверка на 99
                          	jle	L3                           // если значение прошло проверку, идём дальше
                          L2:
                          	movl	$14, 4(%esp) // 14 - это номер строки, вызвавшей ошибку
                          	movl	$LC0, (%esp)
                          	call	___gnat_rcheck_CE_Range_Check // обработчик исключения Constraint_Error
                          L3:
                          Ответить
                • В паскале тип переменной пишется правильно
                  В паскале есть сабренджи, а сабренджи это хорошо
                  В паскале нет ключевых слов class, struct, и проч, и это отлично

                  Из трех пунктов вытекает очевидный вывод, что паскаль -- говно
                  Ответить
                  • На самом деле классический «Паскаль» был довольно простым языком. Почти как Бейсик, только со строгой типизацией.

                    Компания «Borland» же в него добавила конструкции из «Модулы» и из языка Ада, получив в итоге довольно мощное средство и сохранив строгость, но при этом не дойдя до перегруженности языка Ада. «Object Pascal», на котором основаны «Турбо Паскаль», «Delphi», «Free Pascal» и несколько тупиковых ветвей, можно рассматривать как отдельный язык программирования.

                    >> struct
                    Есть record. Но само слово «record», в отличие от сишного «struct», не нужно писа́ть постоянно, так как его можно использовать только в тайпдефах (слово «type» в «Паскале»).

                    >> class
                    В «Standard Pascal» вообще не было ООП. В «Турбо Паскале» появилось слово «object», а в «Delphi» и слово «class» (разница между «object» и «class» в хранилище и в устройстве ТВМ).
                    Ответить
                  • Нет. Его проблема в другом.
                    Например в раздутом синтаксисе, бойлерплейте и уебанских, неконсистентных циклах.

                    while .trueCondition. do 
                    begin
                    end
                    
                    repeat // Где здесь любимый Виртом begin~end?
                    until falseCondition;//здесь отрицание
                    
                    
                    for i := a downto b  //завези step из бейсика, это говно неюзабельно


                    Для сравнения божественные циклы из Сишки
                    while(trueCondition){}
                    
                    do{
                    }while(trueCondition)
                    //пред и пост- цикл консистентны


                    Для сравнения восхитительный синтаксис циклов из Бейсика:
                    Do 
                    'бесконечный цикл
                    Loop
                    
                    Do While trueCondition
                    Loop
                    
                    Do 
                    Loop While trueCondition
                    
                    For i=0 to n step x
                    Next i
                    Ответить
                    • В сишке for плохой. Очень плохой. Выглядит, как костыль. А вот while сделали лучше, да.

                      Do ... loop изначально не было в «Бейсике». Это «Quick BASIC». Do ... loop сделали под впечатлением от «Фортрана» и «Си».

                      Про шаг согласен. Однако, в Паскале цикл можно делать не только по целым числовым типам, но и по любым перечислимым, к которым относятся и символы (for c:='A' to 'Z' do), и false..true, и перечисления (аналоги сишных енумов, но только со строгой типизацией, без автокаста в целые). Видимо, Вирт решил, что для нечисловых перечислимых типов числовой шаг будет неинтуитивен, поэтому и ограничился двумя значениями (+1 и -1).
                      Ответить
                      • На столько плохой, что его позаимствовали почти все языки?
                        Ответить
                        • Обратная совместимость же.

                          Ты ещё скажи, что свитч-кейс, позволяющий создать устройство Даффа, хороший.

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

                            switch — основная мерзость сишки. Всего-навсего слегка припудренная версия computed goto из фортранов.

                            Одни из лучших case, до того как завезли хипстерский паттерн-матчинг были в бейсике
                            Case a To b, c To d, e, f
                            Ответить
                      • >Вирт решил, что для нечисловых перечислимых типов числовой шаг будет неинтуитивен, поэтому и ограничился двумя значениями (+1 и -1).

                        for в паскале неюзабелен чуть менее чем полностью.
                        Лучше бы он сразу сделал for~each по диапазонам, массивам и остальному добру.
                        for x in [1..3] //повеяло питоном
                        for x in array


                        >Do ... loop изначально не было в «Бейсике».

                        Да. Но сделали ведь просто и консистентно. Один синтаксис на все случаи жизни.

                        Там кстати ещё было Do Until x ... Loop, Do ... Loop Until x что на мой вкус уже излишество, но то такое.
                        Ответить
                        • Кстати, for ... in появился в какой-то версии дельфятины.

                          Вообще согласен, что for i:=1 to 3 — это архитектурное излишество для языка, в котором есть диапазоны и множества. Если уж ввели их, то надо их использовать повсюду.

                          С тем, что совсем неюзабелен, не соглашусь. У него верхняя граница счётчика вычисляется один раз, а не каждую итерацию, как в сишке. Поддерживаются break и continue. Пользоваться можно.

                          Но вот что нужно писать for x:= Low(range) to High(range) вместо for x in range, это, конечно, плохо.
                          Ответить
                    • в божественной сишке можно

                      while (*a++ = *b++);

                      но хорошо ли это?

                      Всегда ли такой стиль нужен?
                      Если ты программист с десятью годами опыта то да
                      Если ты студент то, вероятно, нет
                      Ответить
                    • Наипиздатейший синтаксис циклов в обоссаном в свое время Алкоголь-68°, он сосостоит из нескольких частей, которые можно произвольно добавлять и опукать, из них обязательеым является только тело цикла ( но правдя порядок фиксирован ) :
                      CO полный синтаксис CO
                      FOR var name FROM start BY step TO end WHILE condition
                      DO
                          something
                      OD;
                      
                      CO цикл со счетчиком от 0 до 10 включительно с шагом 1 CO
                      FOR i FROM 0 BY 1 TO 10
                      DO
                          SKIP
                      OD;
                      
                      CO если часть FROM опустить начинает с 1, шаг также по умолчанию 1 CO
                      FOR i TO 10
                      DO
                          SKIP
                      OD;
                      
                      CO можно добавить предусловие CO
                      FOR i TO 10 WHILE condition
                      DO
                          SKIP
                      OD;
                      
                      CO можно оставить только WHILE CO
                      WHILE cindition
                      DO
                          SKIP
                      OD;
                      
                      CO бесконечный цикл CO
                      DO SKIP OD;
                      
                      CO бесконечный цикл со счетчиком, считает с 1 ( падает в рунтиме с переполонием ) CO
                      FOR i DO SKIP OD;
                      
                      CO выполняется 10 раз CO
                      TO 10 DO SKIP OD;
                      
                      CO бесконечный цикл, не знаю в чем смысл, но синтаксически верно и работает, и не падает CO
                      FROM 100500 BY 666 DO SKIP OD
                      
                      CO цикл с постусловием, если не ошибаюсь это расширение современной реализаци Algol-68 Genie, также можно мешать с остальными вариантами CO
                      DO 
                        SKIP
                      UNTIL condition OD
                      Ответить
                      • Пи не понравится: тут, как и в Паскале, предусловие с WHILE, а постусловие с UNTIL.
                        Ответить
                        • Ну тогда не надо брать Algol-68g, можно взять какую-нибудь древность под DOS или еще чего постарше, там UNTIL не было.
                          Ответить
                • >> А нужно так, чтоб любое обращение к строке/массиву по индексу, принимало только subrange [0..length-1].

                  В Паскале две проверки: в компайлтайме (когда индекс принимает очевидное значение) и в рантайме. В TP проверка в рантайме регулируется директивой $R+, в компайлтайме же проверка всегда.

                  Массивы в Паскале изначально были статическими, поэтому проблем с проверкой не было (динамические появились в поздних поделках вроде «Delphi» и «Free Pascal»). В Паскале нельзя обратиться к несуществующему элементу массива.

                  Что же касается строк, то у паскалевских строк две длины: объявленная (которую превышать нельзя, ибо реалокатора нет) и текущая. Выход за объявленную длину проверяется. Выход за текущую, увы, нет.
                  Ответить
                  • >Массивы в Паскале изначально были статическими

                    Вот я и говорю что там всё по-детски просто.
                    Но сама концепция проверять в compile-time хорошая и правильная.
                    Ответить
                    • Проверять в compile-time что?
                      Ответить
                      • В божественной сишечке возможна детская ошибка:
                        char pituh[10];
                        pituh[10] = 42; /* выход за границу, потому что диапазон индексов 0..9 */

                        Паскаль же подобное даже не даст скомпилировать:
                        https://ideone.com/WQeZxE

                        P.S. Чуть выше я ошибся: директива $R+ действует и на рантайм, и на компайлтайм.
                        Ответить
                        • Ебать полезная фича. Прямо концептуально всё меняет. Просто фундаментально правильная концепция.
                          Ответить
                          • Царь?
                            Ответить
                            • Человек хочет ловить ошибки и переполнять буфер в продакшене, а не получать глупые питушиные ошибки компилятора.
                              Ответить
                              • Человек ещё хочет писать код, который работает только при удачном расположении звёзд:
                                http://govnokod.ru/13162#comment180683

                                В «Ideone» царский код упал, потому что «Ideone» использует питушарский защитник стека («Propolice» или аналогичный).
                                Ответить
                        • А как в современных Паскалях обстоят дела с конкатенацией массивов и строк?

                          Возможно ли что-то такое: http://govnokod.ru/25987#comment512947?
                          Ответить
                          • Интервальной арифметики нет. От ренджа ничего вычислить нельзя.

                            Ограничить минимальную длину строки нельзя. В языке Ада можно (там есть динамические предикаты, можно в качестве предиката взять неравенство для функции strlen).

                            Остальное не понял. Можно задачу поставить чётче?
                            Ответить
                            • >Остальное не понял. Можно задачу поставить чётче?

                              Допустим я конкатенирую array[0..8] of char и array[0..2] of char.

                              Хочу на выходе получить автоматом тип array[0..10] of char и соответственно компайл-тайм проверки.

                              Или я делаю slice(start=2,end=4) на array[0..8] of char. Хочу получить не абстрактную строку а array[0..2] of char.
                              Ответить
                              • Это слишком надуманный пример.
                                Ответить
                                • Эот реальный пример.

                                  У меня есть база данных, в базе лежат таблицы.

                                  В таблицах кроме всего прочего есть поля с типами char(24) и varchar(64).

                                  Вот я и хочу иметь в языке, который пишет в эту базу автоматические проверки введённых данных.

                                  Чтобы не заинсертить данные, которые потом автообрежутся.

                                  Я не хочу на каждое поле каждый раз городить новый тип и в нём руками проверять длины. ЯП обеспечить мне подобного механизма не может.
                                  Ответить
                                  • Где здесь проверки в компайлтайме? У тебя вставка в базу данных в компайлтайме происходит?
                                    Ответить
                                    • Если я буду инсертить тип String[0..64], то я буду уверен что там не больше 64 символов.

                                      В компайл-тайме будет проверяться что я не запихнул в строку больше положенного.

                                      Допустим я написал алгоритм расчёта хеша от пароля, если он будет больше 64 символов, компилятор скажет мне где я ошибся.

                                      Ввод от пользователя будет кидать ему ошибку в рантайме, но и тут есть профит, мне не придётся на всякий раз писать:
                                      if (str.length()>64) error("слишком длинная строка")
                                      if (str.length()<10) error("слишком короткая строка!")


                                      Эти ошибки будет генерировать язык, так же, как например при парсинге чисел.
                                      Ответить
                                      • В языке Ада всё есть:
                                        subtype MoyaStroka is String with Dynamic_Predicate
                                        => MoyaStroka'Last >= 10 and MoyaStroka'Last <= 64;


                                        Здесь атрибут 'Last — индекс последнего элемента строки, а поскольку 'First для строки всегда равен единице, то 'Last равен длине.
                                        Ответить
                                        • Вот это реально годно выглядит.
                                          Не зря Тарас её хвалил
                                          Ответить
                                        • > MoyaStroka'Last >= 10 and MoyaStroka'Last <= 64

                                          Почитал за контракты-предикаты. Dynamic_Predicate работает как обычный assert, и отваливается в рантайме.

                                          https://steemit.com/ada-lang/@xinta/learning-ada-4-predicates
                                          Note: if you want the compiler to compile the checks, you must enable asssertions. This is done using the compile time option -gnata.

                                          Короче хуйня. Нас спасут только крестошаблоны, bormand или d++.
                                          Ответить
                                          • Оказывается, длину можно использовать и в статическом предикате:
                                            with Ada.Text_IO; use Ada.Text_IO;
                                            with Ada.Integer_Text_IO; use Ada.Integer_Text_IO;
                                             
                                            procedure Test is
                                            	subtype MoyaStroka is String with Static_Predicate => MoyaStroka'Last in 10..64;
                                            	x: MoyaStroka := "1234567890";
                                                y: MoyaStroka := "short";
                                            begin
                                                Put(x);
                                                New_Line;
                                                Put(x'Last);
                                                New_Line;
                                                Put(y);
                                                New_Line;
                                                Put(y'Last);
                                            end;


                                            Выводит:
                                            test.adb:7:22: warning: static expression fails static predicate check on "MoyaStroka"
                                            test.adb:7:22: warning: expression is no longer considered static

                                            Седьмая строка — это та, в которой y: MoyaStroka := "short";
                                            Тут компилятор видит, что мы игреку пытаемся присвоить значение короче 10 символов. Правда, выводит ворнинг, а не еррор.

                                            Я почему-то думал, что длину можно использовать только в динамическом предикате. Оказывается, в языке Ада атрибуты — это не совсем функции, они могут проверяться и в компайлтайме.
                                            Ответить
                                          • >> Dynamic_Predicate работает как обычный assert, и отваливается в рантайме.

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

                                            Кстати, статический предикат, если не поймал ошибку во время компиляции, всё равно сгенерирует ассерт, если есть директива pragma Assertion_Policy (Check);

                                            И динамический предикат тоже может вывести ворнинг во время компиляции, если выражение вычислимо в компайлтайме (что-то типа констэкспра):
                                            test.adb:7:22: warning: expression fails predicate check on "MoyaStroka"


                                            Правда, жалко, что и Static_Predicate, и Dynamic_Predicate во время компиляции выводят всего лишь ворнинг, а не ошибку.
                                            Ответить
                                            • а неужто нету ключа типа "третировать варнинги как ерроры"?

                                              В общем Вирт (или муриканские охфицеры?) подсмотрел мой пост о том, что главное описать условя, а как и где их проверять это уже дело поправимое, и написал свою аду

                                              Вот всегда бы ученые мужи слушали то, что говорит им гость8.
                                              Ответить
                                              • `-gnatwe'
                                                    Treat warnings as errors.
                                                Ответить
                                              • Вирт не имеет никакого отношения к языку Ада, он его даже критиковал за сложность.
                                                Ответить
                                                • Вирт про язык Ада: «Слишком много всего вываливается на программиста. Я не думаю, что, изучив треть Ады, можно нормально работать. Если вы не освоите всех деталей языка, то в дальнейшем можете споткнуться на них, и это приведёт к неприятным последствиям».

                                                  Дейкстра про язык Ада: «Если Ada собирается выдать стандарт, желательно, чтобы он был недвусмысленно документирован. По меньшей мере две группы попытались сделать это; в результате обе выдали около 600 страниц формального текста. Это гораздо больше, чем необходимо, чтобы удостовериться в невозможности хотя бы твердо установить, что оба документа определяют один и тот же язык. Ошибка очевидной неуправляемости этих двух документов кроется не в двух группах, составивших их, не в принятом ими формализме, а лишь в самом языке: сами не обеспечив формального определения, могут ли его разработчики скрыть, что они предлагают неуправляемого монстра. То, что Ada уменьшит проблемы программирования и увеличит надёжность наших разработок до приемлемых границ, — это лишь одна из тех сказок, в которые могут поверить только люди с военным образованием».
                                                  Ответить
                                                  • Всего 600 страниц, лол. Интересно, что бы он написал про современные кресты.
                                                    Ответить
                                                    • От современных крестов он в гробу вращается. Со скоростью, определяемой реализацией.
                                                      Ответить
                                                      • >гробу
                                                        Никлаус жив, и я надеюсь проживет еще много-много лет.
                                                        Ответить
                                                        • Истинно так! Но я всё таки про Дейкстру.
                                                          Ответить
                                                    • Никлаус обсирал сишечку и кресты еще в 80-х, когда это еще не было мейнстримом.

                                                      Язык, говорит, такое говно, что сразу понятно, что его сделали в Америке.
                                                      Ответить
                                                      • Когда в 90х сделали один многословный, унылый и минималистичный язык с gc (нет, не Оберон).

                                                        То Вирт возмутился что его идею зашкварили сишкоблядским синтаксисом.
                                                        Ответить
                                                        • Самое смешное, что этот унылый язык до сих пор уныл, чуть менее, чем полностью. И еще "вдохновил" парочку языков
                                                          Ответить
                                                      • А я всегда говорил, что американцы тупые. Вот и старик Никлаус со мной согласен.
                                                        Ответить
                                                        • Ты перерождение Задорнова?

                                                          Не надо так говорить, например Чаке Мур'иканец придумал язык Forth.

                                                          Он тут недавно на встрече фортеров хвастался, что придумал очередной диалект colorForth'а и научился многопоточно рисовать звездно-полосатый флаг под вендой.
                                                          https://www.youtube.com/watch?v=3ML-pJFa8lY
                                                          Ответить
                                                          • А что Вирт думает о Форте?
                                                            Ответить
                                                            • Девиз, поставленный Виртом в эпиграф описания Оберона, это слова Альберта Эйнштейна "Сделай так просто, как возможно, но не проще того." На вопрос о языке Форт коллега Вирта по Оберону ответил: "А вот это как раз проще, чем возможно." Вирт же отметил, что Форт, как и Postscript, фантастические языки. Для компьютерной генерации. Но не для человеческого труда. ("Fantastic language, but not for the human to produce.")
                                                              Ответить
                                                        • виртолюб, а как реализуеются вариативная запись в паскале? она в рантайме как-то проверяется?
                                                          Type
                                                          TMakaka =  Record
                                                              nick: String,
                                                              Case language: (PHP, JavaScript) of
                                                                PHP: 
                                                                        framework: (Zend, Cake)
                                                               JavaScript:
                                                                        usesTypeScript: Boolean
                                                          End;
                                                          
                                                          Procedure Dure(Var makaka: TMakaka);
                                                          begin
                                                              { могу же так? или тут форсится паттерн матчинг?}
                                                               makaka.usesTypeScript := True;
                                                          end;
                                                          Ответить
                                                          • Смотря в каком. В «Турбо Паскале» и в его наследниках вообще никак. Аргумент case полностью игнорируется, а варианты работают точно так же, как union в сишке (ну, тупые).

                                                            В «Standard Pascal» по идее вариант должен проверяться, но я не знаю живых реализаций стандартного Паскаля. Придётся стряхивать с них пыль и проверять.
                                                            Ответить
                                                            • Короче, Вирт навиртил прикольных фич, коие не работают в рантайме
                                                              Ответить
                                                              • Whereas Europeans generally pronounce his name the right way ('Nick-louse Veert'), Americans invariably mangle it into 'Nickel's Worth.' This is to say that Europeans call him by name, but Americans call him by value.
                                                                Ответить
                                                              • Возможно, проверка дескриптора варианта работает в «Pascal-P» (P2, P3, P4) и в «UCSD-Pascal». Нужно найти порт для доступной платформы и проверить.
                                                                Ответить
                                                          • Пишу на переносимом диалекте:
                                                            Program Makaka(Input, Output);
                                                            
                                                            Type
                                                              TLanguage = (PHP, JavaScript);
                                                              TFramework = (Zend, Cake);
                                                              TMakaka = Record
                                                                nick: String;
                                                                Case language: TLanguage of
                                                                  PHP: 
                                                                    (framework: TFramework);
                                                                  JavaScript:
                                                                    (usesTypeScript: Boolean);
                                                              End;
                                                            
                                                            Procedure Dure(Var makaka: TMakaka);
                                                            begin
                                                                 if makaka.language = JavaScript then
                                                                    Writeln('language = JavaScript')
                                                                 else
                                                                    Writeln('language = PHP');
                                                                 makaka.usesTypeScript := True;
                                                                 Writeln('Makaka uses TypeScript.')
                                                            end;
                                                            
                                                            var makaka: TMakaka;
                                                            begin
                                                              makaka.language := JavaScript;
                                                              Dure(makaka);
                                                              makaka.language := PHP;
                                                              Dure(makaka)
                                                            end.


                                                            «Турбо Паскаль» и «Free Pascal» спокойно разрешают лазить в поле usesTypeScript, даже когда выбран вариант language = PHP. Всё, как в сишном union'е.

                                                            Беру «Irie Pascal». Производитель обещает совместимость со «Standard Pascal (i.e. ISO/IEC 7185)». Компилирую, запускаю... Рантайм на втором вызове Dure останавливает программу с сообщением:
                                                            ---------------------------
                                                            ERROR: line 21
                                                            ---------------------------
                                                            Non-active variant accessed
                                                            ---------------------------
                                                            ОК   
                                                            ---------------------------
                                                            Ответить
                                                  • Старина Дейкстра и в страшном сне представить себе не мог, что в 2019 году люди будут писать на языках, у которых вовсе нет формальной спецификации.

                                                    Как писал Ларри Вол: "Конечно, у перла есть спецификация: она лежит в файле perl.y"
                                                    Ответить
                                                  • В нашем случае, однако, есть повод бить тревогу, поскольку на протяжении последних десятилетий разрыв между информатикой и практическим использованием компьютеров только расширился. В то время как информатика делала большие шаги к превращению в строгую, точную науку, компьютерная практика в основном пребывала в застое. Я не преувеличиваю: физики до сих пор убеждены, что FORTRAN - последнее слово в информатике, химики продолжают использовать BASIC, и COBOL стал для бакалавра тем же, что и APL для инженера-электронщика. Человеческая склонность привязываться к источнику своих бед зарекомендовала себя как важный стабилизирующий фактор во многих браках и религиях, однако из-за своей болезненной склонности к неадекватным инструментам эти дисциплины переступили черту, за которой им уже не помочь.


                                                    Сказано за много лет до PHP, JSON, JavaScript, и прочих MySQL
                                                    Ответить
                                                  • >Вирт про язык Ада: «Слишком много всего вываливается на программиста. Я не думаю, что, изучив треть Ады, можно нормально работать

                                                    >Вирт не имеет никакого отношения к языку Ада, он его даже критиковал за сложность.

                                                    Он просто modern С++ не видел.
                                                    Ответить
                                                    • Как раз таки изучив треть C++ можно нормально работать, а вот если изучить больше может и крышечка поехать.

                                                      Интересно, какую часть от плюсов занимает Си.
                                                      Ответить
                                                      • Я бы даже больше сказал: 80% программистов на C++ знают менее 20% С++
                                                        Ответить
                                                        • Именно поэтому я за «PHP».
                                                          Ответить
                                                          • Хурозвоз, у тебя какой основной изык на работе?
                                                            Ответить
                                                            • Русский матерный.
                                                              Ответить
                                                              • А пргармирвоня?
                                                                Ответить
                                                                • up
                                                                  Ответить
                                                                  • Мне иногда кажется что Иканус -- препод в каком-то вузе.
                                                                    Неплохое знание "pascal", "assembler" и "c" в купе с отсутствием ссылок на реальные компании наводит на такие мысли, но я хз
                                                                    Ответить
                                                          • 80% программистов на PHP не являются программистами
                                                            А остальные 22% -- тоже
                                                            Ответить
                                                            • 100% пользователей "PHP" - это пользователи (функция call_user_func() не даст соврать). А по профессии они - операторы шаблонизатора.
                                                              Ответить
                                                        • Какой анскилл )))
                                                          Ответить
                              • Понял, автовывод типа и тут же проверка.

                                Для строк в стандартном Паскале был костыль: промежуточные выражения считались в типе string[255] вне зависимости от того, какой тип имели входящие в выражение переменные. Лишь при присвоении результата вычислений переменной тип усекался.

                                В «Турбо Паскале» добавили PChar, у которого были те же проблемы, что и у сишки: за выделением памяти и проверкой индекса должен был следить программист, поэтому пользоваться этим типом было опасно.

                                В «Delphi» появились динамические строки (AnsiString, WideString). Реалокацией их занимался рантайм, размер их не ограничивался.

                                С операциями над массивами всё плохо. Конкатенировать их знаком «+» нельзя. Строки можно. Объединение множеств считать знаком «+» можно. А вот массивы нельзя.

                                В FPC, правда, добавили перегрузку операторов:
                                https://freepascal.org/docs-html/current/ref/refse100.html
                                Можно перегружать даже ** и ><, которых не было в классическом Паскале.

                                Функцию конкатенации массивов в RTL не нашёл, зато слайс в FPC всё-таки сделали:
                                https://freepascal.org/docs-html/current/rtl/system/slice.html

                                Пример:
                                Program Example113;
                                
                                { Program to demonstrate the Slice function. }
                                
                                procedure ShowArray(const A: array of Integer);
                                var
                                  I: Integer;
                                begin
                                  for I := Low(A) to High(A) do
                                    WriteLn(I, ' : ', A[i]);
                                end;
                                
                                begin
                                  ShowArray(Slice([1,2,3,4],2));
                                end.


                                Обрати внимание, что функции Low и High вычисляются от массива, который вернула функция Slice. Т. е. функция Slice возвращает массив корректного типа с явным диапазоном индексов.
                                Ответить
                                • >функция Slice возвращает массив корректного типа с явным диапазоном индексов.

                                  It returns an array with the same element type as A, but this array is not assignment compatible to any other array, and can therefor only be used in open array arguments to functions.

                                  Ну костыльно как-то.
                                  Ответить
                                  • Да, с присвоением массивов всё плохо:
                                    var
                                        x: array[-5..5] of integer;
                                        y: array[-5..5] of integer;
                                    begin
                                        x:=y; {можем обломаться, поскольку x и y для компилятора имеют разный тип}
                                    end.


                                    А так работает:
                                    type massiv = array[-5..5] of integer;
                                    var
                                        x: massiv;
                                        y: massiv;
                                    begin
                                        x := y; {x и y имеют тождественные типы}
                                    end.
                                    Ответить
                                    • > x:=y; {можем обломаться, поскольку x и y для компилятора имеют разный тип}

                                      Потому я против «Паскаль».

                                      Много проверок практичекой пользы не дают, реальные баги не отлавливают, а только заёбывают программиста ошибками компиляции. Реально полезные концепты пока так и не доведены до ума.

                                      Люди отчаиваются и начинают учить кресты.
                                      Ответить
                                    • Ну все правильно, зачем ты явно не сделал для них общий тип?

                                      Тебе, мож, утиную типизацию завезти? а? а?

                                      В жабе к примеру тоже нельзя кастануть Foo к Bar даже если у них одинаковые поля
                                      Ответить
                                      • >зачем ты явно не сделал для них общий тип?
                                        Ээээ. У них и так общий тип array.

                                        >В жабе к примеру тоже нельзя кастануть Foo к Bar даже если у них одинаковые поля
                                        Аналогия неверная.

                                        Array55 и Array<Five,Five> можно кастануть в другой Array<Five,Five>.

                                        class Array55 extends Array<Five,Five>
                                        Ответить
                                        • Мне видится, что у них так
                                          class MyArray1 extends Array<5,5>{}
                                          class MyArray2 extends Array<5,5>{}


                                          т-есть новый тип декларируется, хоть и не явно
                                          Ответить
                                          • В любом случае в Жабе их хотя бы можно привести к общему предку Array<5,5>.
                                            А в Паскале, как я понял полученный массив можно передать только как open array, что аналогично Array<?,?>

                                            Хуйня какая-то. Вроде и хотели как лучше, а получается как обычно.
                                            Ответить
                                            • твоя правда, хотя присвоить и не получится)

                                              А в плюсах же можно так
                                              template<typename T> class MyArray{
                                              	T foo;
                                              };
                                              
                                              typedef class MyArray<int> P;
                                              typedef class MyArray<int> Q;
                                              
                                              
                                              int main() {
                                              	P p;
                                              	Q q;
                                              	p = q;
                                              	return 42;
                                              }

                                              ?

                                              кажется, что да.

                                              емплейт инстанциируется один раз?
                                              Ответить
                                • > Можно перегружать даже ><
                                  А оператор (>﹏<) можно?
                                  Ответить
                                  • Блин, а ведь в том же свифте можно нарожать таких операторов, а потом писать сценарии для аниме:

                                    +_+ "I died"
                                    >_< "GTFO"
                                    ~_- "You name it"

                                    Лень проверять, но вроде и запрещённых символов тут нет
                                    Ответить
                                    • Напомнило:
                                      https://metacpan.org/pod/distribution/perlsecret/lib/perlsecret.pod
                                      Ответить
                                      • оператор сперма
                                        оператор гоатсе

                                        блядь, что они курят?
                                        Ответить
                                        • Сперма это какой?
                                          Ответить
                                          • Kite
                                            ~~<>

                                            Discovered by Philippe Bruhat, 2012. (Alternate nickname: "sperm") Incompatible with "The 'bitwise' feature" in feature introduced in Perl 5.028.
                                            Ответить
                                            • P.S. Вообще мне кажется, что «Perl» не предназначен для того, чтобы на нём писать программы. Он предназначен для решения головоломок вроде поиска очередного комбинированного оператора типа «гоатсе».
                                              Ответить
                                              • > программы

                                                Скрипты для разбора логов и т.п. на нём норм получаются. А для программ - да, говно.
                                                Ответить
                                              • Вполне нормально на нем писать легковесные, простые скрипты>

                                                Серьезные программы писать на скриптовом языке это всгеда говно.
                                                Ответить
                                        • Самое смешное, что коллекция «секретных» операторов началась с того, что сам Ларри в своём языке открыл оператор @{[ ]} .
                                          Ответить
                                    • <?_?> "I don't have to know the language for gays, translate into &quot;PHP&quot;"
                                      Ответить
                                      • Sure dude, I do not speak PHP since I do not have to understand language for morons
                                        Ответить
                                        • That's why I prefer "PHP".
                                          Ответить
                                          • The word moron, along with others including, "idiotic", "imbecilic", "stupid", and "feeble-minded" is used actively to describe people who use PHP and/or MySQL on daily basis
                                            Ответить
                                            • Нейронку научили искать на картинке палец

                                              https://pointerpointer.com/

                                              Теперь вы можете увидеть множество некрасивых американцев
                                              Ответить
                                            • Moroni, according to the Book of Mormon, was the last Nephite prophet, historian, and military commander who lived in the Americas in the late fourth and early fifth centuries. He is later known as the Angel Moroni, who presented the golden plates to Joseph Smith, who translated the plates upon which the Book of Mormon was originally written.

                                              Скажите после этого, что американцы не тупые. Выдумали религию, в которой надо поклоняться пророку Моронию.
                                              Ответить
                                              • Ангел Идиотий подарил Иосифу Кузнецову золотые тарелочки, а чем прославился ты?
                                                Ответить
                                                • Зарегистрировал на «Говнокоде» typical PHP user'а, а именно юзера под ником «moron».
                                                  Ответить
                                            • D:\WIN2K\PRIVATE>grep -i -R --include=*.C* moron .
                                              ./SHELL/BROWSEUI/ITBAR.CPP:            // should be fixed in the apps themselves.  Morons!
                                              ./SHELL/COMCTL32/IMAGE.C:        // some morons (visual test)
                                              ./SHELL/EXT/FTP/FTPDROP.CPP:    We have to do this only because Exchange is a moron.
                                              ./SHELL/EXT/TWEAKUI/CONTROL.C:                     *  Lots of morons forget to set the language properly,
                                              ./SHELL/SHDOC401/UNICPP/DESKTOP.CPP:            // We are morons.  We changed the IDeskTray interface between IE4
                                              ./SHELL/SHDOC401/UNICPP/DESKTOP.CPP:                // We are morons.  We changed the IDeskTray interface between IE4
                                              ./SHELL/WIN16/COMMCTRL/TOOLBAR2.C:                // ... morons ... jeffbog 9/13/96
                                              Ответить
                              • У тебя строгие типы отклеились, в пассале такокое нельзя.
                                Ответить
                        • https://ideone.com/bZ0TqP

                          Проблема Паскаля в том что он ловит только детские ошибки.

                          А программа, немного сложнее лабы приводит к тем же проблемам что и в сишке.

                          Обычно массив адресуют переменными. Переменная может прийти аргументом из других функций.
                          Ответить
                          • Runtime error 201 — рантайм поймал выход за границу диапазона. Системный обработчик ошибок можно перекрыть своим, который определит, какая функция вызвала аварийную ситуацию, и примет меры.

                            Если скомпилировать с {$R-}, то будет как в сишке: засрётся вся память программы, а об ошибке мы узнаем, только когда ОС убьёт программу за то, что она полезла в чужую память.
                            Ответить
                            • >Runtime error 201 — рантайм поймал выход за границу диапазона.

                              А хочется компайл-тайм, как в первом примере.
                              Потому и говорю: мысль хорошая, реализация детская.
                              Ответить
                              • Понял, оптимизатор слабый. Очень слабый. Он не умеет детектировать тавтологию.

                                Кстати, про тавтологию:
                                http://govnokod.ru/25867
                                Ответить
                                • Моя мысль такова: нужно чтоб массивы в качестве индекса принимали не размытый integer, а вышеупомянутый subrange. С чего и началась вся дискуссия. (это и есть ответ гостю8, а нахера они вообще нужны )

                                  type array_index = 0 ... 9;

                                  Тогда я y не смогу записать хуйню, и код не скомпилится.
                                  Ответить
                                  • Питух, ты хоть один реальный пример можешь привести, а не синтетическую теоретико-парашу?

                                    // не гость, начавший дискуссию
                                    Ответить
                                  • {$R+}
                                    type array_index = 0 .. 9;
                                    var x: array_index;
                                    begin
                                     x := 10;
                                    end.


                                    https://ideone.com/jaemPr
                                    Ответить
                                    • Правильно.

                                      Осталось научить Паскаль принимать в качестве индекса для array [a..b] только числа типов subrange a..b, плюс те что можно к ним привести.

                                      То есть array [0..100] может принимать на вход 0..100 или 10..50.

                                      Но не может использовать переменную типа byte, который де-факто является 0..255 или например -5..5.

                                      Поскольку тогда в рантайме программа развалится.

                                      Иными словами компилятор, встретив код

                                      var x: array[0..9] of byte;
                                      var z:0..5;
                                      var y:integer;
                                      x[z] := 42; //ok
                                      >>x[y] := 42; //здесь должен плеваться и говорить, что ты делаешь, гад
                                      Ответить
                                      • В выражении x[y] игрек является не переменной (lvalue), а выражением (rvalue). Как lvalue здесь выступает только x или x[y] целиком. Ну это примерно как мы бы написали x[func(y)] := 42, где func в данном случае — функция тождественного отображения.

                                        Проблема в том, что в Паскале нет интервальной арифметики. Он не может посчитать, чему будет равна func от диапазона.

                                        Да, нам очевидно, что если y:integer (который равен диапазону -MAXINT-1..MAXINT или как там), то и у тождественного отображения игрека будет тот же диапазон значений. Осталось научить этому компилятор.
                                        Ответить
                                      • Тогда придется уйти в окамл сделать как-то так (пишу на псевдокоде)

                                        Function StringToInt<T: Integer>(s:String) returns T;
                                        
                                        Type IQ = 1..10 of Integer;
                                        
                                        Var iq: IQ;
                                        
                                        iqOrError := StringToInt('100500');
                                        {понимает, что тут не int, а IQ}
                                        
                                        case Type(iqOrError) of
                                            Success: WriteLn('iq is ', iqOrError.iq);
                                            Error: {bye}
                                        end


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

                                          Это всё IO. Для него есть 400 код или ошибка ввода.
                                          Но даже тут нам не придётся каждый раз проверять рейндж руками, писать ассерты и кидать исключения.

                                          Главное — быть уверенным что алгоритм не вылазит за пределы буфера.
                                          Ответить
                                          • Мне кажется, необязательно для всего этого писать новый язык с мощным компилятором и поддержкой зависимых типов.

                                            Можно просто придумать более лучший IDL и положиться на силу кодогенереции
                                            Ответить
                                    • Опять синтетическая хуита, реально будет вот так:

                                      https://ideone.com/8iOfto
                                      Ответить
          • Малость переводить говно с симпатичного язычка на говёный.
            Ответить
    • Уважаемый Хуй!

      1. Используете-ли вы менежэер пакетов "LuaRocks"?
      2. ИСпользуете-ли вы "strict" для повышения качества кода?
      Ответить
    • Причем тут я? Не я же к тебе ехать собрался
      Ответить

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