2013年3月18日 星期一

比較c++、python、go、與javascript的 lambda語法

C++11 算是出了一段時間了,而最近編譯器對 C++11 的支持也越來越完善了。 C++11 有一個新特性,就是支援 lambda 的語法,所以就把一些語言的 lambda 語法拿來做比較。首先是python。

map(lambda s: s * s, [1, 2, 3])
python 的 lambda 語法很好理解,冒號前是參數,冒號後是程式碼。lambda   的限制就程式碼只能夠一行。lambda 可以存取外部變數,但是不能使用 assignment statement。



package main

import (
    "fmt"
)

func map_func(array []int, fun func(int)int){
    for index, element := range array{
        array[index] = fun(element)
    }
}
func main(){
    v := []int{1, 2 ,3 ,4 , 5}
    fmt.Println(v)
    map_func(v, func(s int)int{return s * s})
    fmt.Println(v)
}

golang  也很好懂。匿名函數就和一般函數一樣。沒有一行的限制(一行限制大概只有 python 有吧),不可以存取外部變數,可以使用 assignment statement (因為就和函數一樣阿)。

基本上, javascript 和 golang 語言差不多。只差在 golang 語言要宣告型態,javascript 可以存取外部變數。目前我只兩道這兩個差別,可能也有其他差別吧。


[1, 2, 3].forEach(function(entry) {
    console.log(entry);
});

接下來,我們來看看  c++11 的 lambda 語法。他的語法比起上面的語法,都還要複雜多了。完整的規格可以看 cpp ref。我只講第二個形式。



#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main(){
    vector <int> v = {1, 2, 3, 4, 5};
    int data = 3;
    int counter = 0;
    for_each(v.begin(), v.end(), [data, &counter](int s) -> int{
      counter += 1;
      cout << s * data << endl;
    });
    cout << "counter: " << counter << endl;
    return 0;
}

c++ 的範例就比較複雜些,但是也提供比較多功能。例如他可以選擇匿名函數可以存去外部的那些變數。就 python 和 javascript 而言,他是可以存取所有外部變數的。而 golang則是禁止存取。

c++ 的 lambda 範例和其他語言不一樣。他的形式長的很特別。其他程式語言看到 lambda 的語法大概猜得出來是幹嘛的。 c++ 就比較難猜了。他把三種括號都用上了XD

沒有留言:

張貼留言