我想做一些整数运算,并且如果我提供有关我使用的type
值的显式信息,则检查SBCL是否可以获得更快的速度。虽然我可以直接在declare
或defun
中使用let
来执行此操作,但我不明白将该语句放在loop
构造中的位置。
我遇到了iterate
包的文档,它提供了这样的可能性,但是现在想要坚持循环。
存根示例可能如下所示:
(loop :for i from 1 upto 100 :collect
(loop :for j from i upto 100
:collect (* i j)))
我如何告诉Lisp i
和j
是例如类型为fixnum
?
答案 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
的简单类型,
例如,fixnum
和float
,
但这违反了loop
loop
关键字的“节奏”
与用户表格交替使用。
另请注意,将i
和j
声明为fixnum
s 不足
确保fixnum
乘法(正方形
most-positive-fixnum
是
肯定不 a fixnum
)。从而尽可能快地获得
乘法你需要声明i
和j
(unsigned-byte 1000)
哪个
需要of-type
。
当然,所有这一切都不是必要的。 编译器应该足够聪明。 : - )
答案 1 :(得分:4)
对于fixnum
,float
,t
和nil
等简单类型,您只需在FOR子句中的变量后面写入类型即可。您还可以在 numeric-accumulation子句中添加类型,如sum
子句:
(loop for i fixnum below 10
for j fixnum from 1
sum (* i j) fixnum)