【问题标题】:Usage of defparameterdefparameter的使用
【发布时间】:2019-03-15 03:49:52
【问题描述】:

我不知道是不是因为我对 defparameter 宏的核心部分不了解。

所以,这给出了一个奇怪的错误。我开始:

(defparameter *x* #(1 4 7))
(defparameter *y* #(2 3 55))

一切都很好,但是这样:

(defparameter *res* (make-array * :adjustable t :fill-pointer 0))

给出了一个错误,我根本没有得到:

 The value                                                                       
 *Y*                                                                           
 is not of type                                                                  
 (OR (MOD 4611686018427387901) CONS NULL)                                      
 when binding SB-VM::DIMENSIONS
    [Condition of type TYPE-ERROR]

【问题讨论】:

    标签: global-variables lisp common-lisp read-eval-print-loop


    【解决方案1】:

    * 计算为最后一个计算值,也就是 that of 符号 *Y*,它是一个数组 #(2 3 55)

    但是make-array 期望它的第一个参数指定 创建的数组的“维度”:

    制作数组 尺寸和关键元素类型初始元素初始内容
    可调整的填充指针位移到位移索引偏移量

    => 新数组

    参数和值:

    dimensions---一个designator,用于有效数组维度列表

    ...一个列表

    (强调我的)。有些列表是nulls,有些是conses。但不是 arrays 符号。

    因为它需要一个列表designator,即

    一个非零原子(表示一个单例列表,其元素是那个非零原子)或一个正确的列表(表示它自己),

    另一种可能性是整数。

    【讨论】:

    • *y* 是一个符号,而不是一个数组(恰好是该符号的值)。
    • @RainerJoswig 会教我不要在没有测试的情况下回答(希望如此)。谢谢! (最终结果是一样的,它不是一个列表——也不是一个数字;))
    • 这很重要,因为它有助于理解错误消息。错误消息的真正含义是符号*y*
    • @WillNess:这将是 值 #(1 2 3) 不是...
    • @RainerJoswig 你是对的。它在那里说:“价值*Y*”...... d'oh!非常感谢您的澄清。
    【解决方案2】:

    关于错误消息中的mod,这是一个类型说明符:(mod 4611686018427387901) 表示“0 到 4611 之间的整数...”,大数字是array-dimension-limit

    【讨论】:

      【解决方案3】:
      CL-USER 28 > (defparameter *y* #(2 3 55))
      *Y*
      
      CL-USER 29 > *
      *Y*
      

      *的值是最后一个顶级评估结果的第一个值。

      在您的情况下,该值为*y* - 一个符号。然后您调用MAKE-ARRAY 并使用该符号作为第一个参数。 MAKE-ARRAY 不需要符号 - 因此错误:

      The value                                                                       
       *Y*                                                                           
       is not of type                                                                  
       (OR (MOD 4611686018427387901) CONS NULL)                                      
       when binding SB-VM::DIMENSIONS
          [Condition of type TYPE-ERROR]
      

      错误的意思是:符号*y* 既不是数字(具有一定的最大大小)也不是列表。记住*y* 是评估* 的结果。

      【讨论】:

      • 这是 CLHS 中的一个错误,关于那里也接受单个数字吗?措辞似乎将其排除在外,但该页面底部的示例包括此类用途。
      • @WillNess:不,它说 一个列表的指示符... 。单个数字是具有该数字的列表的指示符。请参阅词汇表中的列表指示符。你会在 Common Lisp 的很多地方找到 designators 的概念。
      • 是的,我确实尝试过这样做,但是我看不到任何关于列表指示符的具体内容,无论如何都没有通过点击。实际上,“列表指示符”就是那个条目;必须手动找到它。
      • @WillNess:是的,如果“列表指示符”提到并链接“列表指示符”会更有帮助。因此,您必须手动将类型放在“指示符”前面。例如:字符串指示符、列表指示符、...
      • 这是未链接的glossary entry。它可能与谁有关。
      猜你喜欢
      • 1970-01-01
      • 2021-12-24
      • 2012-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多