# 入门介绍
介绍 MWORKS.Syslab Online的界面布局、常用窗口、以及如何新建工程,让用户快速了解Syslab。
# 界面布局
Syslab界面布局主要由六大块构成:
工具栏Ribbon:用于提供平台快捷操作按钮。
左侧边栏:用于提供不同的功能部件,点击可以展开功能面板。
命令窗口:用于终端交互,可以输入脚本命令,并回显执行结果。
工作区:用于提供全局变量列表的显示与管理。
状态栏:用于提示状态信息。
# 命令面板
命令面板是Syslab快捷键的主要交互界面,可以通过 F1
或者 Ctrl+Shift+P
打开,如下图:
注意:命令面板与命令行窗口(REPL)是两个对象,不要混淆。
# 多视图窗口
Syslab支持多视图窗口,可以同时打开多个页面,并进行左右拆分显示,使用快捷键 Ctrl+Pagedown/Pageup
可以进行Tab页之间的跳转,界面效果如下图:
# 新建工程
本示例将从无到有新建一个工程,引导用户熟悉工作流程。
# 操作步骤
- 首先,新建文件夹。点击侧边栏上的资源管理器按钮,资源管理器面板展开。把鼠标悬停在文件目录树上,工作区标题右侧会显示四个按钮,点击 [新建文件夹],填入文件夹名称,会在选中目录位置处新建一个空文件夹。本示例中,选择
SyslabDrive
文件夹并新建文件夹Demo
。操作步骤如下图:
- 其次,新建文件。工作区目录树的顶层是一个标题栏,显示的是当前打开文件夹的名称。把鼠标悬停在文件目录树上,工作区标题右侧会显示四个按钮,点击 [新建文件],会在选中目录位置处新建一个julia类型的Unnamed文件,并进入编辑状态,用户自行修改文件名称,退出编辑状态(键盘回车或者鼠标左键点击其它位置),新建文件成功。本示例中,选择
Demo
文件夹并准备新建文件test.jl
。操作步骤如下图:
- 文件新建成功后,在编辑器内编写代码,保存文件。若文件内容修改后,编辑器Tab页标题右侧会显示一个黑点,代表文件存在修改且未进行保存,快捷键
Ctrl + S
,保存修改。
- 最后,执行文件。
julia
代码编辑完成后,点击工具栏Ribbon中的 [运行] ,系统将启动REPL并执行该文件脚本。文件运行过程中生成的全局变量,会在右侧的工作区变量树中显示,如果运行结果存在输出信息,信息会在REPL命令窗口中进行显示。
# 科学计算语言基础
MWORKS.Syslab 选用开源、多平台、高性能的Julia语言作为科学计算环境的编程语言。
# 基础语法
#赋值语句
answer = 42
x,y,z= 1, [1:10;], "A string"
x,y = y,x # x,y交换
#常量定义
const DATE_OF_BIRTH = 2012
#行尾注释
i = 1 #这是一行注释
#= 多行注释 =#
#链式操作
x = y = z = 1 #从右向左
0 < y < 3 #true
#函数定义
function add_one(i)
return i+1
end
#插入LaTex符号
π #\pi + [Tab]
#基本算法运算: +,-,*,/
#幂运算
2^3 == 8 # true
#除法
3/12 == 0.25 # true
#反向除法
7\3 == 3/7 # true
#取余
7 % 3 == rem(7,3) # true
#取反
!true == false # true
#关系判断
x == y # true
x != y # false
x < y # false
x > y # false
x ≤ y # true
x ≥ y # true
#逐元素运算(点运算)
[1,2,3] .+ [1,2,3] == [2,4,6]
#检测非数值(NaN)
isnan(NaN) # true
NaN == NaN # false
#三元运算符
x == y ? "Equal" : "Not equal" # "Equal"
#对象等价
x === y #true
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
# 字符与字符串
chr = 'C' #字符
Int('C') #67
Char(67) #'C'
str = "A string" #字符串
str = "Tong" * "Yuan" #字符串拼接
#字符插值
a = b = 2
println("a * b = $(a*b)") #a * b = 4
#查找
findfirst('i', "Julia") #4
findfirst("li", "Julia") #3:4
findfirst("liu", "Julia") #未找到则返回nothing
#替换
replace("Julia", "a" => "us") #Julius
#字符串长度
length("Hello") # 5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 数字与数组
#整数类型:IntN和UIntN,且N∈{8,16,32,64,128}, BigInt
#浮点类型: FloatN,且N∈{16,32,64}, BigFloat
#复数类型:Complex{T<:Real}
#虚数单位:im
#类型的最大值和最小值
typemin(Int8) #-128
typemax(Int8) #127
#机器精度
eps() #等价于eps(Float64), 2.220446049250313e-16
#全局常量
pi # 3.1415926535897...
MathConstants.e # 2.7182818284590...
real(im*im) == -1
#圆整
round(3.2) #浮点数圆整,3.0
round(Int, 3.2) #整数圆整,3
arr = Float64[] #声明数组
sizehint!(arr, 100) #预分配内存
append!(arr, 1:100)
arr[99] == 99
deleteat!(arr, 2) #删除指定索引值的元素
insert!(arr, 2, 2) #在指定索引值插入元素
push!(arr, 200) #将值压入数组
pop!(arr) #弹出最后一个元素
popfirst!(arr) #弹出第一个元素
pushfirst!(arr, 1) #将值作为第一个元素压入数组
reshape(1:6, 3, 2)' == [1 2 3; 4 5 6] #改变维数
in(45, arr) #检查值是否在数组arr中
fill!(arr, 0) #用值填充数组
arr = ones(100) #n个1.0填充的数组
arr = zeros(100) #n个0.0填充的数组
#排序
arr = [9,5,2,7]
sort!(arr) #[2,5,7,9]
#等间距数
1:2:100 == range(1, step=2, stop=100)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
# 控制流与循环
#条件语句
if x < y
println("x is less than y")
elseif x > y
println("x is greater than y")
else
println("x is equal to y")
end
#嵌套循环
for i in 1:10, j = 1:5
println(i*j)
end
i = 0
while true
global i += 1
i > 5 && break
println(i)
end
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 函数
#多返回值
function fn(a,b)
a+b, a*b
end
fn(2,3) #(5,6)
#关键字参数
function plot(x, y; style="solid", width=1, color="black")
# do something
end
plot(x, y, width=2)
#接收可变数量的参数
function func(a...)
println(a)
end
func(1,2,[3:5]) # tuple: (1, 2, UnitRange{Int64}[3:5])
#map(f,coll),将f应用到coll中的每一个元素上
map(abs, [-1,-2,3,4])
#filter(f, coll),滤出coll中使f为真的每一个元素列表推导
filter(x->x!=0, [1 0 2 0 3])
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 字典与集合
#字典
d = Dict("a"=>1, "b"=>2, "c"=>3)
for (k, v) in d
println("key: $k, value: $v")
end
keys(d) #所有的键(迭代器)
values(d) #所有的值(迭代器)
haskey(d, "a") #是否存在键
arr = collect(keys(d)) #复制到数组
#集合
s1 = Set([1,2,3,4])
s2 = Set([2,4,6,8])
s1 ∪ s2 == union(s1,s2) #并集, Set([4, 6, 2, 8, 3, 1])
s1 ∩ s2 == intersect(s1,s2) #交集, Set([4, 2])
setdiff(s1,s2) #补集,Set([3,1])
symdiff(s1,s2) #对称差,Set([6, 8, 3, 1])
issubset([1,2], s1) #true
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 表达式与宏
line = "1+a" #一些代码
expr = Meta.parse(line) #生成一个 Expr 对象
typeof(expr) == Expr #true
expr2 = :(1+a) #表达式,与expr相等
expr == expr2 #true
a = 10
eval(expr) == 11 #求值
eval(expr2) == 11
#宏
@which println #查看对特定参数使用的方法/查找函数所在的模块
@time sleep(2) #运行时间与内存分配统计
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
# 模块与类型
#模块
using Test
names(Test) #得到模块导出名称的数组
#类型
struct Foo
bar
baz::Int
qux::Float64
end
foo = Foo("Hello, world.", 23, 1.5)
fieldnames(Foo) #所有字段,(:bar, :baz, :qux)
Foo.types #所有字段类型, svec(Any, Int64, Float64)
typeof(x) #类型
isa(x, Int) #类型检查
subtypes(Number) #列出子类型
supertype(Int) #列出超类型
methods(println) #函数方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20