Как запустить построенные команды в Юлии? - PullRequest
0 голосов
/ 26 апреля 2019

У меня есть имена пакетов в массиве, пытаюсь выполнить "используя"со следующим кодом в deps.jl:

#! /opt/julia/julia-1.1.0/bin/Julia
packages =["MbedTLS","HTTP"]
for package in packages
try
("using "package) 
cath err
println("$err")
end
end

выполняется, $ / home / julia / deps.jl, выдает ошибку" не удается сопоставить строковый литерал ". Пожалуйста, помогите мне!

1 Ответ

3 голосов
/ 26 апреля 2019

Вы можете использовать символы и @eval макрос для этого. @eval макрос запускает заданное выражение на верхнем уровне.

packages = [:MbedTLS, :HTTP] # use symbols instead of strings
for package in packages
    try
        @eval(using $package) 
    catch err
        println("$err")
    end
end

Если вам по какой-то причине нужно использовать строки, вы можете сначала преобразовать их в Symbol и использовать @eval с результатами.

packages = ["MbedTLS", "HTTP"]
for package in packages
    try
        @eval(using $(Symbol(package))) 
    catch err
        println("$err")
    end
end

"using "package пытается создать строковый литерал "using", чтобы сопоставить его с переменной package (то есть, как 5 в x=3; b = 5x). Строковое буквальное сопоставление является синтаксической ошибкой в Julia 1.0. Даже если бы это не была синтаксическая ошибка, я не помню, чтобы она использовалась для выполнения выражений.

См. раздел метапрограммирования в документации Julia для получения дополнительной информации о создании и манипулировании кодом внутри Julia.

...