函数 / 编程语言 · 2023年 10月 15日 0

函数

48 次浏览

大部分编程语言都支持函数,函数式编程语言例如Haskell/ML/F#更是把函数作为第一等公民。

函数起源

函数起源于数学,最早是17世纪莱布尼茨用于表达”一个变量的变化”, 后来由我国清代数学家李善兰在翻译《代数学》(1895年)一书时,把“function”译成“函数”:"凡此变数中函彼变数者,则此为彼之函数"。

函数的”函”,也为”含”。“函”在数学中也指“信函”,引申为“盒子”的意思,即表达一些数通过一些关系联系,可以用“盒子”包装起来。

函数的不同形式

  • C语言函数可以和数学中f(x)类似,参数也可以不止一个。
  • 面向对象语言Java/C#为了更好管理代码,函数被封装在类内,分为静态函数或者成员函数,本质上和C语言函数无异,编译器隐式为成员函数加上指向本对象的指针。
  • Kotlin 一样支持类成员函数,不过不直接支持类静态函数,而是用包级函数代替"类静态函数"。
  • VB 支持Sub过程和Function函数两种函数,区别在于Sub不会返回值,常用于事件过程。
  • Pascal 函数function和过程procedure分别指代有一个返回值和没有返回值的例程。有意思的是,它用赋值给function名称当做返回值。

函数声明和定义

  • 编译型语言大部分要求函数明确标明返回值、函数名和参数列表(类型和形参名)。
    • 例如C/ObjC/C++/C#/Java/仓颉/Rust/Swift/Go 等。
    • 对于类型置于变量之后的语言,函数声明参数也有此约束。
  • 对于解释型语言,一部分是弱类型或者动态类型语言,已经不需要明确指明返回值或参数类型。
    • 例如PHP/Shell/Python 等。
  • Python成员方法不用定义返回值和参数类型,用def和参数名称指代即可。
  • Shell函数形式如下(也可省略最开始的function):
    function <func_name> ()
    {
    <shell commands>
    }
  • Pascal 函数形式示例如下:
    function add(a, b : integer) : integer;
    begin
    add := a + b;
    end;

    Pascal过程Procedure示例如下:
    procedure swap(var a, b : integer);
    var temp : integer;
    begin
    temp := a;
    a := b;
    b := temp;
    end;

顶层函数

  • C/ObjC/C++/仓颉 等都支持顶层函数,即全局函数。
  • Java/C# 不支持顶层函数,函数必须放在类里。
  • Kotlin 和Java不同,可支持顶层函数,即包里可以直接定义函数。
    可通过import <package_name>.<func_name> 引入使用。
  • VB 6支持全局函数,VB.NET不再支持全局函数,但支持类shared共享方法,此等同于类静态函数。

函数标志

  • VB 支持返回值是字符串的函数加上$后缀做标志,功能不变,增强可读性。
    例如:假设GetString函数返回字符串, GetString() 和 GetString$() 是相同的。