第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

意外的數(shù)據(jù)持久性

意外的數(shù)據(jù)持久性

我有一個(gè)七個(gè)整數(shù)的列表,最初都是0,我們稱之為“數(shù)據(jù)”。在運(yùn)行程序的過程中,我想定期將其中一個(gè)整數(shù)的值遞增一。在程序結(jié)束時(shí)我打印數(shù)據(jù)。一切都很好,除了在程序的每次連續(xù)運(yùn)行中,上次運(yùn)行的所有數(shù)據(jù)值都被添加到此運(yùn)行的所有數(shù)據(jù)值中。我只想要來自此次運(yùn)行的數(shù)據(jù)值。無論數(shù)據(jù)是類的方法中的局部變量,類的方法調(diào)用的單獨(dú)函數(shù)中的局部變量,還是類的槽,都會(huì)發(fā)生這種意外行為。無論我是通過incf還是(setf value(1+ value))遞增數(shù)據(jù)的各個(gè)值,都會(huì)發(fā)生這種情況。當(dāng)我重新加載程序時(shí),數(shù)據(jù)重置為全零,但是當(dāng)我再次運(yùn)行程序時(shí),數(shù)據(jù)會(huì)再次添加所有的最后一次運(yùn)行' s數(shù)據(jù)到此運(yùn)行的數(shù)據(jù)。當(dāng)我增加其中一個(gè)數(shù)據(jù)值時(shí),我使用函數(shù)nth,其中index是另一個(gè)對(duì)象槽的值。什么可能導(dǎo)致我的“數(shù)據(jù)”列表的值不受歡迎的持久性?
查看完整描述

3 回答

?
侃侃無極

TA貢獻(xiàn)2051條經(jīng)驗(yàn) 獲得超10個(gè)贊

你在做這樣的事情:


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

引用的數(shù)據(jù)是文字?jǐn)?shù)據(jù); 它只有一個(gè)副本,修改它的后果是不確定的。上面的行為很常見,但你不能依賴它。有些編譯器會(huì)在您執(zhí)行此操作時(shí)發(fā)出警告。例如,在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的相關(guān)文本quote是:


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


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

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


4.1.2文字表達(dá)

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


3.4存儲(chǔ)模型

...在許多系統(tǒng)中,希望常量(即文字表達(dá)式的值)駐留在只讀存儲(chǔ)器中。為了表達(dá)這一點(diǎn),可以很方便地設(shè)想表示位置的每個(gè)對(duì)象都與一個(gè)標(biāo)志相關(guān)聯(lián),該標(biāo)志告訴該對(duì)象是可變的還是不可變的。在這樣的系統(tǒng)中,文字常量和symbol-> string返回的字符串是不可變對(duì)象,而本報(bào)告中列出的其他過程創(chuàng)建的所有對(duì)象都是可變的。嘗試將新值存儲(chǔ)到由不可變對(duì)象表示的位置是錯(cuò)誤的。


查看完整回答
反對(duì) 回復(fù) 2019-09-06
?
陪伴而非守候

TA貢獻(xiàn)1757條經(jīng)驗(yàn) 獲得超8個(gè)贊

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

查看完整回答
反對(duì) 回復(fù) 2019-09-06
?
臨摹微笑

TA貢獻(xiàn)1982條經(jīng)驗(yàn) 獲得超2個(gè)贊

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

查看完整回答
反對(duì) 回復(fù) 2019-09-06
  • 3 回答
  • 0 關(guān)注
  • 705 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)