我試圖了解如何用 C 之類的語言實作閉包。
目前我想創建一個adder帶有int, 并回傳另一個也帶有int引數的函式的函式。呼叫回傳的函式應該導致兩個引數的總和。
這是偽代碼示例:
fn adder(int lhs) {
return fn (int rhs) {
return lhs rhs
}
}
由于嵌套函式在標準 C 中不可用,我想我可以通過傳遞狀態來實作它們。這是我的 C 實作:
#include <stdio.h>
typedef struct
{
int *a; // This attribute should be a pointer as in my
// ideal interpretation of closures, the state of
// the parent function should be mutable within the child
} ClosureState;
int adder_inner(ClosureState state, int b)
{
printf("a = %d\n", *state.a);
return *state.a b;
}
ClosureState make_adder(int a)
{
ClosureState state = {
.a = &a};
return state;
}
int main()
{
ClosureState adder_state = make_adder(5);
int res1 = adder_inner(adder_state, 5);
int res2 = adder_inner(adder_state, 10);
int res3 = adder_inner(adder_state, 50);
printf("%d, %d, %d\n", res1, res2, res3);
return 0;
}
問題:adder_state物件似乎在每次呼叫后都會被修改,adder_inner但我不明白為什么 as*state.a從未重新分配。
上面代碼的輸出是:
$ clang -o clj clj.c && ./clj
a = 5
a = 10
a = 50
10, 20, 100
uj5u.com熱心網友回復:
ClojureState( )沒有理由ClosureState持有一個指標。如果它只擁有它int自己會容易得多:
#include <stdio.h>
typedef struct
{
int a; // No need for a pointer, the value can still be
// changed in adder_inner() if needed.
} ClosureState;
int adder_inner(ClosureState *state, int b)
{
printf("a = %d\n", state->a);
return state->a b;
}
ClosureState make_adder(int a)
{
ClosureState state = {
.a = a};
return state;
}
int main()
{
ClosureState adder_state = make_adder(5);
int res1 = adder_inner(&adder_state, 5);
int res2 = adder_inner(&adder_state, 10);
int res3 = adder_inner(&adder_state, 50);
printf("%d, %d, %d\n", res1, res2, res3);
return 0;
}```
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/425196.html
