Как получить имена переменных внутри функции в julia

Например

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"

Возможно ли это в Юлии? Если нет, то как я могу получить журнал работы моей функции?

Это возможно с помощью макросов.

Bogumił Kamiński 11.01.2023 08:50

Можете ли вы зарегистрировать функцию из вызывающей функции, а не внутри функции? Таким образом, информация будет легко доступна (иногда и довольно часто ответ на вопрос меняет вопрос)

Dan Getz 11.01.2023 17:22

@DanGetz Я должен, моя последняя функция изменит сложный объект структуры и зарегистрирует операцию в объекте.

kaji331 13.01.2023 02:15
Типы данных JavaScript
Типы данных JavaScript
В JavaScript существует несколько типов данных, включая примитивные типы данных и ссылочные типы данных. Вот краткое объяснение различных типов данных...
Как сделать движок для футбольного матча? (простой вариант)
Как сделать движок для футбольного матча? (простой вариант)
Футбол. Для многих людей, живущих на земле, эта игра - больше, чем просто спорт. И эти люди всегда мечтают стать футболистом или менеджером. Но, к...
Знайте свои исключения!
Знайте свои исключения!
В Java исключение - это событие, возникающее во время выполнения программы, которое нарушает нормальный ход выполнения инструкций программы. Когда...
CSS Flex: что должен знать каждый разработчик
CSS Flex: что должен знать каждый разработчик
CSS Flex: что должен знать каждый разработчик Модуль flexbox, также известный как гибкий модуль разметки box, помогает эффективно проектировать и...
Введение в раздел "Заголовок" в HTML
Введение в раздел "Заголовок" в HTML
Говорят, что лучшее о человеке можно увидеть только изнутри, и это относится и к веб-страницам HTML! Причина, по которой некоторые веб-страницы не...
2
3
59
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Самым идиоматичным способом было бы немного изменить интерфейс 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)

Я попробовал ваш второй способ решить мою проблему. Это очень хорошо. Спасибо!

kaji331 13.01.2023 02:13

Это хорошо, но определенно есть более идиоматические способы.

phipsgabler 13.01.2023 08:40

Да. Я обнаружил, что пользователям не нравится добавлять макрос перед аргументами функции. Они запрашивают нормальный способ использования функции, и функция может молча получить имя переменной внутри функции.

kaji331 18.01.2023 02:41

В зависимости от того, что вам нужно, простой макрос, который сбрасывает вызовы функций, которые все еще выполняются, может быть:

macro logs(expr)
    @info expr
    expr
end

И это можно использовать как:

julia> a = π/2;

julia> @logs sin(a)
[ Info: sin(a)
1.0

Другие вопросы по теме