Сохранить имя переменной как строку в Юлии

В Julia 0.4 у меня есть переменная с именем variablex где

in:   variablex  = 6
out:  6
in:   typeof(variablex)
out:  Int64

Я хотел бы сохранить имя переменной в виде строки, поэтому я хотел бы получить что-то похожее на переменную "a", ниже которой хранится имя переменной "variablex" в виде строки.

in:  a = Name(variablex)
out: variablex
in:  typeof(a)
out: ASCIIString

В приведенном выше примере я только что создал функцию "Имя", которая возвращает имя переменной в виде строки. Есть ли в Джулии существующая функция, которая делает то же самое, что и мой воображаемый пример функции "Имя" выше?

1 ответ

Решение

Вы можете использовать макрос как это:

macro Name(arg)
   string(arg)
end

variablex  = 6

a = @Name(variablex)

julia> a
"variablex"

Кредит (и более подробная информация): это так Q&A.

Изменить: Подробнее / Объяснение: Из документации Юлия:

макросы получают свои аргументы в виде выражений, литералов или символов

Таким образом, если бы мы попытались создать такой же эффект с помощью функции (вместо макроса), у нас возникла бы проблема, потому что функции получали свои аргументы в виде объектов. С макросом, однако, variablex (в этом примере) передается как символ (например, эквивалент ввода :variablex). И, string() Функция может воздействовать на символ, превращая его, в общем, в строку.

В короткой версии вы можете думать о символе как об особом типе строки, которая связана с конкретным объектом и ссылается на него. Из документации Юлии снова:

Символ является идентификатором интернированной строки

Таким образом, мы пользуемся тем фактом, что в базовом коде Юлии настройка макросов уже дает нам готовый способ получить символ, связанный с данной переменной (путем передачи этой переменной в качестве аргумента макросу), а затем принять Преимущество в том, что, поскольку символы представляют собой особый тип строки, относительно просто преобразовать их в более стандартный тип строки.

Для более детального анализа символов в Юлии, см. Этот знаменитый вопрос. Что такое "символ" в Юлии?

Подробнее о макросах см. В этом вопросе. Вопрос: В Julia почему @printf - это макрос, а не функция?

Для Юлии 1.0 и выше:

macro name(arg)
    x = string(arg)
    quote
        $x
    end
end

Применение:

a = @name variablex #macro syntax
a = @name(variablex) #called as a function
Другие вопросы по тегам