# 基本语法


本文描述了 TyMLang 的语法和数据类型的细节。

TyMLang 致力于提供尽可能高的 MATLAB 或 Octave 兼容性。 因此,对于熟悉 MATLAB 或 Octave 的用户,可以不需要阅读该页面就能使用 TyMLang 编写和使用代码。

# 常用命令

常用命令
类型名 说明
ans 最近计算的答案
clear 清除变量
clc 清空命令行窗口
format 设置命令行窗口输出显示格式
iskeyword 确定输入是否为 MLang 关键字
cd 更改当前文件夹
pwd 确定当前文件夹
class 对象的类
who 列出工作区中的变量

部分输入命令如下:

  • clear

    • 语法

      clear
      clear varname
      
    • 说明

      clear 清除所有变量。clear varname 清除变量 varname。

    • 示例

      A = [1 2 3; 4 5 6; 7 8 9]
      
      A =
        1  2  3
        4  5  6
        7  8  9
      
      clear A
      A
      
      tymlang.VarNotFound: 变量或函数 A 无法识别
        at  :1:1
      
  • format

    • 语法:

      format style
      format
      
    • 说明:

      format style 将命令行窗口中的输出显示格式更改为 style 指定的格式。

    • 示例:

      format long
      pi
      

      ans =

      3.141592653589793
      
      format short
      pi
      

      ans =

      3.1416
      
  • pwd

    • 语法

      pwd
      currentFolder = pwd
      
    • 说明

      pwd 返回当前文件夹。

    • 示例

      % 切换当前工作目录
      cd 'e:/Temp'
      pwd
      

      ans =

      'e:\Temp'
      

# 基本类型

# 数值类型

数值类型
类型名 说明
int8 8 位有符号整数数组
int16 16 位有符号整数数组
int32 32 位有符号整数数组
int64 64 位有符号整数数组
uint8 8 位无符号整数数组
uint16 16 位无符号整数数组
uint32 32 位无符号整数数组
uint64 64 位无符号整数数组
single 单精度数组
double 双精度数组
logical 逻辑数组

部分数值类型示例如下:

  • double

    • 语法
    Y = double(X)
    
    • 说明

    将 X 中的值转换为双精度

    • 示例
    x = true;
    y = double(x)
    
    y = 1
    
  • single

    • 语法

      Y = single(X)
      
    • 说明

      将 X 中的值转换为单精度

    • 示例

      x = true;
      y = single(x)
      
      y = 
        1x1 single
          1
      
  • int64

    • 语法

      Y = int64(X)
      
    • 说明

      将 X 中的值转换为 64 位有符号整数,超出范围的值映射到最近的端点

    • 示例

      x = 1.4;
      y = int64(x)
      
      y =
        1x1 int64
          1
      
  • 小数及科学计数法

    • 示例
    x = 0.003
    
    x =
      0.0030
    
    y = 3e-3
    
    y =
      0.0030
    
  • 十六进制常量

    • 示例
    x = 0x12345678
    
    x = 
      1x1 uint32
      305419896
    

# 字符和字符串

字符和字符串
类型名 说明
char 字符数组
string 字符串数组
  • char

    • 语法

      C = char(A)
      
    • 说明

      字符数组

    • 示例

      C = 'Hello, world'
      
      C =
          'Hello, world'
      
      A = [83 121 115 108 97 98];
      C = char(A)
      
      C = 
          'Syslab'
      
  • string

    • 语法

      Y = string(X)
      
    • 说明

      将 X 中的值转换为字符串数组

    • 示例

      str = "hello world!"
      
      str =
          "hello world!"
      
      x = 1;
      y = string(x)
      
      y =
          "1"
      

# 逻辑

  • true

    • 语法

      Y = true
      Y = true(n)
      
    • 说明

      true 是逻辑值 1 的速记形式,true(n) 创建一个逻辑值为真的数组

    • 示例

      x = true
      
      x =
          1x1 logical
           true
      
      A = true(3)
      
      A = 
        3x3 logical
          true  true  true
          true  true  true
          true  true  true
      
  • false

    • 语法

      Y = false
      Y = false(n)
      
    • 说明

      false 是逻辑值 0 的速记形式,false(n) 创建一个逻辑值为假的数组

    • 示例

      x = false
      
      x =
        1x1 logical
          false
      
      A = false(3)
      
      A = 
        3x3 logical
          false  false  false
          false  false  false
          false  false  false
      

# 数组

# 创建数组

  • 创建向量

    x = [1,2,5]
    
    x =
        1  2  5
    
    % 创建向量 x = [1 2]
    x = [1 +2]
    
    x = 
        1  2
    
    % 创建向量 x = [3]
    x = [1 + 2]
    
    x = 
        3
    
  • 创建矩阵

    x = [1 2 3; 4 5 6]
    
    x =
        1  2  3
        4  5  6
    
  • 依据范围和步长创建数组

    x = 1:10
    
    x =
        1  2  3  4  5  6  7  8  9  10
    
    x = 1:2:10
    
    x =
        1  3  5  7  9
    
  • 利用串联、并联创建数组

    x = [1 2 3];
    y = [4 5 6];
    z = [x y]
    
    z =
        1  2  3  4  5  6
    
    z = [x; y]
    
    z =
        1  2  3
        4  5  6
    
  • 函数创建数组

函数创建数组
函数 说明
zeros 创建全 0 数组
ones 创建全 1 数组
rand 创建随机数组
eye 创建单位矩阵
diag 创建对角矩阵

完整函数创建数组列表详见库函数帮助,部分函数示例如下:

  • zeros

    • 语法

      Y = zeros
      Y = zeros(n)
      
    • 说明

      zeros 返回标量 0,zeros(n) 创建全 0 数组

    • 示例

      x = zeros
      
      x =
          0
      
      y = zeros(2)
      
      y =
          0  0
          0  0
      
  • ones

    • 语法

      Y = ones
      Y = ones(n)
      
    • 说明

      ones 返回标量 1,ones(n) 创建全 1 数组

    • 示例

      x = ones
      
      x =
          1
      
      y = ones(2)
      
      y =
          1  1
          1  1
      
  • rand

    • 语法

      Y = rand
      Y = rand(n)
      
    • 说明

      rand 返回一个区间在(0,1)的随机数,rand(n) 创建随机数组

    • 示例

      x = rand
      
      x = 
          0.8147
      
      y = rand(2)
      
      y = 
          0.9058    0.9134
          0.1270    0.6324
      

# 数组索引

  • 位置索引

    • 指定位置索引
      x = [1 2 3; 4 5 6];
      y = x(1,2)
      
      y =
          2
      
    • 切片索引
      x = [1 2 3; 4 5 6];
      y = x(1:2,2:3)
      
      y =
          2  3
          5  6
      
  • 线性索引

    x = [1 2 3; 4 5 6];
    y = x(4)
    
    y =
        5
    
  • end 关键字索引

x = [1 2 3; 4 5 6];
y = x(1, end)
y =
    3

# 数组赋值

  • 位置赋值

    • 指定位置赋值
      x = [1 2 3; 4 5 6];
      x(1,2) = 10
      
      x =
          1  10  3
          4  5   6
      
    • 切片赋值
      x = [1 2 3; 4 5 6];
      x(1:2,2:3) = 10
      
      x =
          1  10  10
          4  10  10
      
  • 线性赋值

    x = [1 2 3; 4 5 6];
    x(4) = 10
    
    x =
        1  2   3
        4  10  6
    
  • end 关键字赋值

    x = [1 2 3; 4 5 6];
    x(1,end) = 10
    
    x =
        1  2  10
        4  5  6
    

# 数组扩展

A = [10  20  30; 60  70  80];
A(3,4) = 1
A =
    10  20  30  0
    60  70  80  0
    0   0   0   1
A(4,4:5) = [100 200]
A =
    10  20  30  0    0
    60  70  80  0    0
    0   0   0   1    0
    0   0   0   100  200
clear
A(1:3, :) = rand(3, 1)
A =
    0.0975
    0.2785
    0.5469

# 元胞

# 创建元胞

  • 创建元胞数组
    x = {1,2,3};
    y = {1,2,3;4,5,6}
    
    y =
      2x3 cell
        {[1]}  {[2]}  {[3]}
        {[4]}  {[5]}  {[6]}
    

# 元胞索引

  • ()元胞索引
    x = {1,2,3};
    y = x(1)
    
    y =
      1x1 cell
        {[1]}
    
  • {}元胞索引
    x = {1,2,3};
    y = x{1}
    
    y =
        1
    

# 元胞赋值

  • ()元胞赋值
    x = {1,2,3};
    x(1) = {10}
    
    x =
      1x3 cell
        {[10]}  {[2]}  {[3]}
    
  • {}元胞赋值
    x = {1,2,3};
    x{1} = 10
    
    x =
      1x3 cell
        {[10]}  {[2]}  {[3]}
    

# 元胞扩展

x = {1,2,3};
x(2,2) = {100}
x =
  2x3 cell
           {[1]}    {[2]}         {[3]}
    {0x0 double}  {[100]}  {0x0 double}

# 结构体

# 创建结构体

  • 创建标量结构体
    x = struct('a',1,'b',2)
    
    x = 
      1x1 struct
        a: [1]
        b: [2]
    
  • 创建结构体数组
    patient(1).name = 'John Doe';
    patient(1).billing = 127.00;
    patient(1).test = [79, 75, 73; 180, 178, 177.5; 220, 210, 205];
    patient(2).name = 'Ann Lane';
    patient(2).billing = 28.50;
    patient(2).test = [68, 70, 68; 118, 118, 119; 172, 170, 169];
    patient
    
    patient =
      1x2 struct
       billing
       name
       test
    
  • 创建含有元胞的结构体
    s.cell = {{'a','b','c'}}
    
    s =
      1x1 struct
        cell: 1x1 cell
    
    s.cell{1}
    
     ans =
        1x3 cell
         {'a'}    {'b'}    {'c'}
    

# 结构体索引

  • 结构体字段访问
    x = struct('a',1,'b',2);
    y = x.a
    
     y =
         1
    
  • 结构体数组索引
    patient(1).test = [79, 75, 73; 180, 178, 177.5; 220, 210, 205];
    patient(2).test = [68, 70, 68; 118, 118, 119; 172, 170, 169];
    patient(1).test(1,2)
    
    ans =
          75
    
    patient(2).test(end)
    
    ans =
          169
    

# 结构体赋值

  • 结构体字段赋值
    x = struct('a',1,'b',2);
    x.a = 10
    
    x =
      1x1 struct
        a: [10]
        b: [2]
    
  • 结构体数组赋值
    patient(1).name = 'John Doe';
    patient(1).billing = 127.00;
    patient(1).test = [79, 75, 73; 180, 178, 177.5; 220, 210, 205];
    patient(1).test(1,2) = 10;
    patient(1).test
    
    ans =
        79   10   73
        180  178  177.5000
        220  210  205
    

# 映射容器(实验性)

映射容器(实验性)
函数 说明
containers_Map 将值映射到唯一键的对象
isKey 确定 Map 对象是否包含键
keys 返回 Map 对象的键
remove 从 Map 对象中删除键-值对组
values 返回 Map 对象的值
  • containers_Map

    • 语法

      M = containers_Map(keySet,valueSet)
      M = containers_Map(keySet,valueSet,'UniformValues',isUniform)
      M = containers_Map('KeyType',kType,'ValueType',vType)
      M = containers_Map
      
    • 说明

      将值映射到唯一键的对象。

      注意:我们使用containers_Map替代 Matlab 的containers.Map,实现同样功能。

    • 示例

      • 创建映射

        
        keySet = {'Jan','Feb','Mar','Apr'};
        valueSet = [327.2 368.2 197.6 178.4];
        M = containers_Map(keySet,valueSet)
        
        M = 
          Map - 属性:
        
          Count: 4
          KeyType: char
          ValueType: double
        
      • 将数字指定为键

        ids = [437 1089 2362];
        names = {'Lee, N.','Jones, R.','Sanchez, C.'};
        M = containers_Map(ids,names);
        M(437)
        
        ans = 
          'Lee, N.'
        
      • 存储非统一值

        keySet = {'Li','Jones','Sanchez'};
        testLi = [5.8 7.35];
        testJones = [27 3.92 6.4 8.21];
        testSanchez = 'C:\Tests\Sanchez.dat';
        
        valueSet = {testLi,testJones,testSanchez};
        M = containers_Map(keySet,valueSet,'UniformValues',false)
        
        M = 
          Map - 属性:
        
          Count: 3
          KeyType: char
          ValueType: any
        
        M('Li')
        
        ans = 
          5.8000  7.3500
        
        M('Sanchez')
        
        ans =
          'C:\Tests\Sanchez.dat'
        
      • 指定空映射的类型

        M = containers_Map('KeyType','char','ValueType','double');
        M('Jan') = 327.2;
        M('Feb') = 368.2;
        M
        
        M =
          Map - 属性:
        
          Count: 2
          KeyType: char
          ValueType: double
        
        keys(M)
        
        ans = 
          1x2 cell
          {'Jan'}    {'Feb'}
        
        values(M)
        
        ans = 
          1x2 cell
          {[327.2000]}    {[368.2000]}
        

# 运算符

# 算术运算

  • 数组运算

    数组运算
    运算符 用途 说明 函数
    + 加法 A+B 表示将 AB 加在一起。 plus
    + 一元加法 +A 表示返回 A uplus
    - 减法 A-B 表示从 A 中减去 B minus
    - 一元减法 -A 表示对 A 的元素求反。 uminus
    .* 按元素乘法 A.*B 表示 AB 的逐元素乘积。 times
    .^ 按元素求幂 A.^B 表示包含元素 A(i,j)B(i,j) 次幂的矩阵。 power
    ./ 数组右除 A./B 表示包含元素 A(i,j)/B(i,j) 的矩阵。 rdivide
    .\ 数组左除 A.\B 表示包含元素 B(i,j)/A(i,j) 的矩阵。 ldivide
    .' 数组转置 A.' 表示 A 的数组转置。对于复矩阵,这不涉及共轭。 transpose
  • 矩阵运算

    矩阵运算
    运算符 用途 说明 函数
    * 矩阵乘法 C = A*B 表示矩阵 AB 的线性代数乘积。A 的列数必须与 B 的行数相等。 mtimes
    \ 矩阵左除 x = A\B 是方程 Ax = B 的解。矩阵 AB 必须拥有相同的行数。 mldivide
    / 矩阵右除 x = B/A 是方程 xA = B 的解。矩阵 AB 必须拥有相同的列数。用左除运算符表示的话,B/A = (A'\B')' mrdivide
    ^ 矩阵幂 A^B 表示 AB 次幂(如果 B 为标量)。对于 B 的其他值,计算包含特征值和特征向量。 mpower
    ' 复共轭转置 A' 表示 A 的线性代数转置。对于复矩阵,这是复共轭转置。 ctranspose

部分运算符示例如下:

  • 加法

    • 语法

      C = A + B
      C = plus(A, B)
      
    • 说明

      C = A + B 通过对应元素相加将数组 A 和 B 相加。A 和 B 的大小必须相同或兼容

    • 示例

      A = [1 2 3; 4 5 6];
      B = [1 2 3; 4 5 6];
      C = A + B
      
        C =
            2  4   6
            8  10  12
      
  • 数组乘法

    • 语法

      C = A .* B
      C = times(A, B)
      
    • 说明

      C = A .* B 通过对应元素相乘将数组 A 和 B 相乘。A 和 B 的大小必须相同或兼容

    • 示例

      A = [1 0 3];
      B = [2 3 7];
      C = A.*B
      
      C =
          2  0  21
      
  • 数组右除

    • 语法

      C = A ./ B
      C = rdivide(A, B)
      
    • 说明

      C = A ./ B 通过对应元素相除将数组 A 和 B 相除。A 和 B 的大小必须相同或兼容

    • 示例

      A = [2 4 6 8; 3 5 7 9];
      B = 10*ones(2,4);
      x = A./B
      
      x =
          0.2000  0.4000  0.6000  0.8000
          0.3000  0.5000  0.7000  0.9000
      
  • 数组转置

    • 语法

      C = A.'
      C = transpose(A)
      
    • 说明

      C = A.' 返回 A 的数组转置。对于复数矩阵,不涉及共轭

    • 示例

      A = [1+i 2 3; 4 5 6];
      C = A.'
      
      C =
          1 + 1i    4 + 0i
          2 + 0i    5 + 0i
          3 + 0i    6 + 0i
      
  • 矩阵乘法

    • 语法

      C = A * B
      C = mtimes(A, B)
      
    • 说明

      C = A * B 是 A 和 B 的矩阵乘积

    • 示例

      A = [1 2 3; 4 5 6];
      B = [1 2 ;3 4; 5 6];
      C = A * B
      
      C =
        22  28
        49  64
      
  • 矩阵右除

    • 语法

      C = B / A
      C = mrdivide(B, A)
      
    • 说明

      x = B/A 对线性方程组 x * A = B 求解 x。矩阵 A 和 B 必须具有相同的列数

    • 示例

      A = [3.2 2.7 3.4; 4.3 5.2 1.6];
      B = [1.2 0.4 1.3; 0.9 0.5 0.7];
      C = B / A
      
      C =
          0.4740  -0.1338
          0.2230  0.0037
      
  • 矩阵转置

    • 语法

      C = A'
      C = ctranspose(A)
      
    • 说明

      C = A' 返回 A 的复共轭转置

    • 示例

      A = [1+i 2 3; 4 5 6];
      C = A'
      
      C =
          1 - 1i    4 + 0i
          2 + 0i    5 + 0i
          3 + 0i    6 + 0i
      

# 关系运算

比较运算符
运算符 说明
== 相等
>= 大于或等于
> 大于
<= 小于等于
< 小于
~= 不等于
isequal 确定数组相等性
isequaln 测试数组相等性,将 NaN 值视为相等

部分比较运算符示例如下:

  • ==

    • 语法

      A == B
      eq(A, B)
      
    • 说明

      A == B 返回一个逻辑数组,其中包含 A 和 B 中对应元素的相等性

    • 示例

      A = [1 2 3; 4 5 6];
      B = [1 2 3; 7 8 9];
      A == B
      
      ans =
        2x3 logical
          true   true   true
          false  false  false
      
  • >=

    • 语法

      A >= B
      ge(A, B)
      
    • 说明

      A >= B 返回一个逻辑数组,其中包含 A 和 B 中对应元素的大于或等于性

    • 示例

      A = [1 2 3; 4 5 6];
      B = [1 2 3; 7 8 9];
      A >= B
      
      ans =
          2x3 logical
            true   true   true
            false  false  false
      
  • ~=

    • 语法

      A ~= B
      ne(A, B)
      
    • 说明

      A ~= B 返回一个逻辑数组,其中包含 A 和 B 中对应元素的不等于性

    • 示例

      A = [1 2 3; 4 5 6];
      B = [1 2 3; 7 8 9];
      A ~= B
      
      ans =
        2x3 logical
          false  false  false
          true   true   true
      
  • isequal

    • 语法

      tf = isequal(A,B)
      tf = isequal(A1,A2,...,An)
      
    • 说明

      如果 AB 等效,则 tf = isequal(A,B) 返回逻辑值 true;否则,返回逻辑值 false

      要将 NaNNaT<undefined><missing> 值视为与其他此类值相等,请使用isequaln

    • 示例

      A = struct('field1',0.005,'field2',2500);
      B = struct('field2',2500,'field1',0.005);
      tf = isequaln(A,B)
      

      ans =

      1x1 logical

      true
      

# 逻辑运算

逻辑运算符
运算符 解释
& 逻辑与
| 逻辑或
~ 逻辑非
&& 短路与
|| 短路或
xor 计算逻辑异 OR
all 确定所有的数组元素是为非零还是 true
any 确定任何数组元素是否为非零
  • &

    • 语法

      A & B
      and(A, B)
      
    • 说明

      A & B 返回一个逻辑数组。如果 A 和 B 在相同的数组位置都包含非零元素,则输出数组中对应位置的元素将设置为逻辑值 1 (true)。如果不是,则将数组元素设置为 0。

    • 示例

      A = [5 7 0; 0 2 9; 5 0 0];
      B = [6 6 0; 1 3 5; -1 0 0];
      A & B
      
      ans =
        3x3 logical
          true   true   false
          false  true   true
          true   false  false
      
  • |

    • 语法

      A | B
      or(A, B)
      
    • 说明

      A | B 返回一个逻辑数组。如果 A 或 B 在相同的数组位置包含非零元素,则输出数组中对应位置的元素将设置为逻辑值 1 (true)。如果不是,则将数组元素设置为 0。

    • 示例

      A = [5 7 0; 0 2 9; 5 0 0];
      B = [6 6 0; 1 3 5; -1 0 0];
      A | B
      
      ans =
        3x3 logical
          true  true   false
          true  true   true
          true  false  false
      
  • ~

    • 语法

      ~A
      not(A)
      
    • 说明

      ~A 返回一个逻辑数组。如果 A 中元素为零值,则数组中对应元素为逻辑值 1 (true) 值;如果 A 中元素为非零值,则数组中对应元素为逻辑值 0 (false)。

    • 示例

      A = [1 0; 0 1];
      ~A
      
      ans =
        2x2 logical
          false  true
          true   false
      
  • &&

    • 语法

      expr1 && expr2
      
    • 说明

      expr1 && expr2 表示使用短路行为的逻辑 AND 运算。即,如果 expr1 为逻辑值 0 (false),将不计算 expr2 的结果。每个表达式的计算结果都必须为标量逻辑值

    • 示例

      b = 0;
      a = 20;
      x = (b ~= 0) && (a/b > 18.5)
      
      x =
        1x1 logical
          false
      
  • ||

    • 语法

      expr1 || expr2
      
    • 说明

      expr1 || expr2 表示使用短路行为的逻辑 OR 运算。即,如果 expr1 为逻辑值 1 (true),将不计算 expr2 的结果。每个表达式的计算结果都必须为标量逻辑值。

    • 示例

      X = [1 0 0 1 1];
      Y = [0 0 0 0 0];
      any(X) || all(Y)
      
      ans =
        1x1 logical
          true
      

# 按位运算

位运算符
运算符 解释
bitand 按位与
bitor 按位或
bitxor 按位异或
bitcmp 按位补码
bitget 获取指定位置的位
bitset 设置指定位置的位
bitshift 将位移动指定位数
swapbytes 交换字节顺序

完整位运算函数列表详见库函数帮助,部分位运算函数示例如下:

  • bitand

    • 语法

      bitand(A, B)
      
    • 说明

      C = bitand(A,B) 返回 A 和 B 的按位 AND。

    • 示例

      A = [1 2 3; 4 5 6; 7 8 9];
      B = [1 0 1; 0 1 0; 1 0 1];
      bitand(A, B)
      
      ans =
          1  0  1
          0  1  0
          1  0  1
      
  • bitor

    • 语法

      bitor(A, B)
      
    • 说明

      C = bitor(A,B) 返回 A 和 B 的按位 OR。

    • 示例

      A = [1 2 3; 4 5 6; 7 8 9];
      B = [1 0 1; 0 1 0; 1 0 1];
      bitor(A, B)
      
      ans =
          1  2  3
          4  5  6
          7  8  9
      
  • bitxor

    • 语法

      bitxor(A, B)
      
    • 说明

      C = bitxor(A,B) 返回 A 和 B 的按位 XOR。

    • 示例

      A = [1 2 3; 4 5 6; 7 8 9];
      B = [1 0 1; 0 1 0; 1 0 1];
      bitxor(A, B)
      
      ans =
          0  2  2
          4  4  6
          6  8  8
      

# 循环及条件语句

# for 循环

  • 语法

    for index = values
        statements
    end
    
  • 说明

    在循环中将一组语句执行特定次数。

  • 示例

    res = 0;
    for v = [1 5 8 17]
      res = res + v;
    end
    res
    
    ans =
        31
    

# while 循环

  • 语法

    while expression
        statements
    end
    
  • 说明

    计算一个表达式,并在该表达式为 true 时在一个循环中重复执行一组语句。表达式的结果非空并且仅包含非零元素(逻辑值或实数值)时,该表达式为 true。否则,表达式为 false。

    while 中的条件表达式,会将逻辑运算 | 和 & 视为短路运算 || 和 &&

  • 示例

    v = 0;
    while v < 10
      v = v + 1;
    end
    v
    
    ans =
        10
    

# if 语句

  • 语法

    if expression
        statements
    elseif expression
        statements
    else
        statements
    end
    
  • 说明

    计算表达式并在表达式为 true 时执行一组语句。表达式的结果非空并且仅包含非零元素(逻辑值或实数值)时,该表达式为 true。否则,表达式为 false.

    if 中的条件表达式,会将逻辑运算 | 和 & 视为短路运算 || 和 &&

  • 示例

    • if-end语句
      v = 0;
      if v < 10
        v = v + 1;
      end
      v
      
      ans =
          1
      
    • if-else-end语句
      v = 0;
      if v < 10
          v = v + 1;
      else
          v = v - 1;
      end
      v
      
      ans =
          1
      
    • if-elseif-else-end语句
      v = 0;
      if v < 10
        v = v + 1;
      elseif v > 10
        v = v - 1;
      else
        v = 0;
      end
      v
      
      ans =
          1
      

# switch 语句

  • 语法

    switch switch_expression
      case case_expression
        statements
      case case_expression
        statements
      ...
      otherwise
        statements
    end
    
  • 说明

    计算表达式并选择执行多组语句中的一组。每个选项为一个 case。switch 块会测试每个 case,直至一个 case 表达式为 true。当 case 表达式为 true 时,执行对应的语句,然后退出 switch 块。otherwise 块是可选的。仅当没有 case 为 true 时,才会执行这些语句

  • 示例

    v = 0;
    switch v
      case 0
        v = 3;
      case 1
        v = 4;
    end
    v
    
    v =
        3
    

# try-catch 语句

  • 语法

    try
        statements
    catch exception
        statements
    end
    
  • 说明

    在 try 块中执行一组语句。如果在 try 块中发生错误,则执行 catch 块。

  • 示例

    try
      a = notaFunction(5,6);
    catch
      a = 0;
    end
    a
    
    a =
        0
    

# break 语句

  • 语法

    break
    
  • 说明

    用于终止执行 for 或 while 循环。不执行循环中在 break 语句之后显示的语句。在嵌套循环中,break 仅从它所发生的循环中退出。控制传递给该循环的 end 之后的语句

  • 示例

    v = 0;
    while v < 10
      v = v + 1;
      if v == 5
        break;
      end
    end
     v
    
    v =
        5
    

# continue 语句

  • 语法

    continue
    
  • 说明

    continue 将控制权传递到 for 或 while 循环的下一迭代。它跳过当前迭代的循环体中剩余的任何语句。程序继续从下一迭代执行。continue 仅在调用它的循环的主体中起作用。在嵌套循环中,continue 仅跳过循环所发生的循环体内的剩余语句。

  • 示例

    v = 0;
    while v < 10
      v = v + 1;
      if v == 5
        continue;
      end
    end
    v
    
    v =
        10
    

# pause

  • 语法

    pause
    pause(n)
    pause(state)
    
  • 说明

    暂时停止执行 MLang

  • 示例

    • 暂停执行

      % 暂停执行 5 秒。MLang 在暂停执行时会阻止或隐藏命令提示符。
      n = 5;
      pause(n)
      
    • 禁用暂停设置

      % 禁用暂停设置并查询当前状态。
      pause('off')
      pause('query')
      
      ans =
      
          'off'
      
      % 暂停执行 100 秒。由于暂停设置为 off(关闭),MLang 会忽略暂停执行的请求,并立即返回命令提示符。
      pause(100)
      
      % 启用暂停设置。
      pause('on')
      

# return 语句

  • 语法

    return
    
  • 说明

    用于强制在到达调用脚本或函数的末尾前将控制权交还给调用程序

  • 示例:

    v = 0;
    while v < 10
      v = v + 1;
      if v == 5
        break;
      end
      return
    end
    v
    
    v =
        1
    

# 函数

# 创建函数

  • 匿名函数

    f = @(x) x^2;
    f(5)
    
    ans =
        25
    
  • 函数文件

    在 MLang matlab 下定义如下函数:

    function nested_func()
      x = 10;
      function [y]= fcn()
        x=15;
        y = x*2;
      end
      fcn()
    end
    

# 函数调用

  • 调用函数句柄
    f = @sin;
    f(0.5)
    
    ans =
        0.4794
    
  • 调用函数文件 以调用创建函数章节中定义的nested_func函数为例:
    nested_func()
    
    ans =
        30
    

# 作用域变量

  • global

    • 语法

      global var1 ... varN
      
    • 说明

      global var1 ... varN 将变量 var1 ... varN 声明为作用域中的全局变量。

    • 示例:

      clear all
      function setGlobalx(val);
        global x
        x = val;
      end
      function r = getGlobalx
        global x
        r = x;
      end
      setGlobalx(1138)
      r = getGlobalx
      
      r =
          1138
      

# 特殊语法

# 换行

在数组字面量中,换行无需 ... ,而一般的表达式如函数调用,换行需在行末补充...

  • 示例
% 数组字面量
A = [ 1 2
      3 4 ]
A = 
    1  2
    3  4
% 表达式换行时需要加...
B = 1 + 2 + ...
    3
B = 
    6

# 运行时取属性

取运行时变量的属性。

s.x = 1;
attr = "x";
s.(attr)
ans =
    1

# 函数文件

新建example.m文件,在脚本文件中可以定义多个没有end的 function。打开该脚本文件后运行:

% 以下为脚本内容
function x = func1()
x = func2();

function y = func2()
y = 6;
% 运行脚本文件结果为:
ans = 
    6