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

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

意外的數據持久性

意外的數據持久性

慕標琳琳 2019-09-06 15:55:20
我有一個七個整數的列表,最初都是0,我們稱之為“數據”。在運行程序的過程中,我想定期將其中一個整數的值遞增一。在程序結束時我打印數據。一切都很好,除了在程序的每次連續運行中,上次運行的所有數據值都被添加到此運行的所有數據值中。我只想要來自此次運行的數據值。無論數據是類的方法中的局部變量,類的方法調用的單獨函數中的局部變量,還是類的槽,都會發生這種意外行為。無論我是通過incf還是(setf value(1+ value))遞增數據的各個值,都會發生這種情況。當我重新加載程序時,數據重置為全零,但是當我再次運行程序時,數據會再次添加所有的最后一次運行' s數據到此運行的數據。當我增加其中一個數據值時,我使用函數nth,其中index是另一個對象槽的值。什么可能導致我的“數據”列表的值不受歡迎的持久性?
查看完整描述

3 回答

?
侃侃無極

TA貢獻2051條經驗 獲得超10個贊

你在做這樣的事情:


CL-USER> (defun foo ()

           (let ((value '(1)))     ; '(1) is literal data

             (incf (car value))))

FOO

CL-USER> (foo)

2

CL-USER> (foo)

3

CL-USER> (foo)

4

CL-USER> (foo)

5

引用的數據是文字數據; 它只有一個副本,修改它的后果是不確定的。上面的行為很常見,但你不能依賴它。有些編譯器會在您執行此操作時發出警告。例如,在SBCL中:


CL-USER> (defun foo ()

           (let ((value '(1)))

             (incf (car value))))

; in: DEFUN FOO

;     (INCF (CAR VALUE))

; --> LET* 

; ==>

;   (SB-KERNEL:%RPLACA #:TMP1 #:NEW0)

; 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

; compilation unit finished

;   caught 1 WARNING condition

FOO

HyperSpec的相關文本quote是:


如果破壞性地修改文字對象(包括引用對象),則后果是不確定的。


創建可修改的列表,例如(list 1),不'(1)。在你遇到它之前,這是一個常見的陷阱。

在Scheme中也會發生同樣的事情,盡管對文檔的引用明顯不同。對于R 5 RS,文檔如下:


4.1.2文字表達

......如3.4節所述,使用像set-car這樣的變異程序來改變常量(即文字表達式的值)是錯誤的!或字符串集!


3.4存儲模型

...在許多系統中,希望常量(即文字表達式的值)駐留在只讀存儲器中。為了表達這一點,可以很方便地設想表示位置的每個對象都與一個標志相關聯,該標志告訴該對象是可變的還是不可變的。在這樣的系統中,文字常量和symbol-> string返回的字符串是不可變對象,而本報告中列出的其他過程創建的所有對象都是可變的。嘗試將新值存儲到由不可變對象表示的位置是錯誤的。


查看完整回答
反對 回復 2019-09-06
?
陪伴而非守候

TA貢獻1757條經驗 獲得超8個贊

要求發出警告。行為仍未定義。即使在某些情況下發出警告的實現中,我也看不到任何保證他們在所有情況下都這樣做。你的代碼是在你編譯的文件中嗎?或者您在REPL中輸入的內容?您可以寫信給SBCL郵件列表并詢問此具體案例。

查看完整回答
反對 回復 2019-09-06
?
臨摹微笑

TA貢獻1982條經驗 獲得超2個贊

另一個問題,如果我在SBCL中定義一個函數:(defun set-head (x v) (rplaca x v)),那為什么這個表達式(let ((x '(a b))) (set-head x 'z))不會引發警告?我在SBCL 1.2.7上測試它。

查看完整回答
反對 回復 2019-09-06
  • 3 回答
  • 0 關注
  • 697 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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