如何声明循环变量的类型

Mar*_*ann 3 loops common-lisp type-declaration

我想做一些整数运算,并在检查SBCL是否可以提高速度(如果我提供有关所type使用的值的明确信息)。虽然我很容易declare在中使用defunlet直接使用它,但是我不知道将语句放在loop构造中的什么位置。

我遇到了iterate提供此类可能性的软件包文档,但希望暂时坚持使用。

一个存根示例可能如下所示:

(loop :for i from 1 upto 100 :collect
  (loop :for j from i upto 100
    :collect (* i j)))
Run Code Online (Sandbox Code Playgroud)

我怎样才能告诉Lisp i并且j是类型fixnum

sds*_*sds 5

用途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)))
Run Code Online (Sandbox Code Playgroud)

另外,WITH子句的示例也不错。

就像莱纳说,你可以省略of-type为简单的类型,例如,fixnumfloat,但违反了“节奏” loop,从而loop与用户的形式交替的关键词。

还要注意,声明ij成为fixnums是足够的,以确保fixnum乘(平方most-positive-fixnum肯定不是一个fixnum)。因此,为了获得最快可能倍增,你将需要申报i,并j(unsigned-byte 1000)确实需要of-type

当然,所有这些都没有必要。编译器应该足够聪明。:-)


Rai*_*wig 5

对于简单的类型一样fixnumfloatt并且nil你可以只写FOR子句中的变量之后的类型。您还可以在数字累加子句中添加一个子句之类的类型sum

(loop for i fixnum below 10
      for j fixnum from 1 
      sum (* i j) fixnum)
Run Code Online (Sandbox Code Playgroud)