第13章:函数和命令

在这章中,我们将介绍所有内置函数和系统命令。它们的主要区别是,所有的函数有返回值,而系统命令不返回数值。

语法

对于一个参数的函数,我们使用 X 作为参数。对于两个参数的函数,我们使用 X 和 Y 分别作为第一个和第二个参数。如果没有说明,X 或 Y 表示标量,向量,矩阵,字典或表的对象。我们有一些需要一个标量作为参数之一的函数,比如 take, rand, norm。对于这些情况,我们使用小写字母,比如 “a”, “b”. [ ] 里的内容是可选项。

一个参数的函数语法:

(1) <function>(X)

// 标准函数调用

(2) <function> X

// 将函数名放在参数 X 前时,X 两边的括号可以省略。对于嵌套函数调用,这种做法不推荐。

(3) X.<function>()

// 当 X 是一个对象时,X 两边的括号可以省略。对于嵌套函数调用,这种做法更合适。

两个参数的函数语法:

(1) <function>(X, Y)

// 标准函数调用

(2) X <function> Y

// 将函数名放在两个参数之间。对于嵌套函数调用,这种做法不推荐。

(3) X.<function> (Y)

// 当 X 是一个对象时,X 两边的括号可以省略。

可以对常量和变量用面向对象的风格调用一个函数。

为了简明,我们在这章中,对所以一元和两个参数的函数,都只将介绍第一种调用形式,即 <function>(X) 或 <function>(Y)。

函数调用示例

// 3 种调用函数 log 的方式
$ log(10);
2.302585
$ log 10;
2.302585
$ (10).log();
2.302585
// 为了将常数 10 视为一个对象,必须强制给它加一对括号

$ x = 5 3 1 10;
$ log(x);
[1.609438,1.098612,0,2.302585]
$ log x;
[1.609438,1.098612,0,2.302585]
$ x.log();
[1.609438,1.098612,0,2.302585]
// 括号可以省略,因为 x 是一个向量对象
$ (5 3 1 10).log()
[1.609438,1.098612,0,2.302585]
// 为了将向量常数 5 3 1 10 视为一个向量对象,必须强制给它加一对括号

$ sin(add(log(5),7));
0.727959

性能提示

大多数二元运算符/函数不要求两个参数是同样的数据类型。系统会用最佳方式转换类型。但不推荐使用不同的数据类型,因为大量的类型转换会造成性能的损耗。