【问题标题】:How to declare the type of a loop variable如何声明循环变量的类型
【发布时间】:2017-03-21 21:01:31
【问题描述】:

我想做一些整数运算,并且正在检查如果我提供关于我使用的值的type 的明确信息,SBCL 是否可以获得更快的速度。虽然我可以很容易地在defunlet 中直接使用declare 来执行此操作,但我不明白将语句放在loop 构造中的哪个位置。

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

存根示例可能如下所示:

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

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

【问题讨论】:

    标签: loops common-lisp type-declaration


    【解决方案1】:

    对于像fixnumfloattnil 这样的简单类型,您可以在 FOR 子句中的变量后面写上类型。您还可以在 numeric-accumulation 子句 中添加类型,例如 sum 子句:

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

    【讨论】:

    • 省略 of-type 使代码简洁,但是,IMO,less 可读。
    • @sds:我一直使用它。由于只有 FIXNUM 和 FLOAT 对短符号有意义,所以我看不到任何可读性问题。 OF-TYPE 符号在我见过的代码中比较少见。
    • 我向你鞠躬 :-)
    • @sds:只看一些应用程序,对于 fixnum 声明,使用 of-type 的情况很多,但肯定少于没有 of-type 的声明。
    【解决方案2】:

    使用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 声明为fixnums 是不够 确保fixnum 乘法(正方形 most-positive-fixnum 是 当然不是fixnum)。从而获得最快的可能 您需要声明 ij 的乘法 (unsigned-byte 1000)哪个 是否需要of-type

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

    【讨论】:

      猜你喜欢
      • 2014-06-06
      • 2017-10-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-28
      • 1970-01-01
      • 2012-02-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多