AnyMath 文档

软件脚本管理

另请参见:程序模型控制的应用。

这里介绍了所有 engee.script 程序控制方法。有关 engee 方法的介绍,请参阅文章项目管理的公共方法 。

脚本 "方法

engee.script.edit(path::String)

在编辑器中打开位于路径path (包括文件名和扩展名)的交互式脚本。如果该文件不存在,则会在指定路径下创建一个空脚本文件并在编辑器中打开。如果path 中指定的扩展名与 '.ngscript' 不一致,则该函数将返回错误ErrorException("path should end with '.ngscript' extension") 。

示例

# 在脚本编辑器中打开脚本file 。ngscript Engee
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 ,并在数组a中添加了 :foo

在隔离环境中(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

在未定义变量z 和b 之前,无法直接通过engee.script.run 执行此代码。但借助@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 的主体中,因此脚本中的变量会自动引用函数作用域中的值。