День 3 Летней школы Julia
Компиляция строк
Функция parse в Julia используется для преобразования строкового представления данных в соответствующий числовой или другой базовый тип.
num1 = parse(Int, "5")
num2 = parse(Float64, "1.23")
print("Результаты: $([num1, num2])")
Функция Meta.parse в Julia используется для преобразования строки, содержащей выражение или вызов функции, в объект типа Expr (выражение Julia).
Важное отличие от parse:
- parse преобразует строки только в конечные значения заданного типа, такие, как числа, логические значения или символы. Оно не поддерживает сложные выражения или вызовы функций.
- Meta.parse работает исключительно с кодом, представленным в виде строки, и преобразует его в объект Expr, который можно анализировать или передать для выполнения.
Пример использования:
cmd = Meta.parse.("1+1")
Функция eval в Julia используется для выполнения выражений, представленных в виде объектов типа Expr (абстрактное синтаксическое дерево) или других валидных выражений. Она позволяет динамически запускать код, что делает её мощным инструментом для задач метапрограммирования, но требует осторожного использования из-за потенциальных рисков выполнения нежелательного кода.
eval(cmd)
Далее рассмотрим пример с CSV-файлом. Для этого подгрузим дополнительные библиотеки.
using CSV
Выполним чтение CSV.
DataFrameCSV = CSV.read("$(@__DIR__)/Resources/data_eval.csv", DataFrame)
Выделим из полученного DataFrame столбец с данными.
Data = DataFrameCSV.Time_and_Ampl
Как видно, мы получили вектор из строк. А теперь добавим к каждой строке квадратные скобки для того, чтобы получить набор команд на добавления элементов в вектор, и выполним эти операции.
DataVec = eval.(Meta.parse.("[".*Data.*"]"))
Как видно, в результате мы получили набор векторов, состоящий из двух элементов. Каждая строка выполнилась отдельно.
Следующий пример, который мы рассмотрим, – это исполнение TXT-файла.
txt = open(io->read(io, String), "$(@__DIR__)/Resources/data_eval.txt") # Читаем TXT
Как видно, мы получили строку с числами и переходами на новую строку в текстовом документе после каждого значения. Далее заменяем \n на запятые и оборачиваем строку в [].
data_str = "[" * replace(txt, "\n" => ",") * "]"
Тепреь строка представляет собой простое задание вектора. Преобразуем строку в выражение и выполним выражение, чтобы получить вектор.
data_vector = eval(Meta.parse(data_str))
В результате мы получили вектор из 21 значения, с которым можем дальше взаимодействовать как с обычным вектором, например, округлить его элементы до целых чисел.
plot(eval(Meta.parse("round.(data_vector)")))