Начал потихоньку разбираться с python и наступил на грабли с областями видимости переменных. Не знаю, что там такого наворотили, но работают они не так, как в других языках И да, нет оператора инкремента ++!
2017-07-03 07:54:18

Участники:
@kapsh - 6, @Renha - 6, @Shura - 1, @alex0b - 1

@Renha
да, и слова определяются не как в FORTH, и вообще функциями называются. Странный язык.
#2876268/1 2017-07-03 08:57:05
@kapsh
Числа immutable, скорее всего поэтому сокращённого оператора нет. Облегчается это тем, что редко приходится счётчики руками инкрементить. А что за проблема у тебя с областями видимости?
#2876268/2 2017-07-03 09:26:49
@Renha
+
#2876268/3 → /2 2017-07-03 09:27:03
@kapsh
А что такое "слова"?
#2876268/4 → /1 2017-07-03 09:28:30
@Shura
разобрался, сам дурак был. Однако есть нюанс - циклы типа for или while не создают новую область видимости. Это странно
#2876268/5 → /2 2017-07-03 09:28:37
@Renha
~ именованный код
#2876268/6 → /4 2017-07-03 09:29:05
@kapsh
Не вижу в этом странного, но своя логика в этом есть - иначе приходилось бы объявлять заранее переменную, которая впервые вычисляется внутри цикла, только для того, чтобы она была видна после выхода из него.
#2876268/7 → /5 2017-07-03 09:35:12
@Renha
например объявим слово, предложенное ОПом, "++!" : ++! DUP @ 1 + SWAP ! ; проверим: VARIABLE a 1 a ! a @ . > 1 ok a DUP ++! @ . > 2 ok
#2876268/8 → /6 2017-07-03 09:42:43
@kapsh
Нашёл в документации статью Execution model. Там пишут, что блок кода - это функция, тело класса или модуль. Скоуп переменной ограничен этим самым блоком.
#2876268/9 → /7 2017-07-03 09:43:18
@kapsh
Ты вот на /этом/ думаешь и ещё называешь питон странным?
#2876268/10 → /8 2017-07-03 09:45:40
@Renha
Ну с комментариями было бы понятнее, но я поленился
#2876268/11 → /10 2017-07-03 10:02:40
@kapsh
Нет, не было бы!
#2876268/12 → /11 2017-07-03 11:07:36
@Renha
ну как, слово ":" начинает определение нового слова, имя которого следует за ним, ";" - заканчивает. >: ++! ; добавит в словарь новое слово с именем "++!", не делающее ничего. После этого можно в любом месте писать ++! и будет происходить ничего. DUP - дублирует верхний элемент на стеке @ - получает на вход адрес переменной, возвращает её значение 1 - кладёт на стек число 1 + - складывает два верхних элемента на стеке, результат кладёт на стек SWAP - меняет местами два верхних элемента на стеке ! - принимает на вход значение и адрес переменной, записывает значение по этому адресу. >: ++! DUP @ 1 + SWAP ! ; принимает на вход адрес переменной, дублирует его (карта стека: addr addr), потом получает значение и единицу добавляет (карта стека: addr newvalue), остаётся только сохранить значение, меняем местами аргументы и используем "!", всё. при проверке из нового у нас только слово VARIABLE, которое объявляет новую переменную с именем, следующим следом.
#2876268/13 → /12 2017-07-03 11:35:42
@alex0b
язычок, уровнем чутка пониже среднего. задейфайнь макрос, макрос сам не задефайнится. макросы спасут мир от привета!
#2876268/14 → /13 2017-07-03 13:14:26