我正在测试中的代码这个有趣的答案 https://stackoverflow.com/a/6866155/768472.
CL-USER> (defun literal-cons ()
(let ((cons '(1 . 2)))
(incf (cdr cons))
cons))
; in: DEFUN LITERAL-CONS
; (INCF (CDR CONS))
; --> LET*
; ==>
; (SB-KERNEL:%RPLACD #:CONS1 #:NEW0)
;
; caught WARNING:
; Destructive function SB-KERNEL:%RPLACD 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
LITERAL-CONS
CL-USER> (literal-cons)
(1 . 3)
CL-USER> (literal-cons)
(1 . 3)
CL-USER> (literal-cons)
(1 . 3)
由于行为不一样,我想知道 SBCL 是否已使用上述警告将行为更改为它认为用户更可能期望的行为?预期的:
TEST> (defun literal-cons ()
(let ((cons '(1 . 2)))
(incf (cdr cons))
cons))
LITERAL-CONS
TEST> (literal-cons)
(1 . 3)
TEST> (literal-cons)
(1 . 4)
TEST> (literal-cons)
(1 . 5)
简短的回答是,是的,这是特定于实现的行为。正如中所讨论的意外的数据持久性 https://stackoverflow.com/q/18790192/1281433,
相关文本来自 HyperSpecquote http://www.lispworks.com/documentation/HyperSpec/Body/s_quote.htm is:
如果文字对象(包括引用的
对象)被破坏性地修改。
这意味着any您从此类函数中看到的行为是特定于实现的(即使某些行为在实现中比其他行为更常见)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)