# 入门介绍


介绍 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

# 字符与字符串

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

# 数字与数组

#整数类型: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

# 控制流与循环

#条件语句
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

# 函数

#多返回值
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

# 字典与集合

#字典
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

# 表达式与宏

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

# 模块与类型

#模块
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