Matlab Command-Function Duality
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 对空格不敏感的极特殊情况