2010-04-22 218 views
10

有人可以解釋我lambda表達式&他們可以用於什麼。我用Google搜索了&有個大概的想法。大多數示例都提供了c#代碼。如何在簡單的老C中的lambda表達式?Lambda表達式

+0

下面的el.pescado,因爲C是一個命令式的語言創建匿名方法(函數)沒有完成。最接近匿名函數的C是通過函數指針,比如傳遞給'qsort(3)'的比較函數指針(但它們並不是真正的匿名,因爲它們需要被定義並因此被命名)。 – msw 2010-04-22 21:57:21

回答

13

實際上有兩件事被稱爲「lambda表達式」,這是相當鬆散的聯繫:

  1. Lambda表達式是lambda calculus基礎部分,是密切相關的功能編程

  2. 在命令式語言中,lambda表達式通常是匿名方法的同義詞。在C#中,比如你可以通過lambda表達式作爲參數(即一個表達式本身,而不是它的結果。):

C#:

someCollection.Apply (x => 2*x); // apply expression to every object in collection 
// equivalent to 
someCollection.Apply (delegate (int x) { return 2 * X; }); 

話雖如此,C不支持匿名方法。你可以,但是,使用函數指針來實現類似的結果:

int multiply (int x) 
{ 
    return 2 * x; 
} 

... 
collection_apply (some_collection, multiply); 
+1

據說,蘋果已經添加了一些東西給LLVM添加一種lambda表達式到C(代碼塊或某事)。雖然不是官方標準,但我忘記了確切的搜索條件。 – ndim 2010-04-22 22:57:11

+0

代碼塊是Objective-C的一部分(蘋果公司使用它的大部分高級庫),這是C語言的附加OO語法。 – 2016-07-15 09:43:13

-1

看看這裏的MSDN

+1

C!= C++(15chars) – 2010-04-22 21:52:02

+0

苛刻但公平。 (15) – 2010-04-22 21:54:27

+0

我猜他的意思是C++不是C.我認爲是公平的假設。 – Chris 2010-04-22 22:04:30

1

C不支持蘭巴表情......如果你瞭解Perl,我強烈建議書「高階的Perl」,它會給你一個在熟悉的(如果你知道perl)和實際設置的情況下,介紹各種函數式編程技術。

2

el.pescado的答案是正確的,但他提供的例子有一個簡單的解決方法,使用函數指針。 lambda函數的許多用法不能用c的函數指針來解決。

說你用C寫的這些功能:

int Multiply_1(int x) { return(x*1); } 
int Multiply_2(int x) { return(x*2); } 
int Multiply_3(int x) { return(x*3); } 
int Multiply_4(int x) { return(x*4); } 
etcetera, to infinity 

這些都是很容易理解。現在假設你想編寫一個函數,Ÿ作爲輸入,並返回一個指針函數Multiply_y():

(int)(int) *Make_Multiplier(int y) { return(Multiply_y); } 

其中「Multiply_y」是Multiply_1,Multiply_2等形式的動態創建功能具有一流lambda函數的語言可以做到這一點。

+0

您確定這適用於C嗎? – pmb 2014-03-21 13:27:58

+0

我在說它在c中不起作用。 el.pescado做了一個非常簡單的lambda,但是做一個更復雜的lambda是不可能的。 – Eyal 2014-03-24 14:17:32

+0

對不起,如果你只讀了這個答案,那就不那麼清楚了。謝謝。 – pmb 2014-03-25 07:41:41