2012-04-12 6 views
1

CoffeeScript의 컴파일 범위가 컴파일되는 JavaScript가 약간 다릅니다. 생성 된 JavaScript에서 차등을 따르는 데 어떤 이유가 있습니까?분수 반복 단계가 정수 단계가 아닌 다른 JavaScript로 컴파일되는 이유

순회

numbers = (i for i in [start..end] by 2) 

가로 컴파일 정수 단계로 범위 :

는 좀 더 복잡한 자바 스크립트를 생성

numbers = (i for i in [start..end] by 1/2) 
분수 단계에서 반복 할 때

for (i = start; i <= end; i += 2) { 
    _results.push(i); 
} 

그러나 :

,

그렇다면이 추가 이유는 start <= end입니까?

+1

https://github.com/jashkenas/coffee-script/issues/1356 – matyr

답변

1

마찬가지로 numbers = (i for i in [start..end])을 입력하면 똑같은 코드가 생성됩니다. CoffeeScript는 시작 또는 끝이 변수 일 때 범위가 어느 방향으로 향하는 지 알지 못하기 때문입니다. 컴파일러는 일정 단계가 제공되는 경우 더 간단한 코드를 출력하는 특별한 최적화 기능을 가지고 있지만 불행히도 1/2은 상수가 아닌 표현식으로 계산됩니다.

+0

'numbers = (i는 [start..end]가 2 인 경우)'CoffeeScript는 추가 조건을 추가하지 않습니다. 그래서 당신이 쓴 것처럼 그것은 특별한 최적화 인 것 같습니다. 그러나 또한 상수 표현을 포함시키는 것이 좋을 것입니다 ... – zbynour

1

Coffeescript는 1/2이 평가하는 것을 완전히 알지 못합니다. Math.random() - .5 일 수 있으며 스크립트의 특정 실행에 따라 달라집니다.

따라서 Coffeescript가 단계가 음수인지 아니면 양수인지를 알 수 없으므로 일정 단계의 부호보다는 시작 및 끝의 상대적인 위치에 따라 조건을 키 입력하기 만하면됩니다.

+0

예, 이해가되지만, 1/2은 상수 표현으로 인식 될 수 있습니다. – zbynour

+0

표현식을 허용하려면 그것이 순수하게 정수로 구성되어 있는지 확인해야합니다 - 너무 복잡합니다. –

+0

CoffeeScript는 컴파일러가 아닌 소스 변환기라는 것을 알아야합니다. 1/2이 상수 표현이라는 것을 발견하는 기계를 가지고 있지도 않으며 원하지도 않는다. (자바 스크립트 인터프리터가 필요하기 때문에). –

1

이것은 정수 대 분수가 아닌 상수 대 표현식입니다. 단계가 상수이면 (예 : 2) CoffeeScript는 컴파일시에 step이 양수인지 여부를 알고 올바른 코드를 출력합니다. 단계가 표현식이면 (예 : 1/2) 런타임에 양수인지 여부를 판별해야합니다.

불행히도 CoffeeScript는 작성 방법에 관계없이 분수를 표현식으로 인식하므로 ()이 문제를 피할 수있는 간단한 방법은 없습니다.

관련 문제