Например
function f(x)
# do something
# then I assigned the outside variable name of 'x' to y
println(y)
end
f(1)
Я получу
# something and
1
Затем,
a = 1
f(a)
Я получу
# something and
"a"
Возможно ли это в Юлии? Если нет, то как я могу получить журнал работы моей функции?
Можете ли вы зарегистрировать функцию из вызывающей функции, а не внутри функции? Таким образом, информация будет легко доступна (иногда и довольно часто ответ на вопрос меняет вопрос)
@DanGetz Я должен, моя последняя функция изменит сложный объект структуры и зарегистрирует операцию в объекте.
Самым идиоматичным способом было бы немного изменить интерфейс f и потребовать аргумент ключевого слова:
julia> function f(;kwargs...)
for (k, v) in kwargs
println("$k = $v")
end
end
f (generic function with 1 method)
julia> f(a = 1)
a = 1
В качестве альтернативы (за исключением проверки трассировки стека) вам нужно что-то на основе макросов:
julia> struct Quot
expr
value
end
julia> macro quot(e)
return :($Quot($(QuoteNode(e)), $e))
end
@quot (macro with 1 method)
julia> function f2(x::Quot)
println(x)
end
f2 (generic function with 1 method)
julia> x = 2
2
julia> f2(@quot x)
Quot(:x, 2)
Я попробовал ваш второй способ решить мою проблему. Это очень хорошо. Спасибо!
Это хорошо, но определенно есть более идиоматические способы.
Да. Я обнаружил, что пользователям не нравится добавлять макрос перед аргументами функции. Они запрашивают нормальный способ использования функции, и функция может молча получить имя переменной внутри функции.
В зависимости от того, что вам нужно, простой макрос, который сбрасывает вызовы функций, которые все еще выполняются, может быть:
macro logs(expr)
@info expr
expr
end
И это можно использовать как:
julia> a = π/2;
julia> @logs sin(a)
[ Info: sin(a)
1.0
Это возможно с помощью макросов.