Snusmumriken
И то что ты реагируешь на слово "winapi" - тоже странно. Про него просто слышали практически все, и давать пример с ним - рационально. А ты что? Все вокруг должны быть мегалинуксоидами и пользоваться только осью богов, поплёвывая на вендо-унтерменьшей? ))
Roman
Кау bsdшники поплёвывают на линуксоидов? :-)
Roman
Таки шалом
Snusmumriken
Мм. Амига-боги поплёвывают на нище-bsd-шников )) (чтобы собрать нормальную амигу в наше время, нужно весьма неплохо вложиться)
Revertron
MS-DOS 6.22 - наше всё!
Snusmumriken
Да, кто не на досе - тот против нас и хочет нашей смерти! Убить их!
Mark ☢️
Таки шалом
Шалом хавер
Snusmumriken
Ох как бомбануло то
Бомбануло ммм)
Ivan
print ("Please, write num") local num = io.read () print ("Please, write num") local num1 = io.read () print ("Please, choose operator: +, -, *, /") repeat local operator = io.read () until operator == "+" or operator == "-" or operator == "*" or operator == "/" if operator == "+" then local res = num + num1 elseif operator == "-" then local res = num - num1 elseif operator == "*" then local res = num * num1 elseif operator == "/" then local res = num / num1 end print (res) Выдает nil Почему?
Ivan
Спасибо.
Ivan
И все ещё nil. Почитаю про io.read() подробнее, спасибо
Ilya
Решили же, что использовать 'n' - порочная практика.
Ilya
А еще советую научиться пользоваться luacheck... и форматировать код в читабельном виде.
Ivan
Спасибо, работает
Lucky
[достал боевые счёты, перекинул пару косточек в четвёртом разряде]
Snusmumriken
Хмм
Snusmumriken
Даже несмотря на то что вводятся строки, при арифметике производится неявное преобразование.
Snusmumriken
Ага. Сук, странно. Я всегда явно привожу, не люблю неявности.
ShadoWalkeR
Хех
ShadoWalkeR
Вообще в луа местами адок с областями видимости
Snusmumriken
Чем от питона отличается, за исключением того что в питоне надо писать global, а в луа - local?
Snusmumriken
Или ты про upvalue?
ShadoWalkeR
Я про то, что if создает новую область видимости и переменные внутри его объявленные как local вне исчезают
ShadoWalkeR
Вкупе с глобальностью по дефолту приходится объявлять её чуть выше)
Snusmumriken
Ну, просто такое "адовое" поведение, например, вполне нормально: function foo() local a = 0 return function() a = a + 1 return a end end bar = foo() print(a) --> nil for i = 1, 5 do print(bar()) end > 1 > 2 > 3 > 4 > 5
Snusmumriken
Глобальность по дефолту - напрягает до тех пор, пока ты неаккуратно забываешь написать local. Когда привыкнешь - отлично. Особенно потому что во всяких if-else всё становится замечательно видно.
Snusmumriken
Ну, типа слово local - точно определяет штуку определённому скоупу, и ты точно знаешь где оно и чему сопоставляется, типа "слово-маркер, которое для понятности".
Snusmumriken
Но если пишешь библиотеки - советую проверять, не наследил ли в глобал скоупе. Делается так: из _G ключи заносятся во временную табличку, запускается модуль, сравнивается с новым содержимым _G. Если туда добавились ключи-значения - значит наследил ))
Snusmumriken
А потом понимаешь, сколько мыслей хороших в голове, пока ты до него ползёшь среди ночи
ShadoWalkeR
А если серьезно кмк это сделано чтобы упростить компилятор и результирующий код. Проще код = быстрей выполнение
Snusmumriken
Не совсем. Таки тут на любой do-end мутится новый скоуп, и поиск всех переменных начинается с него. function foo(a, b) local d if a > b then -- искать ближайшую "c", -- если нет - в глобал скоупе объявить c = 10 elseif a < b then -- искать ближайшую d, она в скоупе местной функции d = 20 else -- скоупы проверять не нужно, сразу фигачим local e = 30 end end
ShadoWalkeR
Кстати, если я правильно понимаю, то убрав local у d она станет видимой везде?
ShadoWalkeR
Имею в виду и вне foo
Snusmumriken
Если там написать: function foo(a, b) d if a > b then ... ?
ShadoWalkeR
Ага
Snusmumriken
Не а, оно выдаст ошибку исполнения. Просто одиноко стоящие имена переменных - смерть, компилятор не понимает чего от него хотят. А вот d = 10 - норм.
Snusmumriken
Snusmumriken
Да, можно запретить глобалскоуп )) setmetatable(_G, {__newindex = error})
Snusmumriken
Какая красота ))
Snusmumriken
Ещё можно переопределить getmetatable и setmetatable на те, которые не дают производить данную операцию с _G, скрыть метатаблицу у _G и ещё кучу пакостей сделать. И вместо всех стандартных функций влепить прокси-таблицы, которые запрещают изменение стандартных вещей. И таким образом защитить интерпретатор от злодеев. Правда, вызовы стандартных вещей будут примерно в три раза медленнее, но чего только не сделаешь ради Безопасности. Антитерроризм, хуль.
ShadoWalkeR
Собственно так я и думал
Snusmumriken
ЗАПРЕЩЕНО ВСЁ ЗАПРЕЩЕНО ЗАКРОЙТЕ ОКНО И ПОДНЯВ РУКИ ПРИСЛОНИТЕСЬ ЛИЦОМ К СТЕНЕ
ShadoWalkeR
Просто в в том же ЯП видимость переменной всегда ограничена блоком где объявлена и вложенными блоками, если там не определяется переменная с таким же именем
Snusmumriken
В каком ЯП? Оно везде так в луях, если везде писать local )))
ShadoWalkeR
И такие танцы с бубном в виде local d; if... не нужны
ShadoWalkeR
#include <iostream> int main() { int a = 4; std::cout << "1:" << a << std::endl; if (true) { int a = 5; std::cout << "2:" << a << std::endl; } std::cout << "3:" << a << std::endl; if (true) { a = 5; std::cout << "4:" << a << std::endl; } std::cout << "5:" << a << std::endl; }
ShadoWalkeR
И выхлоп: 1:4 2:5 3:4 4:5 5:5
Snusmumriken
И да, в сишке/плюсах, вместо local, ты пишешь тип, например int. Это значит, "определить переменную int-типа", фактически, заместо local.
Snusmumriken
Уууу, я сам писал нано-парсеры, которые ничего не умеют, потому что большие обычно очень сложные и имеют стрёмные структуры.
Snusmumriken
#include <iostream> int main() { int a = 4; std::cout << "1:" << a << std::endl; if (true) { int a = 5; std::cout << "2:" << a << std::endl; } std::cout << "3:" << a << std::endl; if (true) { a = 5; std::cout << "4:" << a << std::endl; } std::cout << "5:" << a << std::endl; }
function main() local a = 4 print('1: '..a) if true then local a = 5 print('2: '..a) end print('3: '..a) if true then a = 5 print('4: '..a) end print('5: '..a) end main() 1: 4 2: 5 3: 4 4: 5 5: 5 То же самое же.
ShadoWalkeR
Пардон - давно на С++ не писал многое уже забыл
ShadoWalkeR
Вот в руби примерно такой же пример: def func1 b = 4 puts "Inner b:#{b}" end puts "Hello, world!" if true a = 5; puts "Inner a:#{a}" end puts "Outer a:#{a}" func1 puts "Outer b:#{b}"
ShadoWalkeR
Ну и собственно причина почему с if напутал: Error(s), warning(s): source_file.rb:17:in `<main>': undefined local variable or method `b' for main:Object (NameError) Hello, world! Inner a:5 Outer a:5 Inner b:4
Snusmumriken
А тут глобал-скоуп по дефолту?
ShadoWalkeR
Тут все несколько интересней
Snusmumriken
Тут нет скоупов, только поля объектов, да? ))
ShadoWalkeR
def func1 b = 4 puts "Inner b:#{b}" if true c = 6 puts "Inner inner с:#{с}" end puts "Inner outer c:#{c}" end puts "Hello, world!" if true a = 5; puts "Inner a:#{a}" end puts "Outer a:#{a}" func1 puts "Outer outer c:#{c}" puts "Outer b:#{b}"
ShadoWalkeR
Где упадет с ошибкой?😈
ShadoWalkeR
Error(s), warning(s): source_file.rb:6:in `func1': undefined local variable or method `с' for main:Object (NameError) from source_file.rb:19:in `<main>' Hello, world! Inner a:5 Outer a:5 Inner b:4
ShadoWalkeR
А, походу у меня там гдето русская с. Заменил на d: def func1 b = 4 puts "Inner b:#{b}" if true d = 6 puts "Inner inner d:#{d}" end puts "Inner outer d:#{d}" end puts "Hello, world!" if true a = 5; puts "Inner a:#{a}" end puts "Outer a:#{a}" func1 puts "Outer outer d:#{d}" puts "Outer b:#{b}"
ShadoWalkeR
Error(s), warning(s): source_file.rb:21:in `<main>': undefined local variable or method `d' for main:Object (NameError) Hello, world! Inner a:5 Outer a:5 Inner b:4 Inner inner d:6 Inner outer d:6
ShadoWalkeR
То есть тут if работает в области блока где он объявлен
ShadoWalkeR
Ничего
ShadoWalkeR
На жабе покодь
ShadoWalkeR
И на питоне
ShadoWalkeR
Они едят мозг не хуже
Sergey
Раби
Sergey
Жаба отвратна
ShadoWalkeR
Спасибо РКН за работу телеграмма
ShadoWalkeR
Мне то что хочешь доказать?
ShadoWalkeR
Я из принципа дома не пользуюсь прокси - интересно насколько продвинутся в своих желаниях. Иногда раздражает
ShadoWalkeR
Но сегодня у них обострение - уже раз 5 за вечер перезапускал
ShadoWalkeR
И считаешь жаву норм😂👍
Sergey
Лол
Sergey
Есть пхп
Sergey
Как раз стереотип
Sergey
Вот это