Naturalmente, in C++, per chiamare qualsiasi funzione dovete associarlo a un identificatore da qualche parte, semplicemente a causa di vincoli di sintassi. Ma, se si accettano parametri non sufficientemente definiti, è possibile creare una versione del combinatore y in C++ che ricorre in modo piacevole senza essere "denominato".
Ora, questo è davvero brutto perché non so come fare un typedef for a recursive lambda. Quindi usa solo un sacco di abuso di cast. Funziona e stampa FLY!!
fino a segoults a causa dello stack overflow.
#include <iostream>
typedef void(*f0)();
typedef void(*f)(f0);
int main() {
[](f x) {
x((f0)x);
} ([](f0 x) {
std::cout<<"FLY!!\n";
((f)x)(x);
});
}
I due lambda sono senza nome, nel senso che nessuno dei due è esplicitamente assegnato al nome. Il secondo lambda è il vero cavallo di battaglia, e sostanzialmente si chiama usando il primo lambda per ottenere un riferimento a se stesso nella forma del parametro.
Ecco come si potrebbe usare questo per fare un po ' "utile" di lavoro:
#include <iostream>
typedef int param_t;
typedef int ret_t;
typedef void(*f0)();
typedef ret_t(*f)(f0, param_t);
int main() {
/* Compute factorial recursively */
std::cout << [](f x, param_t y) {
return x((f0)x, y);
} ([](f0 x, param_t y) {
if(y == 0)
return 1;
return y*((f)x)(x, y-1);
}, 10) << std::endl;
}
Utilizzare il [combinatore di punti fissi] (http://stackoverflow.com/questions/152084/fixed-point-combinators-in-c) e si può trasformare qualsiasi funzione in ricorsiva. – didierc
Non volevi identificatore, o intendevi davvero anonimo?C++ può avere nomi non anonimi che sono _composti di_identificatori ma non sono essi stessi identificatori. –
Per nessun identificatore intendo nessun nome variabile – user1233963