2017-03-21 10 views
2

정수 계산을 수행하고 내가 사용하는 값의 type에 대한 명시적인 정보를 제공하면 SBCL이 더 많은 속도를 낼 수 있는지 확인하고 싶습니다. 을 defun 또는 let에 직접 사용할 수는 있지만 loop 구문 내에서 구문을 어디에 넣어야하는지 이해할 수 없습니다.루프 변수 유형을 선언하는 방법

iterate 패키지의 설명서를 보았지만 그러한 가능성은 있지만 루프를 고수하고 싶었습니다.

스텁 예는 다음과 같이 수 :

(loop :for i from 1 upto 100 :collect 
    (loop :for j from i upto 100 
    :collect (* i j))) 

가 어떻게 ij는, 예를 들어 있습니다 리스프 것을 알 수 있습니다 유형 fixnum?

답변

4

fixnum, float, tnil과 같은 간단한 유형의 경우 FOR 절에 변수 뒤에 형식을 쓸 수 있습니다. * 적은 * 읽기, IMO, type`가의 코드 간결하게

(loop for i fixnum below 10 
     for j fixnum from 1 
     sum (* i j) fixnum) 
+0

생략을':하지만, 당신은 또한 sum 절 같은 숫자 축적 절의 유형을 추가 할 수 있습니다. – sds

+0

@sds : 나는 항상 그걸 사용합니다. FIXNUM과 FLOAT만이 짧은 표기법에 대해 이해가되기 때문에, 나는 가독성 문제를 보지 못합니다. OF-TYPE 표기법은 내가 본 코드에서 비교적 드뭅니다. –

+0

나는 당신에게 활을 012다 :-) – sds

4

사용 of-type :

(loop :for i of-type fixnum from 1 upto 100 :collect 
    (loop :for j of-type fixnum from i upto 100 
    :collect (* i j))) 

는 또한, Examples of WITH clause 좋은입니다. 라이너 말했듯이

, 당신은 간단한 유형 of-type를 생략 할 수 있습니다 예를 들어, fixnumfloat, 하지만 사용자 형태의 loop 이에는 loop 키워드 대체의 "리듬"을 위반합니다.

참고도 fixnum들 수 ij 선언하는 것은 fixnum 승산 보장하기에 충분한 (정방형의 most-positive-fixnum 을 확실히 아닌 fixnum이다) 된다. 따라서 (unsigned-byte 1000)하는 of-type을 필요로하지 될 당신이 ij를 선언해야 가장 빠른 곱셈을 얻을 수 있습니다.

물론이 전부는 필요하지 않습니다. 컴파일러 이 충분히 똑똑해야합니다. :-)