>>>>> "ES" == Emre Sevinc <[EMAIL PROTECTED]> writes:
[...]
    ES> Tabii bu UCW belgesi ile alakasi yok merak ettim fark nasil
    ES> gösterilir diye. "quote" special operator ile "list"
    ES> fonksiyonu kullanilarak olusturulan liste arasinda ne fark
    ES> var? Tek ve basit bir hareketle nasil gösterilir?

Garantili degil ama sbcl icin, mesela:

CL-USER> (defun test () (let ((foo '(1 2 3))) (print foo) (rplaca foo 3) (print 
foo))) 
; in: LAMBDA NIL
;     (RPLACA FOO 3)
; --> LET PROGN SETF 
; ==>
;   (SB-KERNEL:%RPLACA #:ONCE-ONLY-0 3)
; 
; 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
TEST
CL-USER> (test)

(1 2 3) 
(3 2 3) 

(3 2 3)
CL-USER> (test)

(3 2 3) 
(3 2 3) 
(3 2 3)


Compiler quoted listleri sabit data olarak kullanabiliyor, degisiklik 
yapilirsa programin kendisi degismis oluyor.  Yukaridaki fonksyon ikinci 
defa cagirildiginda o program sourceunda gordugunuz (1 2 3) (3 2 3) haline
gelmis oluyor mesela.  Eski FAQ'da bununla ilgili birsey vardi, ama 
bakmadim simdi.  SBCL yakaladi zaten gordugunuz gibi, ama yakalamasi sart 
degildi.  

Bu da lispworks mesela:

CL-USER> (defun test1 () (let ((foo '(1 2 3))) (print foo) (rplaca foo 3) 
(print foo))) 
TEST1

CL-USER> (pprint #'test1)

#.#'(LAMBDA ()
      (DECLARE (LAMBDA-NAME TEST1))
      (BLOCK TEST1
        (LET ((FOO '(1 2 3))) (PRINT FOO) (RPLACA FOO 3) (PRINT FOO))))
; No value
CL-USER> (test1)

(1 2 3) 
(3 2 3) 
(3 2 3)
CL-USER> (pprint #'test1)

#.#'(LAMBDA ()
      (DECLARE (LAMBDA-NAME TEST1))
      (BLOCK TEST1
        (LET ((FOO '(3 2 3))) (PRINT FOO) (RPLACA FOO 3) (PRINT FOO))))
; No value
CL-USER> 

Program sourecunun bulunmasi sart degil tabii:

CL-USER> (compile 'test1)
TEST1
NIL
NIL
CL-USER> (test1)

(3 2 3) 
(3 2 3) 
(3 2 3)
CL-USER> (pprint #'test1)

#<function TEST1 2071286A>
; No value
CL-USER> 

Baska bir suru ornek de dusunulebilir, simdi aklima bu geldi sadece.  Bu 
yeni baslayanlarin sIkca yapabildikleri bir hata cunku.

BM


_______________________________________________
cs-lisp mailing list
[email protected]
http://church.cs.bilgi.edu.tr/lcg
http://cs.bilgi.edu.tr/mailman/listinfo/cs-lisp

Cevap