为了账号安全,请及时绑定邮箱和手机立即绑定

为什么此函数每次都返回不同的值?

为什么此函数每次都返回不同的值?

狐的传说 2019-10-21 15:38:44
有人可以解释以下行为吗?具体来说,为什么函数每次都返回不同的列表?为什么没有some-list在'(0 0 0)每次调用该函数时进行初始化?(defun foo ()  (let ((some-list '(0 0 0)))    (incf (car some-list))    some-list))输出:> (foo)(1 0 0)> (foo)(2 0 0)> (foo)(3 0 0)> (foo)(4 0 0)谢谢!编辑:另外,假设我希望'(1 0 0)每次输出该功能,建议的实现此功能的方法是什么?
查看完整描述

3 回答

?
米脂

TA贡献1836条经验 获得超3个赞

'(0 0 0)是一个文字对象,假定它是一个常量(尽管不受修改)。因此,您每次都在有效地修改同一对象。要在每个函数调用中创建不同的对象,请使用(list 0 0 0)

因此,除非您知道自己在做什么,否则应始终仅将文字列表(如'(0 0 0))用作常量。


查看完整回答
反对 回复 2019-10-21
?
慕神8447489

TA贡献1780条经验 获得超1个赞

附带说明一下,在sbcl REPL中定义此功能会收到以下警告:


  caught WARNING:

    Destructive function SB-KERNEL:%RPLACA called on constant data. 

    See also: 

      The ANSI Standard, Special Operator QUOTE 

      The ANSI Standard, Section 3.2.2.3

这很好地提示了当前的问题。


查看完整回答
反对 回复 2019-10-21
  • 3 回答
  • 0 关注
  • 533 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信