如何声明循环变量的类型

时间:2017-03-21 21:01:31

标签: loops common-lisp type-declaration

我想做一些整数运算,并且如果我提供有关我使用的type值的显式信息,则检查SBCL是否可以获得更快的速度。虽然我可以直接在declaredefun中使用let来执行此操作,但我不明白将该语句放在loop构造中的位置。

我遇到了iterate包的文档,它提供了这样的可能性,但是现在想要坚持循环。

存根示例可能如下所示:

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

我如何告诉Lisp ij是例如类型为fixnum

2 个答案:

答案 0 :(得分: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还不错。

就像Rainer所说,你可以省略of-type的简单类型, 例如,fixnumfloat, 但这违反了loop loop关键字的“节奏” 与用户表格交替使用。

另请注意,将ij声明为fixnum s 不足 确保fixnum乘法(正方形 most-positive-fixnum是 肯定 a fixnum)。从而尽可能快地获得 乘法你需要声明ij (unsigned-byte 1000)哪个 需要of-type

当然,所有这一切都不是必要的。 编译器应该足够聪明。 : - )

答案 1 :(得分:4)

对于fixnumfloattnil等简单类型,您只需在FOR子句中的变量后面写入类型即可。您还可以在 numeric-accumulation子句中添加类型,如sum子句:

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