Matlab Command-Function Duality

MATLAB


MATLAB 语言不连贯的一个原因在于它既重视指令 Command, 又重视函数 Function. 特别的, 对于以 char vectors 为输入参数, 无输出参数的函数, 都有等价的指令语法, 即以下两条语句等价

  • fun('argin_1',...,'argin_n')
  • fun argin_1 ... argin_n

注意指令语法的特殊之处:

  • 后面要紧跟一个以上空格
  • 后面不能跟着 (无论隔着多少空格) 左括号 (, 一旦有则识别为函数语法
  • 不能有 char 类的单引号 '
  • 只能以空格为输入参数分隔符, 与函数语法正好相反.
    • 因此 char 类 arg_i 不能包含空格
  • 除了可以用分号 ; 在一行执行多个指令外, 指令语法还可以用逗号 , 分隔

更重要的是, 以上二重性只对直接的 char vectors 成立, 即既不能是变量, 也不能是其他数据类型. 因为指令语法相当于直接对输入参数两边加上单引号 ', 如下例

>> disp "123"
"123"
>> a = 123;
>> disp a
a
>> a = '123';
>> disp a
a

指令语法识别

在变量命名不规范的特殊情况下, 如 disp 是用户定义的变量赋值为 1, 以下语句出现歧义

  • disp .* 1 实际得到 ans = 1, 即 disp 识别为变量
  • disp .*1 实际得到 '.*1, 即 disp 识别为函数

一般的, 对于一个 identifier (可能是一个函数名, 也可能是一个变量名), MATLAB 根据其后面跟随的代码决定其类别, 具体规则如下:

  • 后面跟着赋值符 =, 则其为变量
  • 后面跟着括号 (), 则根据 Matlab Function Precedence Order 决定是变量索引还是函数
  • 后面跟着二元运算符
    • 二元运算符后紧跟着有空格, 或着前面没有空格, 则其为变量
    • 二元运算符后无空格, 且前面有空格, 则其为函数的指令语法

!! 这是违背 MATLAB 对空格不敏感的极特殊情况