- 001
- 002
- 003
- 004
- 005
- 006
- 007
- 008
- 009
- 010
- 011
- 012
- 013
- 014
- 015
- 016
- 017
- 018
- 019
- 020
- 021
- 022
- 023
- 024
- 025
- 026
- 027
- 028
- 029
- 030
- 031
- 032
- 033
- 034
- 035
- 036
- 037
- 038
- 039
- 040
- 041
- 042
- 043
- 044
- 045
- 046
- 047
- 048
- 049
- 050
- 051
- 052
- 053
- 054
- 055
- 056
- 057
- 058
- 059
- 060
- 061
- 062
- 063
- 064
- 065
- 066
- 067
- 068
- 069
- 070
- 071
- 072
- 073
- 074
- 075
- 076
- 077
- 078
- 079
- 080
- 081
- 082
- 083
- 084
- 085
- 086
- 087
- 088
- 089
- 090
- 091
- 092
- 093
- 094
- 095
- 096
- 097
- 098
- 099
- 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
?
какая трудолюбивая мартышка писала)
так для КАЖДОЙ переменной?!
ахахаха, какая трудолюбивая макака писала
В луа 100500 способов есть серализовать таблицу.
Нужно сделать таблицу настроек, и течь, это и быстрее и правильнее, и удобнее.
Кашу из "логики", ui и сохранения файлов оставим за скобками
Но я все в рот ебал. Я сделал более лаконичную и по моему мнению правильную реализацию квестов - это через таблы и все это лоадить и тупо по индексам переходить и лоадить по мере необходимости и отрубать то что не нужно, а не все дерьмо держать в ОЗУ.
Чем так
Всё что восточнее Сибири - Китай.
Доступ к информационному ресурсу ограничен на основании Федерального закона от 27 июля 2006г. №149-ФЗ "Об информации, информационных технологиях и о защите информации".
Тут ещё надо оптимизировать код: заменить двойные кавычки на одинарные. Но я думаю, ты сам справишься.
http://govnokod.ru/25520#comment471813
Заметь, Winter в этом примере — это даже не сабрендж, это произвольное подмножество.
https://mail.python.org/pipermail/python-dev/2000-August/008881.html
Офигеть. С создания языка SETL прошло больше 50 лет.
Хорошая попытка, но учебный это всё таки твой Пассаль. И это подтверждается постоянными проёбами, отсутствием каких либо стандартов и полной потерей рынка.
Главная мысль в Обероне — это gc.
Который потом стал повсеместным явлением.
>У нас есть type, а значит class, struct, хуют, итд -- это булщит.
Всё правильно говорил.
Но в нём было заложено много годных идей.
Например писать тип после переменной, а не до. Или не делать из языка С++0z.
>почему сабренджей нигде нету?
Вот поскольку их нету, то в 2к19 у нас либо либо bounds checking, либо buffer overflow.
Сабренджи — нормальная задумка.
Проблема что в паскале они сделаны на детском уровне, потому пользы от них особой нету.
А нужно так, чтоб любое обращение к строке/массиву по индексу, принимало только subrange [0..length-1].
Допустим есть имя пользователя, длина 1-32 символа.
Это String[1..32] (синтаксис условный, в крестошаблонах String<1,32>).
Например пароль: String[8..32].
Пустая строка String[0..0]
Строка фиксированного размера, например хеш-функция, возвращающая md5:
Тогда конкатенация плюсом даёт сложение нижней и верхней границ. Конкатенация коммутативна: от перестановки строк местами тип не меняется.
Взятие подстрок проверяется в компайл-тайме. Индексы — те самые диапазоны.
Да, тут компилятор автовыведет тип хранилища (в данном случае он положит результат в байт, а не в интеджер).
Сишнику же придётся считать размер хранилища самому (считать двоичный логарифм и округлять в большую сторону).
Вот, например, переменная принимает значения от -9000 до +100500. В какой тип её класть? Придётся держать в уме лимиты int8_t, int16_t, int32_t, int64_t. Мы же не дураки и не будем использовать short int, int, long int, long long int, которые на разных платформах будут разными?
Тут поймали ошибку ещё во время компиляции.
А теперь пример посложнее:
Тут во время выполнения срабатывает проверка:
Компилятор добавил отладочную информацию, которую потом вывел в сосноль дефолтный обработчик исключения.
Компания «Borland» же в него добавила конструкции из «Модулы» и из языка Ада, получив в итоге довольно мощное средство и сохранив строгость, но при этом не дойдя до перегруженности языка Ада. «Object Pascal», на котором основаны «Турбо Паскаль», «Delphi», «Free Pascal» и несколько тупиковых ветвей, можно рассматривать как отдельный язык программирования.
>> struct
Есть record. Но само слово «record», в отличие от сишного «struct», не нужно писа́ть постоянно, так как его можно использовать только в тайпдефах (слово «type» в «Паскале»).
>> class
В «Standard Pascal» вообще не было ООП. В «Турбо Паскале» появилось слово «object», а в «Delphi» и слово «class» (разница между «object» и «class» в хранилище и в устройстве ТВМ).
Например в раздутом синтаксисе, бойлерплейте и уебанских, неконсистентных циклах.
Для сравнения божественные циклы из Сишки
Для сравнения восхитительный синтаксис циклов из Бейсика:
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
for в паскале неюзабелен чуть менее чем полностью.
Лучше бы он сразу сделал for~each по диапазонам, массивам и остальному добру.
>Do ... loop изначально не было в «Бейсике».
Да. Но сделали ведь просто и консистентно. Один синтаксис на все случаи жизни.
Там кстати ещё было Do Until x ... Loop, Do ... Loop Until x что на мой вкус уже излишество, но то такое.
Вообще согласен, что for i:=1 to 3 — это архитектурное излишество для языка, в котором есть диапазоны и множества. Если уж ввели их, то надо их использовать повсюду.
С тем, что совсем неюзабелен, не соглашусь. У него верхняя граница счётчика вычисляется один раз, а не каждую итерацию, как в сишке. Поддерживаются break и continue. Пользоваться можно.
Но вот что нужно писать for x:= Low(range) to High(range) вместо for x in range, это, конечно, плохо.
В Паскале две проверки: в компайлтайме (когда индекс принимает очевидное значение) и в рантайме. В TP проверка в рантайме регулируется директивой $R+, в компайлтайме же проверка всегда.
Массивы в Паскале изначально были статическими, поэтому проблем с проверкой не было (динамические появились в поздних поделках вроде «Delphi» и «Free Pascal»). В Паскале нельзя обратиться к несуществующему элементу массива.
Что же касается строк, то у паскалевских строк две длины: объявленная (которую превышать нельзя, ибо реалокатора нет) и текущая. Выход за объявленную длину проверяется. Выход за текущую, увы, нет.
Вот я и говорю что там всё по-детски просто.
Но сама концепция проверять в compile-time хорошая и правильная.
Паскаль же подобное даже не даст скомпилировать:
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).
Вот я и хочу иметь в языке, который пишет в эту базу автоматические проверки введённых данных.
Чтобы не заинсертить данные, которые потом автообрежутся.
Я не хочу на каждое поле каждый раз городить новый тип и в нём руками проверять длины. ЯП обеспечить мне подобного механизма не может.
В компайл-тайме будет проверяться что я не запихнул в строку больше положенного.
Допустим я написал алгоритм расчёта хеша от пароля, если он будет больше 64 символов, компилятор скажет мне где я ошибся.
Ввод от пользователя будет кидать ему ошибку в рантайме, но и тут есть профит, мне не придётся на всякий раз писать:
Эти ошибки будет генерировать язык, так же, как например при парсинге чисел.
Здесь атрибут 'Last — индекс последнего элемента строки, а поскольку 'First для строки всегда равен единице, то 'Last равен длине.
Не зря Тарас её хвалил
Почитал за контракты-предикаты. 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++.
Выводит:
Седьмая строка — это та, в которой y: MoyaStroka := "short";
Тут компилятор видит, что мы игреку пытаемся присвоить значение короче 10 символов. Правда, выводит ворнинг, а не еррор.
Я почему-то думал, что длину можно использовать только в динамическом предикате. Оказывается, в языке Ада атрибуты — это не совсем функции, они могут проверяться и в компайлтайме.
Даже динамический предикат лучше, чем обычный assert: его не нужно писать руками для каждой переменной при каждом присвоении, достаточно один раз описать субтип.
Кстати, статический предикат, если не поймал ошибку во время компиляции, всё равно сгенерирует ассерт, если есть директива pragma Assertion_Policy (Check);
И динамический предикат тоже может вывести ворнинг во время компиляции, если выражение вычислимо в компайлтайме (что-то типа констэкспра):
Правда, жалко, что и Static_Predicate, и Dynamic_Predicate во время компиляции выводят всего лишь ворнинг, а не ошибку.
Дейкстра про язык Ада: «Если Ada собирается выдать стандарт, желательно, чтобы он был недвусмысленно документирован. По меньшей мере две группы попытались сделать это; в результате обе выдали около 600 страниц формального текста. Это гораздо больше, чем необходимо, чтобы удостовериться в невозможности хотя бы твердо установить, что оба документа определяют один и тот же язык. Ошибка очевидной неуправляемости этих двух документов кроется не в двух группах, составивших их, не в принятом ими формализме, а лишь в самом языке: сами не обеспечив формального определения, могут ли его разработчики скрыть, что они предлагают неуправляемого монстра. То, что Ada уменьшит проблемы программирования и увеличит надёжность наших разработок до приемлемых границ, — это лишь одна из тех сказок, в которые могут поверить только люди с военным образованием».
То Вирт возмутился что его идею зашкварили сишкоблядским синтаксисом.
Не надо так говорить, например Чаке Мур'иканец придумал язык Forth.
Он тут недавно на встрече фортеров хвастался, что придумал очередной диалект colorForth'а и научился многопоточно рисовать звездно-полосатый флаг под вендой.
https://www.youtube.com/watch?v=3ML-pJFa8lY
В «Standard Pascal» по идее вариант должен проверяться, но я не знаю живых реализаций стандартного Паскаля. Придётся стряхивать с них пыль и проверять.
«Турбо Паскаль» и «Free Pascal» спокойно разрешают лазить в поле usesTypeScript, даже когда выбран вариант language = PHP. Всё, как в сишном union'е.
Беру «Irie Pascal». Производитель обещает совместимость со «Standard Pascal (i.e. ISO/IEC 7185)». Компилирую, запускаю... Рантайм на втором вызове Dure останавливает программу с сообщением:
>Вирт не имеет никакого отношения к языку Ада, он его даже критиковал за сложность.
Он просто modern С++ не видел.
Интересно, какую часть от плюсов занимает Си.
Для строк в стандартном Паскале был костыль: промежуточные выражения считались в типе 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
Пример:
Обрати внимание, что функции Low и High вычисляются от массива, который вернула функция 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.
Ну костыльно как-то.
А так работает:
Потому я против «Паскаль».
Много проверок практичекой пользы не дают, реальные баги не отлавливают, а только заёбывают программиста ошибками компиляции. Реально полезные концепты пока так и не доведены до ума.
Люди отчаиваются и начинают учить кресты.
Ээээ. У них и так общий тип array.
>В жабе к примеру тоже нельзя кастануть Foo к Bar даже если у них одинаковые поля
Аналогия неверная.
Array55 и Array<Five,Five> можно кастануть в другой Array<Five,Five>.
class Array55 extends Array<Five,Five>
А в Паскале, как я понял полученный массив можно передать только как open array, что аналогично Array<?,?>
Хуйня какая-то. Вроде и хотели как лучше, а получается как обычно.
https://cppinsights.io/s/3dce3a9a
А оператор (>﹏<) можно?
+_+ "I died"
>_< "GTFO"
~_- "You name it"
Лень проверять, но вроде и запрещённых символов тут нет
https://metacpan.org/pod/distribution/perlsecret/lib/perlsecret.pod
Discovered by Philippe Bruhat, 2012. (Alternate nickname: "sperm") Incompatible with "The 'bitwise' feature" in feature introduced in Perl 5.028.
Скрипты для разбора логов и т.п. на нём норм получаются. А для программ - да, говно.
Скажите после этого, что американцы не тупые. Выдумали религию, в которой надо поклоняться пророку Моронию.
Проблема Паскаля в том что он ловит только детские ошибки.
А программа, немного сложнее лабы приводит к тем же проблемам что и в сишке.
Обычно массив адресуют переменными. Переменная может прийти аргументом из других функций.
Если скомпилировать с {$R-}, то будет как в сишке: засрётся вся память программы, а об ошибке мы узнаем, только когда ОС убьёт программу за то, что она полезла в чужую память.
А хочется компайл-тайм, как в первом примере.
Потому и говорю: мысль хорошая, реализация детская.
Кстати, про тавтологию:
http://govnokod.ru/25867
type array_index = 0 ... 9;
Тогда я y не смогу записать хуйню, и код не скомпилится.
https://ideone.com/jaemPr
Осталось научить Паскаль принимать в качестве индекса для array [a..b] только числа типов subrange a..b, плюс те что можно к ним привести.
То есть array [0..100] может принимать на вход 0..100 или 10..50.
Но не может использовать переменную типа byte, который де-факто является 0..255 или например -5..5.
Поскольку тогда в рантайме программа развалится.
Иными словами компилятор, встретив код
Проблема в том, что в Паскале нет интервальной арифметики. Он не может посчитать, чему будет равна func от диапазона.
Да, нам очевидно, что если y:integer (который равен диапазону -MAXINT-1..MAXINT или как там), то и у тождественного отображения игрека будет тот же диапазон значений. Осталось научить этому компилятор.
На той стороне могут вообще ничего не знать про эти ваши ренжи.
Это всё IO. Для него есть 400 код или ошибка ввода.
Но даже тут нам не придётся каждый раз проверять рейндж руками, писать ассерты и кидать исключения.
Главное — быть уверенным что алгоритм не вылазит за пределы буфера.
Можно просто придумать более лучший IDL и положиться на силу кодогенереции
https://ideone.com/8iOfto
2. Что такое стрикт? https://www.yamaha.com/products/en/network/techdocs/others/lua/strict_lua/