Метатабличный / Говнокод #25987 Ссылка на оригинал

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
  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
  77. 77
  78. 78
  79. 79
  80. 80
  81. 81
  82. 82
  83. 83
  84. 84
  85. 85
  86. 86
  87. 87
  88. 88
  89. 89
  90. 90
  91. 91
  92. 92
  93. 93
  94. 94
  95. 95
  96. 96
  97. 97
  98. 98
  99. 99
  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 3oJIoTou_xyu, (Updated )

Комментарии (191) 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с. Ради лулзов в свободное время в геймдеве.
        Ответить
    • Перевёл начало (всё не влезает):
      <?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 проклянёт сразу
                Ответить
                  • Однако и питон и Ruby ничего подобного не имеют, ну им простительно: они скриптовые.

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

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

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

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

                      Всё правильно говорил.
                      Ответить
                    • Сейчас на руби кто-то пишет вообще?
                      Ответить
                  • Кстати, рендж есть и в 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 хорошая и правильная.
                  Ответить
                    • В божественной сишечке возможна детская ошибка:
                      char pituh[10];
                      pituh[10] = 42; /* выход за границу, потому что диапазон индексов 0..9 */

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

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

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

                          Ограничить минимальную длину строки нельзя. В языке Ада можно (там есть динамические предикаты, можно в качестве предиката взять неравенство для функции 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.
                                            Ответить
                                            • Вирт не имеет никакого отношения к языку Ада, он его даже критиковал за сложность.
                                              Ответить
                                              • Вирт про язык Ада: «Слишком много всего вываливается на программиста. Я не думаю, что, изучив треть Ады, можно нормально работать. Если вы не освоите всех деталей языка, то в дальнейшем можете споткнуться на них, и это приведёт к неприятным последствиям».

                                                Дейкстра про язык Ада: «Если 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% С++
                                                      Ответить
                                                        • Хурозвоз, у тебя какой основной изык на работе?
                                                          Ответить
                                                                • Мне иногда кажется что Иканус -- препод в каком-то вузе.
                                                                  Неплохое знание "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"

                                  Лень проверять, но вроде и запрещённых символов тут нет
                                  Ответить
                                    • оператор сперма
                                      оператор гоатсе

                                      блядь, что они курят?
                                      Ответить
                                        • Kite
                                          ~~<>

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

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

                                              Серьезные программы писать на скриптовом языке это всгеда говно.
                                              Ответить
                                      • Самое смешное, что коллекция «секретных» операторов началась с того, что сам Ларри в своём языке открыл оператор @{[ ]} .
                                        Ответить
                                    • Sure dude, I do not speak PHP since I do not have to understand language for morons
                                      Ответить
                                        • 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 — рантайм поймал выход за границу диапазона.

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

                                type array_index = 0 ... 9;

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

                                  // не гость, начавший дискуссию
                                  Ответить
                                  • Правильно.

                                    Осталось научить Паскаль принимать в качестве индекса для 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 и положиться на силу кодогенереции
                                          Ответить
        • Малость переводить говно с симпатичного язычка на говёный.
          Ответить
  • Уважаемый Хуй!

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

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

Где здесь C++, guest?!

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


    8