Форум программистов, компьютерный форум, киберфорум
Lua
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 5.00/11: Рейтинг темы: голосов - 11, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 11.02.2023
Сообщений: 15

Замыкания

11.02.2023, 02:42. Показов 3097. Ответов 28
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Объясните мне, пожалуйста, как работает сие произведение:

Lua
1
2
3
4
5
6
7
8
9
10
11
12
13
14
function iter()
  local i = 0
    return function ()
    i = i+1;
    print (i)
  end
  end
 
c = iter()
 
c()
c()
c()
c()
Напечатает поочерёдно 1, 2, 3, 4.

Ничего не понятно, но предположим, что интерпретатор просто сразу при входе в функцию вычисляет переменные, находит слово return и пытается его выполнить без тела функции...

Хорошо...

Добавим строчку:

Lua
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function iter()
  local i = 0
  print(i)
    return function ()
    i = i+1;
    print (i)
  end
  end
 
c = iter()
 
c()
c()
c()
c()
Она печатает кроме того, что уже делал, один раз "0" в самом начале!

Далее. Добавим ещё строчку.

Lua
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function iter()
  local i = 0
  print(i)
    return function ()
    i = i+1;
    print (i)
    return iter()
  end
  end
 
c = iter()
 
c()
c()
c()
c()
В этот раз она таки печатает каждый раз значение i, и оно тут разное!

В главной функции она, всё нормально, заходит в неё, резервирует ячейку памяти со значением 'i' и записывает туда 0. Печатает это значение. Потом она вызывает функцию дальше, где эта переменная не определена. Следовательно, эта функция должна считать её глобальной, начинает искать её там, где она встретится первой, поднимаясь постепенно уровень за уровнем. И по идее она должна поставлять для этой функции i со значением "0"! Но почему-то она подставляет значение, которое нигде не определено и хрен знает где в памяти под каким именем находится. И почему-то для внешней функции это значение i всегда 0, а внутренняя откуда-то его вытаскивает, неизвестно откуда.

Ну ладно, предположим она каким-то странным образом где-то это значение хранит. Тогда пытаемся извлечь его из этой программы. Дадим внутренней функции имя, пытаясь отследить её параметры.

Lua
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
function iter()
  local i = 0
  print(i)
    function fnc ()
    i = i+1;
    print (i)
    end
    return fnc ()
  end
  
 
c = iter()
 
c()
c()
c()
c()
И теперь она выдаёт нам ошибку! Позвольте, а как же раньше она работала и как-то откуда-то брала значения, а здесь она возвращает nil!

Ну и, наконец, вишенка на торте:

Lua
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
function iter()
  local i = 0
  print(i)
    function fnc ()
    i = i+1;
    print (i)
    return iter()
    end
    return fnc ()
  end
  
 
c = iter()
 
c()
c()
c()
c()
Вот тут я всё прекрасно понимаю, как всё рботает, автомат имеет два состояния и не имеет выходного, переменная i тут одна и та же, функции вызывают по очереди друг друга, одна функция увеличивает i на 1, вторая сбрасывает в 0 и это идёт в бесконечном цикле.

Я немного полистал книжку SICP, до этого начинал её читать, но забросил, потому что не было времени. Насколько я понял, это единственный нормальный учебник по функциональному программированию, где просто вот за ручку водят и объясняют, как работает программа на уровне считывания и записи в память, где она хранит это значение и под каким именем, по какому адресу. Например, в самой первой программе вообще непонятно, где лежит i, которое печатается, в неименованном поле каком-то? Как узнать адрес памяти, где лежит это значение? Пожалуйста, объясните мне, как это всё работает, очень не хочется снова читать SICP до конца, там больше 400 страниц и это будет долго...
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
11.02.2023, 02:42
Ответы с готовыми решениями:

ООП через замыкания
local tab = {} function tab.copy( src, dst ) if src then if not dst then dst = {} end for field, value in...

Замыкания
Напишите программу генератора чисел Фибоначчи используя замыкания. Вопрос: функция, допустим, описана, а где здесь замыкание...

CLISP построить транзитивное и рефлексивное замыкания
Всем привет. Помогите пожалуйста решить задачу: Дано бинарное отношение R. Построить транзитивное и рефлексивное замыкания R*.

28
 Аватар для vantfiles
1018 / 1921 / 177
Регистрация: 07.05.2013
Сообщений: 3,931
Записей в блоге: 12
15.02.2023, 18:06
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Curry Посмотреть сообщение
lua для микроконтроллеров бывает
да, я в курсе

https://ww1.microchip.com/down... oc1001.pdf
Предложите язык разработки.
0
Модератор
 Аватар для Curry
5171 / 3537 / 536
Регистрация: 01.06.2013
Сообщений: 7,701
Записей в блоге: 9
15.02.2023, 18:33
Цитата Сообщение от vantfiles Посмотреть сообщение
Предложите язык разработки.
C без вариантов.
1
 Аватар для vantfiles
1018 / 1921 / 177
Регистрация: 07.05.2013
Сообщений: 3,931
Записей в блоге: 12
15.02.2023, 18:56
Цитата Сообщение от Curry Посмотреть сообщение
C без вариантов.
Пишем прототип, не умещаемся в память программ. Что делаем?
0
0 / 0 / 0
Регистрация: 11.02.2023
Сообщений: 15
15.02.2023, 19:10  [ТС]
[quote="vantfiles;16755194"]огорчу
Цитата Сообщение от Evenlancelot Посмотреть сообщение
нет вложенных функций
есть
Они есть, но не используются. Потому что их можно вызвать только один раз, второй вызов родительской функции выдаст ошибку. Что автоматически ставит крест на использовании вложенных функций, как это делается в ФП. Я нашёл широко распространённый язык без ФП!
Цитата Сообщение от Evenlancelot Посмотреть сообщение
замыкание трактуется по другому
во всех языках это понятие трактуется одинаково
Тоже не совсем. Я должен явно указать use, чтобы переменная "замкнулась" внутри данной функции и не была доступна извне. И я буду чётко понимать такое замыкание, чем то, где какая-то переменная волшебным образом попала в другое замыкание уже в Lua и она по каким-то неочевидным причинам недоступна из внешней области. Тут я просто взял и указал при помощи use, что это замыкание и оно им стало. И я буду чётко знать, вот эта именно переменная здесь, которую я указал через use, будет использоваться именно как замыкание, потому что я этого сам так захотел.
Цитата Сообщение от Evenlancelot Посмотреть сообщение
можно использовать static и global
в данном контексте это вообще не при чем
Как раз причём. В данном контексте конкретно. Я бы написал здесь не всякие лямбды непонятные, а просто так:
PHP
1
2
3
4
function iter()
static $i = 0;
$i++;
return $i;
Функция делает то же самое, но в отличие от Lua это простой, понятный и читаемый код.

Цитата Сообщение от Evenlancelot Посмотреть сообщение
И востребован он достаточно широко!
сюда вот загляните https://www.tiobe.com/tiobe-index/
Не уверен, что даже по этому индексу у PHP какое-то менее популярное положение по сравнению с Lua.
0
Модератор
 Аватар для Curry
5171 / 3537 / 536
Регистрация: 01.06.2013
Сообщений: 7,701
Записей в блоге: 9
15.02.2023, 19:22
Цитата Сообщение от vantfiles Посмотреть сообщение
Пишем прототип, не умещаемся в память программ. Что делаем?
Не экономим на покупке компилятора. Бесплатные версии не оптимизируют.
0
 Аватар для vantfiles
1018 / 1921 / 177
Регистрация: 07.05.2013
Сообщений: 3,931
Записей в блоге: 12
15.02.2023, 19:44
Цитата Сообщение от Evenlancelot Посмотреть сообщение
Я нашёл широко распространённый язык без ФП!
Я уже писал о том, что Lua - не поддерживает ФП в явном виде.
А также писал о том, что в стиле ФП можно писать на любом языке.

PHP
1
2
3
4
function iter()
static $i = 0;
$i++;
return $i;
Lua
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
function iter( n )
  return
    function()
      if n > 0 then
        n = n - 1
        return n
      end
      return nil
    end
end
 
a = iter( 5 )
b = iter( 10 )
c = iter( 123 )
 
print( a(), b(), c() )
print( a(), b(), c() )
print( a(), b(), c() )
Добавлено через 1 минуту
Цитата Сообщение от Curry Посмотреть сообщение
Не экономим на покупке компилятора. Бесплатные версии не оптимизируют.
Компилятор куплен на деньги фирмы, 1000 прототипов изделия уже в производстве, что делаем?

Добавлено через 8 минут
Цитата Сообщение от Curry Посмотреть сообщение
Или исходники FreeRTOS
Вы даташит смотрели? 4К флеша.

Добавлено через 6 минут
FreeRTOS... давно с ней не работал...
Диспетчер системы очень прост и компактен (занимает, в зависимости от платформы и настроек ядра, 4-9 килобайт
1
Модератор
 Аватар для Curry
5171 / 3537 / 536
Регистрация: 01.06.2013
Сообщений: 7,701
Записей в блоге: 9
15.02.2023, 21:05
Цитата Сообщение от vantfiles Посмотреть сообщение
Вы даташит смотрели? 4К флеша.
Я должен был посмотреть даташит до того как вы кинули на него ссылку?
Цитата Сообщение от vantfiles Посмотреть сообщение
1000 прототипов изделия уже в производстве, что делаем?
Запустили в производство, а резерв памяти не предусмотрели? Настоящие эффективные менеджеры!
0
 Аватар для vantfiles
1018 / 1921 / 177
Регистрация: 07.05.2013
Сообщений: 3,931
Записей в блоге: 12
16.02.2023, 01:15
Цитата Сообщение от Curry Посмотреть сообщение
Я должен был посмотреть даташит до того как вы кинули на него ссылку?
ну зачем же...
Замыкания
Цитата Сообщение от Curry Посмотреть сообщение
Настоящие эффективные менеджеры!
Поэтому я оттуда и ушел.
0
Модератор
 Аватар для Curry
5171 / 3537 / 536
Регистрация: 01.06.2013
Сообщений: 7,701
Записей в блоге: 9
16.02.2023, 01:29
Цитата Сообщение от vantfiles Посмотреть сообщение
ну зачем же...
я помянул FreeRTOS в 20 ом сообщении, вы привели даташит в 21 ом а потом спрашиваете смотрел ли я даташит. Смотрел. В такой FreeRTOS не влезет, хотя для 18ых пиков я делал ОS с кооперативной многозадачностью и размером кода чуть больше 1K. На С.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
16.02.2023, 01:29

Лексические замыкания и рекурсия (ну или итерация)
Добрый день, All! продолжаю исследовать механизмы Lisp. возник вопрос, связанный с замыканием и ленивыми вычислениями. не могу...

Замыкания, и замыкания в объекте. Где данные?
Помогите пожалуйста разобраться где хранятся данные. Ниже 2 примера. В первом все вроде как понятно - Есть переменная counter которая...

Замыкания
Всем привет. Возникла проблема с замыканиями, так как вроде понимаю как работают, но не совсем понимаю, что от меня требуется в задании. ...

Замыкания
Доброго времени суток. Имеется такая задача на замыкания: Используя замыкания функций, объявите внутреннюю функцию, которая...

Замыкания и this
Здравствуйте. Вопрос таков: у меня есть две функции, по сути одинаковые геттеры, но при компиляции кода, функция, где мы возвращаем...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
29
Ответ Создать тему
Новые блоги и статьи
FPS контроллер с анимированными Y-Bot и 3D-звуком miniaudio (Box3D, Recast, BehaviorTree.CPP, ozz-animation, ImGui, OpenGL и SDL3)
8Observer8 18.10.2026
Содержание блога | English Version Полное мультиплатформенное руководство по стартовому проекту с FPS-контроллером игрока, анимированными роботами Y-Bot с 4-слойным блендингом, 3D-физикой Box3D,. . .
Локальный http сервер
Argus19 17.10.2026
Локальный http сервер На работе, на двух локальных компьютерах круглосуточно работают программы опроса приборов с записью в книги Excel,которые раз в сутки записываются на сервер компании. Т. к. . . .
Копировать Windows на новый диск на UEFI
damix 17.10.2026
https:/ / uriesk. wordpress. com/ 2016/ 11/ 01/ move-window-10-to-ssd-on-a-uefi-dualboot-system-with-basic-linux-tools/ TL DR Вставляем диск, а старый подключаем через переходник, грузимся с лайва. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru