• Python progr Начал потихоньку разбираться с python и наступил на грабли с областями видимости переменных. Не знаю, что там такого наворотили, но работают они не так, как в других языках
    И да, нет оператора инкремента ++!

Replies (14)

  • @Shura, да, и слова определяются не как в FORTH, и вообще функциями называются. Странный язык.
  • @Shura, Числа immutable, скорее всего поэтому сокращённого оператора нет. Облегчается это тем, что редко приходится счётчики руками инкрементить.
    А что за проблема у тебя с областями видимости?
  • @Renha, А что такое "слова"?
  • @kapsh, разобрался, сам дурак был. Однако есть нюанс — циклы типа for или while не создают новую область видимости. Это странно
  • @kapsh, ~ именованный код
  • @Shura, Не вижу в этом странного, но своя логика в этом есть — иначе приходилось бы объявлять заранее переменную, которая впервые вычисляется внутри цикла, только для того, чтобы она была видна после выхода из него.
  • @Renha, например объявим слово, предложенное ОПом, "++!"
    : ++! DUP @ 1 + SWAP ! ;
    проверим:
    VARIABLE a 1 a ! a @ .
    1 oka DUP ++! @ .
    2 ok
  • @kapsh, Нашёл в документации статью Execution model. Там пишут, что блок кода — это функция, тело класса или модуль. Скоуп переменной ограничен этим самым блоком.
  • @Renha, Ты вот на этом думаешь и ещё называешь питон странным?
  • @kapsh, Ну с комментариями было бы понятнее, но я поленился
  • @Renha, Нет, не было бы!
  • @kapsh, ну как, слово ":" начинает определение нового слова, имя которого следует за ним, ";" — заканчивает.
    : ++! ;добавит в словарь новое слово с именем "++!", не делающее ничего. После этого можно в любом месте писать ++! и будет происходить ничего.

    DUP — дублирует верхний элемент на стеке
    @ — получает на вход адрес переменной, возвращает её значение
    1 — кладёт на стек число 1
    + — складывает два верхних элемента на стеке, результат кладёт на стек
    SWAP — меняет местами два верхних элемента на стеке
    ! — принимает на вход значение и адрес переменной, записывает значение по этому адресу.

    : ++! DUP @ 1 + SWAP ! ;принимает на вход адрес переменной, дублирует его (карта стека: addr addr), потом получает значение и единицу добавляет (карта стека: addr newvalue), остаётся только сохранить значение, меняем местами аргументы и используем "!", всё.

    при проверке из нового у нас только слово VARIABLE, которое объявляет новую переменную с именем, следующим следом.
  • @Renha, язычок, уровнем чутка пониже среднего.
    задейфайнь макрос, макрос сам не задефайнится.
    макросы спасут мир от привета!