J'ai une fonction récursive et l'épuisement de la pile d'appels est un problème que je rencontre parfois. Je sais que je peux utiliser des ruisseaux, des promesses avec Settimeout, mais je voudrais simplement écrire du code qui déclenche une optimisation des appels de queue. Jusqu'à présent, seul WebKit semble avoir mis en œuvre une optimisation des appels de queue (TCO) . Autre que connaître la théorie, est-ce que mon code vérifie si mon code déclenchera TCO, avec DevTools ou en examinant la sortie du compilateur WebKit? P>
3 Réponses :
pourrait utiliser p> .tostring () code>,
regexp.test () code> Pour vérifier
retour code> Énoncé suivi de SADERSCORE, ou $ signe, AZ personnages; suivi de parenthèses ouvertes suivie de tous les caractères suivis d'une parenthèse de fermeture
function forEach(arr, callback, start) {
if (0 <= start && start < arr.length) {
callback(arr[start], start, arr);
return forEach(arr, callback, start + 1); // tail call
}
}
console.log(/return [_a-z$]+\(.*\)/i.test(forEach.toString()))
Clever, mais je veux savoir si le moteur JS détecte B> et faire du TCO, pas si le moteur JS devrait B> être capable de faire du TCO. Pour l'instant, le moteur JS étant JavaScriptcore.
Mais puisque Regex est amusant, voici un test de test si une fonction est récursive; / fonction ([\ w] +) (?: [^] +) retour \ 1 \ (. * \ \) / code>. De plus, votre regex pourrait être amélioré pour couvrir les noms de fonction avec des chiffres dans ceux-ci
/ retourner [\ w $] + \ (. * \ \) / Code>. Et une version au courant de l'unicode serait
/ retourner [\ w $] + \ (. * \ \) / U code> pour es6.
Vous pouvez toujours le faire dans la fonction récursive de la queue de chemin la plus idiote - Essayez de prendre un bloc avec des arguments «gros». Si cela jette, TCO ne fonctionne pas. p>
Je sais que ce n'est pas parfait, mais je pense que c'est la meilleure option que nous avons actuellement.
Considérons cette fonction: p> à partir de maintenant, cela renvoie p> error.stack Code> n'est pas standard, mais il dispose d'un soutien de base dans tous les navigateurs modernes. Il a des valeurs différentes dans différents navigateurs, néanmoins, quand une fonction de fonction nommée plus longue est une balance plus courte nommée, la trace de la pile: p>
true code> pour Safari et
false code> pour les autres navigateurs, qui est le support TCO actuel. P>
Is TCO available?
<div id="result"></div>
C'est très intelligent. Je veux attendre un peu avant d'accepter cette réponse. Il ne doit pas donner de faux positifs et puisque JavaScriptcore est le seul moteur avec Un support de TCO infligible i> TCO, il est difficile de tester.
@DotNetCarpenter Sure Thing. Faites-moi savoir comment ça marche.
@DotNetCarpenter, nœud donne une réponse positive aussi, si vous l'exécutez avec le paramètre - harmonie code>.
Je viens de tester cela dans le nœud 7.5.0 et 6.7.0, sans le drapeau - harmonie code> et les deux environnements renvoyés
true code> pour
détectent () code> . Dans quelle version du nœud V8 a-t-il soutenu TCO?
Wow. Il est. Je n'en avais aucune idée. Je ne peux pas sembler trouver la date de sortie.
Très intelligent en effet. Cela devrait être la réponse acceptée.
Cela revient vrai au chrome 72.