作者OPIV (稻草人)
看板C_and_CPP
標題[問題] Closure
時間Tue Dec 1 04:47:41 2015
想請問,closure, function literal, lambda, functor, anonymous function
它們之間有什麼關聯呢?
我知道 lambda 是一種表示式,可是其它的就模模糊糊了…
另外我在網路上看到 C 的相關資料(不知道是不是標準?網路上說是…)
ref1:
https://sholtz9421.wordpress.com/2012/03/06/closures-in-ansi-cc/
ref2: 他講的好像怪怪的…
http://computer-programming-forum.com/47-c-language/127a1918dfb4b5cf.htm
例:
#include <stdio.h>
#include <Block.h>
typedef void (^fun_t)(
int);
fun_t get_fun(
int);
int main(
int)
{
fun_t fun1 = get_fun(
10);
fun_t fun2 = get_fun(
20);
fun1(
100);
fun2(
200);
^
void(
int i)
{
printf(
"%d\n", i);
}(
150);
Block_release(fun1);
Block_release(fun2);
return 0;
}
fun_t get_fun(
int z)
{
__block
int x =
50;
return Block_copy(^(
int y)
{
printf(
"%d\n", x + y + z);
});
}
root@localhost:~# clang -std=c89 -Wall -Wextra -Weverything -Werror -pedantic
-Ofast -o test test.c -fblocks -lBlocksRuntime
root@localhost:~# ./test
160
270
150
root@localhost:~#
(如果有用到 get_fun 這種東西的話,就要 -lBlocksRuntime (libBlocksRuntime-dev)
如果只是 ^void(void) { ... }() 就只要 -fblocks)
再來,問題來了:
1、return (xxx) 小括號裡面的 xxx 是不是一個 function literal 呢?
2、這裡 closure close 的是 x 嗎?
可是我試過,x 的生命周期並不會延長啊?(所以用 static)
3、get_fun 算是一個 functor 嗎?
4、^void(void) { ... } 這個是 anonymous function 嗎?
不知道我的問題有沒有很奇怪 QQ
然後最近有逛到 PLT 版,對 Lambda calculus 有點興趣,不知道要怎麼入門呢?(呼叫
suhorng 大啊啊啊~)
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 49.217.66.47
※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1448916464.A.77C.html
※ 編輯: OPIV (49.217.66.47), 12/01/2015 10:37:22
→ OPIV: blocks (block pointer) are a non-standard extension adde12/01 11:45
→ OPIV: d by Apple Inc.12/01 11:45
推 littleshan: 建議你從別的語言(ex. haskell/ocaml)來理解這些概念12/01 15:34
→ littleshan: C即使加上extension,對這些功能的支援還是很殘廢的12/01 15:35
OK~
現在已經有點懂了,haskell 聽說不錯
後來發現上面有些不對的地方,所以改掉了,例如 static -> __block…
※ 編輯: OPIV (49.217.65.61), 12/02/2015 11:20:20