(define (create-counter (x 1))
(let ([count 0])
(lambda()
(let ([temp count])
(set! count (+ x count)) temp))))
Переводит на:
auto create_counter(int x=1){
int count=0;
return [x,count]()mutable{
int r=count;
count+=x;
return r;
};
}
Простой C++ 14 функция, возвращающая объект закрытия.
Когда вы сделаете это:
(let ((c (create-counter))) (+ (c) (c) (c) (c)))
Это:
auto c = create_counter();
auto r = c()+c()+c()+c();
return r;
Это создает один счетчик, а затем запускает его в 4 раза, возвращая 0 1 2 3 и добавление 6.
В этом случае:
(+ ((create-counter))((create-counter))((create-counter))((create-counter)))
Это:
auto r = create_counter()()+create_counter()()+create_counter()()+create_counter()();
return r;
Который создает 4 счетчика и запускает их каждый раз. При первом запуске счетчика вы получаете 0. Таким образом, это добавляет 0.
Объект закрытия имеет состояние. Он возвращает большее число каждый раз, когда вы его вызываете.
Теперь вы, возможно, не знакомы с C++ 11/14 lamnda.
auto create_counter(int x=1){
int count=0;
return [x,count]()mutable{
int r=count;
count+=x;
return r;
};
}
Является
struct counter {
int x,count;
int operator()(){
int r=count;
count+=x;
return r;
};
};
counter create_counter(int x=1){
return {x,0};
}
с некоторыми синтаксическими.
Я исправил то, что кажется синтаксической ошибкой в исходном коде. Я не эксперт, поэтому, возможно, я ошибся.
Как и в сторону, краток создать счетчик выглядит следующим образом:
auto create_counter(int x=1){
return [=,count=0]()mutable{
int r=count;
count+=x;
return r;
};
}
Вы имеете в виду '(+ ((создание-счетчик)) ((создать счетчик)) ...)', верно? С одним набором круглых скобок вокруг 'create-counter' я ожидал бы ошибку, потому что вы пытаетесь добавить lambdas. – sepp2k
Когда вы говорите «не работает и дает мне 0» ... что вы ожидаете от последнего выражения? – uselpa
@ sepp2k: если только 1 круглые скобки, функция возвращает определение процедуры am i correct? – kp2349