Emil: JS rekursive Aufrufe

hi, gibts eine Möglichkeit den rekursiven Aufruf aus der Funktion heraus mit this zu notieren? Mein Versuch this(args) hat leider nicht funktioniert. Issue: Funktion umbenennen. MFG

  1. hi, gibts eine Möglichkeit den rekursiven Aufruf aus der Funktion heraus mit this zu notieren? Mein Versuch this(args) hat leider nicht funktioniert. Issue: Funktion umbenennen. MFG

    In Javascript? Nein, nur wenn ein Zeiger auf die Funktion selbst definiert ist.

    var fkt = (a) => {
    _self = this;
    
    // do something
    
    if (cond) { foo = this._self(x); }
    
    return bar;
    }
    

    Ungetestet, sollte aber so oder ähnlich aussehen.

    Gruß
    Jo

  2. Hallo Emil,

    hi, gibts eine Möglichkeit den rekursiven Aufruf aus der Funktion heraus mit this zu notieren? Mein Versuch this(args) hat leider nicht funktioniert. Issue: Funktion umbenennen. MFG

    Nein. arguments.callee ist inzwischen deprecated, seitdem kann man sowas nur über einen Combinator nachbauen (z.B. einen U combinator):

    const U = f => f(f);
    const faculty = U(f => x => x === 0 ? 1 : x * U(f)(x - 1));
    console.log(faculty(5))
    

    LG,
    CK

    1. Hallo Christian,

      Nein. arguments.callee ist inzwischen deprecated, seitdem kann man sowas nur über einen Combinator nachbauen (z.B. einen U combinator):

      const U = f => f(f);
      const faculty = U(f => x => x === 0 ? 1 : x * U(f)(x - 1));
      console.log(faculty(5))
      

      Wenn ich so drüber nachdenke, wäre ein Y combinator besser geeignet:

      const U = f => f(f);
      const Y = U(h => f => f(x => U(h)(f)(x)));
      const faculty = Y(f => x => x === 0 ? 1 :  x * f(x - 1));
      
      console.log(faculty(5));
      

      faculty wird dadurch einfacher verständlich.

      Wen die verschieden combinator-Arten interessieren, dem kann ich da nur die Wikipedia ans Herz legen; leider ist die deutsche Variante davon wirklich schlecht 😟

      LG,
      CK

      1. Wen die verschieden combinator-Arten interessieren, dem kann ich da nur die Wikipedia ans Herz legen

        Ich hab den Y-Combinator in meiner Bachelor-Arbeit gebraucht, um zu zeigen, dass meine rein funktionale Teilmenge von JavaScript turing-vollständig ist.

        Seit einiger Zeit arbeite ich außerdem an einer kleinen Spielzeug-Programmiersprache, die rein auf kombinatorischer Logik basiert und für Theorem-Proving benutzt werden kann. Inspiriert durch Joy und Kitten, allerdings absichtlich nicht turing-vollständig, um die Konsistenz des Beweis-Systems zu bewahren. Das ist im Moment die größte Schwierigkeit des Problems. Man glaubt nicht, wie schnell man aus Versehen ein System turing-vollständig macht und die Logik dadurch inkonsistent wird.

  3. Hallo Emil,

    this bezeichnet niemals die Funktion selbst, damit kommst Du also nicht weiter.

    Die anderen haben Arrow-Funktioen verwendet, mir ist aber jetzt nicht aufgefallen, dass das für Dich eine Voraussetzung ist. Vor allem ist die Anwendung von U oder Y Kombinatoren etwas, wobei sich mir die Fußnägel aufrollen, das scheint ganz tief aus der Trickkiste der funktionalen Theorie zu kommen.

    Eine reguläre benannte Funktion willst Du sicherlich nicht haben. Damit wär's ja trivial.

    Aber auch eine anonyme Funktion kann einen lokalen Namen haben, der dann nur in dieser Funktion bekannt ist. Das geht so:

    let fak = function fakultät(x) { return x * fakultät(x-1); }
    
    console.log(fak(3));      // 6
    console.log(fakultät(3)); // Error, fakultät unbekannt
    

    Sowas kann auch Methode eines Objekts sein oder eine Funktion, die als Parameter übergeben wird:

    let obj = {
       fak: function fakultät(x) { return x * fakultät(x-1); }
    };
    
    someOtherFunc(function fakultät(x) { return x * fakultät(x-1); });
    

    Bei Methoden musst Du bei diesem Vorgehen aufpassen - sobald der rekursive Abstieg beginnt ist das this des Objekts nicht mehr definiert.

    Ob das so passt, kann ich ohne Kenntnis der Umstände, unter denen Du das brauchst, nicht sagen.

    Rolf

    --
    sumpsi - posui - clusi
    1. Hallo Rolf,

      Die anderen haben Arrow-Funktioen verwendet, mir ist aber jetzt nicht aufgefallen, dass das für Dich eine Voraussetzung ist.

      Die Fat-Arrow-Functions habe ich nur verwendet, weil sie kürzer zu schreiben sind. Das ist keine Voraussetzung für die Kombinatoren.

      Vor allem ist die Anwendung von U oder Y Kombinatoren etwas, wobei sich mir die Fußnägel aufrollen, das scheint ganz tief aus der Trickkiste der funktionalen Theorie zu kommen.

      So tief ist das gar nicht. Auf Kombinatoren baut vieles auf in der funktionalen Programmierung. React und Vue etwa verwenden häufig compose. Letztlich muss man nur wissen, was sie machen – selber implementieren muss man sie eigentlich nie. Dafür gibt es bereits fertige Module.

      LG,
      CK

  4. Mittlerweile finde ich es besser, den Aufruf aus der Funktion heraus namentlich zu notieren. Wegen Verständnis und Lesbarkeit. MFG