Natürlich in C++, rufen jede Funktion können Sie es auf eine Kennung irgendwo zu binden zu nennen, einfach zu Syntax Zwänge zurückzuführen ist. Aber wenn Sie Parameter als ausreichend ungenannt akzeptieren, dann ist es möglich, eine Version des y-Kombinators in C++ zu erstellen, die gut rekursiert, ohne "benannt" zu sein.
Nun, das ist wirklich hässlich, weil ich nicht weiß, wie man eine typedef for a recursive lambda macht. Es benutzt also nur eine Menge Missbrauch. Aber es funktioniert, und druckt FLY!!
, bis es wegen Stack-Überlauf segregiert.
#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);
});
}
Die beiden Lambda-Ausdrücke sind im Sinne unbenannte, dass weder explizit Namen überall zugeordnet ist. Das zweite Lambda ist das eigentliche Arbeitspferd, und es nennt sich im Grunde genommen das erste Lambda, um sich in Form des Parameters auf sich selbst zu beziehen.
Hier ist, wie Sie diese nutzen würde etwas „nützlich“ zu tun:
#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;
}
Verwenden Sie den [Fixpunktkombinator] (http://stackoverflow.com/questions/152084/fixed-point-combinators-in-c) und Sie können jede Funktion in eine rekursive Funktion umwandeln. – didierc
Wollte Sie keine Kennung, oder meinten Sie wirklich anonym?C++ kann nicht-anonyme Namen haben, die aus _ Bezeichnern bestehen, aber selbst keine Bezeichner sind. –
Mit keinem Bezeichner meine ich keinen Variablennamen – user1233963