1 / 1 / 1
Регистрация: 19.07.2017
Сообщений: 13
1

Замыкание, или аргументы в функциях

22.07.2020, 23:00. Показов 2770. Ответов 5

Author24 — интернет-сервис помощи студентам
Lua
1
2
3
4
5
6
7
8
9
10
function prov(f,delta)
delta=delta or 1e-4
return function (x)
delta=delta+1e-4
return (f(x+delta)-f(x))/delta
end
end
c=prov(math.sin)
 
print(math.cos(5.2),c(5.2))
Вопросы:
1)В функции попадают аргументы по значению или по ссылке?
2)delta - локальная переменная, или глобальная? local - нужен?
3) в return function (x) аргументы залетают откуда? Есть код, где непонятно что за переменные и где они существуют:
Lua
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
function cached_EMA() 
local cache={} 
return function(ind, _p, v_t, kk)
local n = 0 
local p = 0 
local period = _p 
local v_type = v_t 
local index = ind 
local k = kk or 2/(period+1) 
if index == 1 then 
cache = {} 
end 
if index < period then 
cache[index] = average(1,index, v_type) 
return nil 
end 
p = cache[index-1] or dValue(index, v_type) 
n = k*dValue(index, v_type)+(1-k)*p 
cache[index] = n 
return n 
end 
end
объясните пожалуйста, что вызов этой функции будет делать. У нее нет аргументов, но в RETURN вмещает четыре переменные. Значения которых нигде не задаются. Смысл функции объясняется, они хранят предыдущие значения. Но синтаксис в полный тупик ставят, как что работает.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.07.2020, 23:00
Ответы с готовыми решениями:

Аргументы object sender и EventArgs e в функциях
Здравствуйте, уважаемые форумчане) Нужно очень детально прокоментировать код к курсачу, а что это...

Короткое замыкание или нет?
Приветствую форумчане, сложилась такая ситуация, решил собрать ПК, все кроме процессора, материнки...

Невероятные приключения Qt или ошибка в элементарных функциях
Здравствуйте. Возник вопрос: почему этот идиот заходит в условный оператор, когда его аргумент...

Как в JavaScript передаются параметры в функциях? По ссылке или по значению.
Как в JavaScript передаются параметры в функциях? По ссылке или по значению. И каков синтаксис в...

5
1003 / 1858 / 176
Регистрация: 07.05.2013
Сообщений: 3,894
Записей в блоге: 12
23.07.2020, 06:38 2
Замыкание - это функция, возвращающая функцию с сохраненными локальными переменными порождающей ф-ции.

1 - таблицы и пользовательские типы попадают по ссылке, остальные типы - по значению
2 - локальная, поскольку это - аргумент ф-ции. Все аргументы ф-ций - локальны, local не нужен.
3 - в данном случае:

c=prov(math.sin) -- создаем ф-цию с именем "с" и сохраненной внутри ф-цией синуса, второй параметр опущен, поэтому по умолчанию равен 1e-4

print(math.cos(5.2),c(5.2)) -- вызываем созданную ф-цию "c" с параметром 5.2 -- именно он "залетает" в x.

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

что-то типа:

ema1 = cached_EMA() -- создаем
ema2 = cached_EMA()

ema1( a, b, c, d ) -- вызываем
ema2( e, f, g, h )

ps: спасибо за вопрос, мне тут в голову пришло, что замыкания можно использовать для ограниченного ооп. Что-то типа такого:

Lua
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
function const( param )
 
   local delta = param
 
   local f = {}
 
   f.add =
     function( n )
         return n + delta
     end
   f.sub =
     function( n )
         return n - delta
     end
 
   return f
 
end
 
const_5 = const( 5 )
 
print( const_5.add( 10 ) ) -- 10 + 5 = 15
print( const_5.sub( 10 ) ) -- 10 - 5 = 5
Добавлено через 25 минут
ну то есть вызывать то нужно как-то так:

n1 = ema1( a, b, c, d )
n2 = ema2( e, f, g, h )

В зависимости от того, что будет там внутри накапливаться, значения n1 и n2 будут разными.
А.... "Индикатор EMA (Exponential Moving Average)" -- ну значит это он и есть... Скользящее среднее.
1
1 / 1 / 1
Регистрация: 19.07.2017
Сообщений: 13
23.07.2020, 09:45  [ТС] 3
1) В первом блоке кода сохранение идет в prov (переменная delta), зачем нужна вызывающая функция? В ней же производится только вычисление?
2)Во втором блоке кода возвращающая функция принимает четыре аргумента. И пересохраняет в локальные переменные в возвращаемой функции. Это делается что бы уничтожить их, как только функция глобальная завершит свое действие? К cached_EMA() идет циклический вызов. И к таблице cache обращается повторно. Т.е. она не уничтожается?

3) Зачем хранить локальные переменные вызываемой функции, вместо того. Что бы их хранить в глобальных переменных, в чем преимущество?

4) Можно пример функции (й). Которая записывает или удаляет значения в таблицу ключей и значений, другая считывает.
0
1003 / 1858 / 176
Регистрация: 07.05.2013
Сообщений: 3,894
Записей в блоге: 12
23.07.2020, 10:41 4
1 - Вы видимо не поняли. Функция prov - создающая. Ее задача - создать некую функцию, при этом настроив для нее две как бы это сказать... персональные переменные - f и delta. В f записывается ф-ция, в delta - начальное значение. Затем при каждом вызове созданной ф-ции идет приращение delta на 1e-4 и расчет f(x+delta)-f(x))/delta -- где f - переданная в prov ф-ция.

Таких "считалок" вы можете насоздавать сколько угодно - и для каждой из них f,delta установить своими. В этом и суть.

2 - по указанной выше причине они не уничтожаются - а становятся своими собственными для созданной ф-ции.

3 - В том, что ф-ций можно насоздавать сколько угодно. Замыкание в какой-то мере является классом с одним методом.

4 - для этого не нужны ф-ции, но в принципе можно:

Lua
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
local t = { -- создаем исходную таблицу
 
  [ "Вася" ] = 12,
  [ "Петя" ] = 25,
  [ "Коля" ] = 33,
}
 
local age -- возраст
 
   t[ "Олег" ] = 44 -- создаем новую запись
   age = t[ "Петя" ] -- читаем возраст Пети
   t[ "Вася" ] = 23 -- изменяем возраст Васи
 
   print( age ) -- смотрим возраст Пети
 
   for k, v in pairs( t ) do
       print( k, v ) -- смотрим, кто у нас есть и кому сколько лет
   end
 
function table_write( t, k, v ) -- ф-ция записи/модификации
    t[ k ] = v
end
 
function table_read( t, k ) -- ф-ция чтения
    return t[ k ]
end
 
   table_write( t, "Макс", 16 ) -- добавляем 16-летнего Макса
 
   print( table_read( t, "Макс" ) ) -- убеждаемся, что ему 16
 
   for k, v in pairs( t ) do
       print( k, v ) -- смотрим, что изменилось
   end
1
1 / 1 / 1
Регистрация: 19.07.2017
Сообщений: 13
23.07.2020, 12:24  [ТС] 5
Т.е. получается, возвращающая функция нужна для того. Что бы получить доступ к аргументам простейших типов данных? Как передаваемые для вызываемого метода, так и в функциях, которые являются аргументами. И они идут в порядке очереди, в котором встречаются.
Так же возвращающая функция фактически держит в памяти переменные. Что бы не создавать непрерывно новые. И не забивать память? И что бы не изменять аргументы, которые прилетели в функцию?

Добавлено через 12 минут
В вашем коде таблица прилетает как аргумент. В своем примере таблица является частью функции. И там хранится. Вот я и пытаюсь понять - какой в этом смысл? Мне нужен доступ к этой таблице, как на запись, так и получение данных. И почему то нет глобальных таблиц, т.е как бы без функции нельзя их создать.
0
1003 / 1858 / 176
Регистрация: 07.05.2013
Сообщений: 3,894
Записей в блоге: 12
23.07.2020, 13:23 6
Вообще-то это вы должны писать поступающие значения котировок в этот индикатор - и зачем вам нужен доступ к локальной таблице, тем более на запись - я представить не могу от слова вообще...
0
23.07.2020, 13:23
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.07.2020, 13:23
Помогаю со студенческими работами здесь

Как использовать одну переменную в двух или больше функциях?
У меня есть функция void в которой у меня исполняются некоторые операторы, работающие с рандомом в...

Закрытые поля класса или аргументы метода?
Что сейчас наиболее подходит для C#5 и в каких случаях - передавать в метод аргументы или считывать...

Как проверить указаны какие-то аргументы класу или нет?
Есть задание, если классу указан аргумент (название файла) тогда работать с ним, если нет, тогда...

Запись по ссылке или указателю в аргументы функции через макрос va_arg
Здравствуйте! Есть функция, принимающая переменное число аргументов. Нужно, чтобы переменные из...

Как правильно называть переменные в заголовке функции (параметры или аргументы)?
Вопрос про термины. Пришел новый сотрудник и блеснул знаниями, оказывается переменные в заголовке...

Можно ли отсылаться из одной функции к какой-то определенной из нескольких? Или вписывать в аргументы формулу
Есть функция, считающая определенный интеграл от еще одной функции. Хотелось бы сделать возможным...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru