Индексирование имени функции в a для l oop в Julia - PullRequest
2 голосов
/ 25 февраля 2020

Я пытаюсь написать для l oop, чтобы создать несколько функций. Я хотел бы повторить и имя функций, но я не могу заставить его работать. Вот что я хочу сделать:

for i = 1:n
    h_[i](x) = i*x
end

Я знаю, что это не работает, но я бы хотел что-то подобное.

Спасибо!

Ответы [ 2 ]

1 голос
/ 25 февраля 2020

Как упоминалось @laborg, довольно часто вам не нужно / не нужно использовать метапрограммирование . Поскольку вы уже пытаетесь использовать синтаксис индексации массива (h_[i]), возможно, вам следует просто создать вектор функций, например, так:

h_ = [x->i*x for i in 1:n]

Здесь x->i*x - это анонимная функция - функция, которую мы не хотим давать имени. После этого вы можете использовать фактическое индексирование массива для доступа к этим различным функциям и их вызова.

Демонстрация:

julia> n = 3;

julia> h_ = [x->i*x for i in 1:n];

julia> h_[1](3)
3

julia> h_[2](3)
6

julia> h_[3](3)
9

Нет необходимости в метапрограммировании.

(С другой стороны, в В этом конкретном примере, вероятно, лучшим вариантом будет отдельная функция h(x;i) = i*x с аргументом ключевого слова i. Но я предполагаю, что это упрощенный пример.

1 голос
/ 25 февраля 2020

Вы должны оценить имя своей функции:

for i = 1:n
    f = Symbol(:h_,i)
    @eval $f(x) = $i*x
end

Подробнее об этом: https://docs.julialang.org/en/v1/manual/metaprogramming/

Как общее примечание по метапрограммированию в Julia : Это действительно помогает дважды подумать, является ли метапрограммирование лучшим решением, тем более что Джулия предлагает множество других интересных функций, например, многократная отправка .

...