2016-04-06 19 views
5

Użyłem poniższy przykład, aby przetestować połączenia ogon rekursji z Babel i es2016 Preset:Czy Babel z ustawieniem wstępnym "es2016" implementuje optymalizację połączeń?

'use strict'; 

try { 
    function r(n) { 
     if (n%5000===0) 
      console.log(`reached a depth of ${n}`); 
     r(n+1); 
    } 
    r(0); 
} catch (e) { 
    if (!(e instanceof RangeError)) 
     throw e; 
    else 
     console.log('stack blown'); 
} 

Mój plik package.json jest:

{ 
    "name": "tail-call-optimization", 
    "version": "1.0.0", 
    "description": "", 
    "main": "index.js", 
    "scripts": { 
     "build": "babel es6 --out-dir es5 --source-maps", 
     "watch": "babel es6 --out-dir es5 --source-maps --watch", 
     "start": "node es5/app.js" 
    }, 
    "author": "", 
    "license": "ISC", 
    "devDependencies": { 
     "babel-cli": "^6.6.5", 
     "babel-core": "^6.7.4", 
     "babel-loader": "^6.2.4", 
     "babel-polyfill": "^6.7.4", 
     "babel-preset-es2016": "^6.0.10", 
     "babel-runtime": "^6.6.1" 
    }, 
    "dependencies": { 
     "babel-polyfill": "^6.7.4", 
     "source-map-support": "^0.4.0" 
    } 
} 

... i .babelrc jest prosta:

{ 
    "presets": ["es2016"] 
} 

Wykonanie powyższego za pomocą:

npm run build && npm run start 

... skutkuje następującym wyjścia konsoli:

reached a depth of 0 
reached a depth of 5000 
reached a depth of 10000 
reached a depth of 15000 
stack blown 

Rzeczywiście, patrząc na pliku transpiled w katalogu es5, nic sugerować, że TCO został wdrożony.

Czy brakuje mi czegoś?

Moja wersja węzła to 4.3.2.

Odpowiedz

0

Żadna z "oficjalnych" wtyczek/ustawień Babel 6 obecnie nie stosuje TCO. babel-preset-es2016 nie jest "oficjalnym" ustawieniem wstępnym. O ile TCO nie opiera się na obsłudze parsera w Babilonie (z góry mojej głowy nie sądzę, ale nie jestem pewien), to przypuszczam, że plugin/preset użytkownika może go zaimplementować, a może robi (ale nie to, co wiem z). Oto kwestia śledzenia ewentualnego "oficjalnego" ponownego wdrożenia: T2614. Jeśli ktoś chce dodać ten link do dokumentu Learn ES2015 @Marcus, napisz tutaj, a ja go scalę.

5

Patrząc na: https://babeljs.io/docs/learn-es2015/ jeden brzmi:

tymczasowo usunięte w Babel 6

Tylko wyraźne odniesienie własny ogon rekurencji był wspierany ze względu na złożoność i wydajności wpływu wspieranie ogon wzywa globalnie. Usunięto z powodu innych błędów i zostaną ponownie wprowadzone.

Sądzę, że nie jest to obecnie realizowane.

Powiązane problemy