Snusmumriken
И то что ты реагируешь на слово "winapi" - тоже странно.
Про него просто слышали практически все, и давать пример с ним - рационально. А ты что?
Все вокруг должны быть мегалинуксоидами и пользоваться только осью богов, поплёвывая на вендо-унтерменьшей? ))
Roman
Кау bsdшники поплёвывают на линуксоидов? :-)
Roman
Таки шалом
Snusmumriken
Мм. Амига-боги поплёвывают на нище-bsd-шников ))
(чтобы собрать нормальную амигу в наше время, нужно весьма неплохо вложиться)
Revertron
MS-DOS 6.22 - наше всё!
Snusmumriken
Да, кто не на досе - тот против нас и хочет нашей смерти! Убить их!
Mark ☢️
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
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. Если туда добавились ключи-значения - значит наследил ))
ShadoWalkeR
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
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
Вот это