亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么此函數每次都返回不同的值?

為什么此函數每次都返回不同的值?

狐的傳說 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 關注
  • 611 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號