Документация Engee

Программное управление скриптами

Здесь представлены все методы программного управления engee.script. Для ознакомления с методами engee обратитесь к статье Публичные методы программного управления.

Методы script

engee.script.edit(path::String)

Открывает блокнот на редактирование. Если указано расширение иное от .ngscript, то выводит ошибку ErrorException("path should end with .ngscript extension"). Если файла нет, то он создается.

Примеры

# Открыть скрипт `file.ngscript` в Редакторе скриптов
engee.script.edit( "file.ngscript" )
engee.script.run(path::String; isolate::Bool = false)

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

Аргументы

  • path::String: абсолютный путь до скрипта.

  • isolate::Bool = false: если равен true, то скрипт выполняется в изолированном окружении. По умолчанию равен false. При равном false скрипт выполняется в основном пользовательском окружении (модуль Main). Все переменные, объявленные глобально или на верхнем уровне, сохраняются после выполнения. При равном true скрипт исполняется во временном изолированном окружении. Все переменные, созданные во время исполнения, не сохраняются после завершения скрипта.

Примеры

Рассмотрим файл foo.ngscript с единственной кодовой ячейкой:

x = 10
y = try
    push!(a, :foo)  # Пытаемся добавить :foo в существующий массив `a`
    5               # Если все хорошо — присваиваем y значение 5
catch _
    3               # Если произошла ошибка — присваиваем y значение 3
end
x + y               # Возвращаем сумму x и y

Исполнение в пользовательском окружении (isolate = false) изменит переменные x и y, а также добавит :foo в массив а:

a = Symbol[:bar, :baz]  # Исходный массив
x = y = 0               # Переменные до запуска скрипта
(engee.script.run("foo.ngscript"), x, y, a)
# ⇒ (15, 10, 5, [:bar, :baz, :foo])
# Скрипт изменил переменные x и y, а также добавил :foo в массив a

При исполнении в изолированном окружении (isolate = true) скрипт не повлияет на внешние переменные и изменения не сохранятся:

# Исходный массив
a = Symbol[:bar, :baz]

# Переменные до запуска скрипта
x = y = 0
(engee.script.run("foo.ngscript"; isolate = true), x, y, a)
# ⇒ (13, 0, 0, [:bar, :baz])
# Скрипт не повлиял на внешние переменные — изменения не сохранились
engee.script.@include(path::String)

Вставляет содержимое указанного скрипта на место вызова макроса. В отличие от engee.script.run, который исполняет скрипт отдельно, макрос @include лексически подставляет код скрипта на место вызова.

Если @include используется внутри блока кода (например, внутри функции), то переменные в скрипте, не объявленные как глобальные, будут интерпретироваться в лексическом окружении, где расположен вызов макроса. Это позволяет, например, использовать переменные из внешней функции внутри включаемого скрипта — скрипт будет видеть их как локальные переменные текущей области видимости.

Аргументы

path::String: абсолютный путь до скрипта.

Примеры

Рассмотрим файл foo.ngscript с кодовой ячейкой:

if z > 10
    return z
else
    push!(b, z)      # Добавляем значение z в массив b
    return maximum(b)
end

Этот код нельзя выполнить напрямую через engee.script.run, пока не определены переменные z и b. Но с @include его можно встроить в функцию, где эти переменные уже определены:

function foo(z, b)

# `z` и `b` из скрипта будут ссылаться на аргументы этой функции
engee.script.@include "foo.ngscript"
end

function bar(z)
# Исходный массив
b = Int[3, 11]
(foo = foo(z, b), b = b)
end

# Скрипт встроен в функцию `foo`, переменные `z` и `b` подставлены автоматически
(bar(5), bar(15))
# ⇒ ((foo = 11, b = [3, 11, 5]), (foo = 15, b = [3, 11]))

В коде макрос @include подставляет код из foo.ngscript прямо в тело функции foo, поэтому переменные из скрипта автоматически ссылаются на значения из области видимости функции.