2014-03-05 18 views
7

Ich komme aus einem funktionalen Programmierhintergrund und denke zuerst über rekursive Lösungen für Probleme statt iterative Lösungen. Ich fange an, mit Rebol ein bisschen zu arbeiten (speziell R3) und habe eine Lösung für den Primfaktor Kata geschrieben, indem ich eine tailrekursive Funktion mit einem Akkumulator benutze. Aber bei genügend großem Input blase ich den Stack. Ich habe ein Skript für Rebol2 namens "tail-func.r", das eine Version der Tail-Call-Optimierung implementiert, dass AFAIK nicht nach R3 portiert wurde. Ich weiß, dass Rebol 3 in vielen Fällen Dinge anders als R2 implementiert, also gibt es eine Möglichkeit, TCO in Rebol 3 ohne zusätzlichen Code zu bekommen? Wenn nicht, gibt es einen einfacheren Weg, um es zu bekommen, ohne das alte Skript zu portieren?Rebol Tail Call Optimierung

Edited meinen Code hinzuzufügen:

primefactors: function [n m factors] [ 
    either n > 1 
    [ either (modulo n m) == 0 
     [ primefactors (n/m) m (append factors m) ] 
     [ primefactors n (m + 1) factors ] ] 
    [ factors ] 
    ] 

    primefactors 30 2 (copy []) => [2 3 5] 
+0

Können Sie ein einfaches Code-Snippet als Beispiel angeben? – johnk

+0

Sicher, ich habe meine Beispiel-Primfaktor-Implementierung hinzugefügt. – teyvk

Antwort

3

Nicht ohne Code, sorry. Rebol ist nicht kompiliert, es gibt also keine Möglichkeit vorher genau zu wissen, was einen Tail Call ausmacht. Selbst Aufrufe an die return-Funktion verbreiten sich schnell, aber nicht durch einen Goto, in den Call-Stack.

IIRC der Autor von tail-func arbeitet jetzt an Rebol 3, und ob er es tut, sollte leicht zu portieren sein. Jetzt, wo du es erwähnst, werde ich es mir ansehen. Funktionsgeneratoren und Präprozessoren sind in Rebol einfach zu bedienen.

+0

Ah, die nicht kompilierten Teil macht Sinn. Ich bin es gewohnt, dass Implementierungen, die mindestens eine Optimierung durchführen, den Code passieren und dann die Zwischenergebnisse interpretieren (oder Maschinencode generieren). – teyvk