Jakowlew 11 Опубликовано: 12 марта, 2018 Brainfuck? Почему бы нет? Если вы не знаете, что это, то вот ссыль: https://ru.wikipedia.org/wiki/Brainfuck А вот и сам интерпретатор: https://pastebin.com/DVNbB7Rf Текущая версия: 1.0 Документация: -- Создать экземпляр интерпретатора -- Входной параметр - строка с brainfuck кодом b = bf:new("++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.") -- Запустить код -- Вовзращает строку с ошибкой, если она произошла b:run() -- Проверить код на валидность. Код валиден, если вовзращенное значение == 0 valid = b:validate() -- Получить строку с ошибкой, код которой вовзращает bf:validate() str = b:getError(valid) -- bf:run вызывает bf:validate() и bf:getError() внутри себя -- Поэтому не надо проверять код на валидность самостоятельно 6 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Totoro 3 494 Опубликовано: 12 марта, 2018 Надо теперь расширить до NetFuck. =) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Jakowlew Автор темы 11 Опубликовано: 12 марта, 2018 Надо теперь расширить до NetFuck. =) Ой как не хочется мучаться с сетью и параллельным выполнением. Я по фану написал за 20 минут интерпретатор brainfuck, чтобы запустить на нем интерпретатор brainfuck, написанный на brainfuck, а в нем еще один, и еще, и еще. А потом посмотрел, как это все работает, сказал себе "малаца" и запостил сюда Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
LeshaInc 611 Опубликовано: 12 марта, 2018 А теперь сделай JIT-компилятор. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
qwertyMAN 1 714 Опубликовано: 12 марта, 2018 Надо теперь расширить до NetFuck. =) @@Totoro надо теперь расширить до FuckTheSystem 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Jakowlew Автор темы 11 Опубликовано: 12 марта, 2018 А теперь сделай JIT-компилятор. Можно сделать транслятор в Си код, который потом компилируется, вопрос в том, насколько это надо. Код все же для опенкомпов писался Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Zer0Galaxy 2 119 Опубликовано: 14 марта, 2018 if errorCode == 0 then return "Code is valid" elseif errorCode > 0 then return "Error: Opening bracket(s) missing" elseif errorCode < 0 then return "Error: Closing bracket(s) missing" else return "Error: Unknown error" end Вспомнился анекдот: Если выпадет орел, идем пить пиво, если решка – идем в кино, а если монета встанет на ребро, то пойдем учиться. 4 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Totoro 3 494 Опубликовано: 14 марта, 2018 Чисто технически - там есть четвёртый вариант.Это когда errorCode содержит не число, а какой-нибудь boolean или вообще nil. Но в ветку "Unknown error" этот случай всё равно не попадёт, потому что Lua выбросит ошибку на попытке сравнить переменную с нулём. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Jakowlew Автор темы 11 Опубликовано: 14 марта, 2018 Чисто технически - там есть четвёртый вариант. Это когда errorCode содержит не число, а какой-нибудь boolean или вообще nil. Но в ветку "Unknown error" этот случай всё равно не попадёт, потому что Lua выбросит ошибку на попытке сравнить переменную с нулём. Разве? Вроде nil трактуется как ложное значение, и результат операций с ним будет всегда ложный, нет? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Fingercomp 4 277 Опубликовано: 14 марта, 2018 (изменено) Числовые операции (например, операторы <, >, +, *, ...) бросают ошибку, если скормишь им nil. Изменено 14 марта, 2018 пользователем Fingercomp Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
LeshaInc 611 Опубликовано: 14 марта, 2018 NaN не равен, не больше и не меньше любого числа. 2 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
ECS 1 613 Опубликовано: 14 марта, 2018 Все он правильно сделал, гипотетически четвертый вариант возможен: 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Jakowlew Автор темы 11 Опубликовано: 14 марта, 2018 Все он правильно сделал, гипотетически четвертый вариант возможен: Вот, спасибо. Я забыл. nil выкидывает ошибку, я имел в виду NaN. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Totoro 3 494 Опубликовано: 15 марта, 2018 (изменено) inf и nan это уже пятый вариант =)И с ними - да, проблем не будет. Проблемы будут если в код ошибки попадёт нечисловой тип, а-ля string.Но это я уже докапываюсь, исходя из гипотетического предположения, что автор кода решил сделать 100% покрытие всех возможных случаев. Изменено 15 марта, 2018 пользователем Totoro Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
evgkul 569 Опубликовано: 15 марта, 2018 Есть ещё метатаблицы... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Totoro 3 494 Опубликовано: 15 марта, 2018 Есть ещё метатаблицы... Но метатаблица в плане типов данных - просто table, разве нет? Это покрывается четвёртым случаем =) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Fingercomp 4 277 Опубликовано: 15 марта, 2018 Но метатаблица в плане типов данных - просто table, разве нет? Это покрывается четвёртым случаем =) В ней можно поведение при сравнении переопределять. if setmetatable({value = 4}, {__lt = function(self, other) return self.value < other end}) < 5 then print("It works, unexpectedly.") end 3 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах