【问题标题】:How to ignore a return value in Common Lisp如何忽略 Common Lisp 中的返回值
【发布时间】:2018-02-20 23:58:32
【问题描述】:

我正在使用一些调用 ADJUST-ARRAY 的代码。我从 Lisp 解释器 (CMUCL) 收到一条警告消息,指出不应忽略 ADJUST-ARRAY 的返回值。

如果我没记错的话,在我正在编写的代码中,ADJUST-ARRAY 会修改它的参数。所以没有必要对返回值做任何事情。有没有指定的方法来忽略 Common Lisp 中的返回值?当然,我可以将返回值分配给某个变量,然后忽略该变量。但这感觉很笨拙。

我还可以将返回值分配给 ADJUST-ARRAY 参数,例如:

(setq my-array (adjust-array my-array ...))

但这似乎表明我不确定 ADJUST-ARRAY 是否会修改 MY-ARRAY。

欢迎任何建议,在此先感谢。

【问题讨论】:

  • ADJUST-ARRAY 不需要总是修改参数数组。来自hyperspec:“结果是一个与数组具有相同类型和等级的数组,即修改后的数组,或者是一个新创建的数组,可以将数组替换到该数组中,并且具有给定的新维度。”
  • 有没有办法预测返回的是修改后的数组还是新的数组?也就是说,ADUST-ARRAY 是否总是在某些情况下返回修改后的数组,而在其他情况下总是返回一个新数组。
  • 规范没有指定必须做其中一个或另一个的情况。 ADJUSTABLE-ARRAY-P 将为可能就地修改的数组返回true,但规范实际上并没有说必须就地修改数组。这取决于实施。
  • 回答原始问题可能也很有用。通常可以隐藏编译器警告,具体警告是非标准的。

标签: lisp common-lisp


【解决方案1】:

你是对的。正如the documentation 所说:

结果是一个与数组同类型同秩的数组,即 修改后的数组,或新创建的数组到哪个数组 可以移位,并且具有给定的新维度。

如果结果是一个新创建的数组,那么该函数当然不会对参数产生没有影响

Common Lisp 几乎总是要求您使用返回的值而不是旧的绑定来获得可移植的代码。

【讨论】:

  • 我将更改代码以便使用返回值。感谢您的帮助。
【解决方案2】:

adjust-array的规范是调整后的数组就是返回的那个。

之后您可以期望的参数数组有点复杂,并且在某些情况下可能会因实现而有所不同。

只需使用返回的那个。您可以使用setf 修改或使用let 创建绑定。

【讨论】:

  • 是的,我将更改代码以便使用返回值。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-06
  • 1970-01-01
  • 2012-12-11
  • 1970-01-01
  • 2018-04-02
相关资源
最近更新 更多