软件脚本管理
脚本 "方法
#
engee.script.edit
— Function
engee.script.edit(path::String)
打开位于编辑器中沿路径的交互式脚本。 path
(包括名称和扩展名)。 如果没有这样的文件,则使用指定的路径创建一个空的脚本文件,并在编辑器中打开。 如在 path
的延伸与’不同。ngscript',则函数返回错误 ErrorException("path should end with '.ngscript' extension")
.
例子
# 打开文件。Engee脚本编辑器中的ngscript脚本
engee.script.edit( "file.ngscript" )
#
engee.script.run
— Function
engee.script.run(path::String; isolate::Bool = false)
在指定的路径上运行脚本。 返回脚本中最后一个上层表达式的结果。
参数
-
path::String
:脚本的绝对路径。 -
isolate::Bool = false
:if等于true
,则脚本在隔离环境中执行。 默认情况下,它等于false
. 与平等false
脚本在主用户环境(主模块)中执行。 全局或顶层声明的所有变量都在执行后保存。 与平等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, [:吧,:baz])
# 脚本不影响外部变量—更改未保存。
#
engee.script.@include
— Macro
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
因此,脚本中的变量会自动引用函数作用域中的值。