Discussion:
algoritmik olarak degisken tanimlama
Aykut Caglayan
2010-10-15 23:08:47 UTC
Permalink
Selamlar,

diyelim ki,
bir loop icinde
20 tane degisken adi yaratip, bunlara deger atamaya calisiyorum.

(loop for i from 0 to 20
do
(let (((string->symbol (string-append (symbol->string 'ken)
(number->string i))) (random 2.0)))
(eval (string->symbol (string-append (symbol->string 'ken)
(number->string i))))))

ancak bad variable diyor.

yani adlari
ken1
ken2
.
.
.
olan, variable'lari nasil turetebilirim?

Bu handikap nasil asilabilir?

Aykut
Emre Sevinc
2010-10-16 09:28:29 UTC
Permalink
Post by Aykut Caglayan
Selamlar,
diyelim ki,
bir loop icinde
20 tane degisken adi yaratip, bunlara deger atamaya calisiyorum.
Dizi, vektör, hash, vs. kullanmamanın özel bir sebebi var mı?


--
Emre
Aycan iRiCAN
2010-10-16 19:21:31 UTC
Permalink
Post by Emre Sevinc
Post by Aykut Caglayan
Selamlar,
diyelim ki,
bir loop icinde
20 tane degisken adi yaratip, bunlara deger atamaya calisiyorum.
Dizi, vektör, hash, vs. kullanmamanın özel bir sebebi var mı?
Katılıyorum, ne kadar çok intern, o kadar fazla yönetim maliyeti...

--
aycan

Volkan YAZICI
2010-10-16 18:45:00 UTC
Permalink
Post by Aykut Caglayan
diyelim ki,
bir loop icinde
20 tane degisken adi yaratip, bunlara deger atamaya calisiyorum.
Tam olarak ne yapmaya çalıştığınızı söylerseniz daha fazla yardımcı
olabiliriz. Yaptığınız iş bana iki şeyin kokusu gibi geliyor:

1) Scheme'in hygenic macro'larından haberdar değilsiniz.

2) Emre Sevinç önerdiği gibi bir collection (list, vector, vs.)
kullanacağınız yerde birden fazla değişken oluşturmaya
çalışıyorsunuz.

Ama bu iki noktada da hata yapmadığınız varsayıp, sorunuzu yanıtlamaya
çalışacağım.
Post by Aykut Caglayan
(loop for i from 0 to 20
do
(let (((string->symbol (string-append (symbol->string 'ken) (number->string i))) (random 2.0)))
(eval (string->symbol (string-append (symbol->string 'ken) (number->string i))))))
ancak bad variable diyor.
yani adlari
ken1
ken2
.
.
.
olan, variable'lari nasil turetebilirim?
Symbol'leri string->symbol ile namespace'inize (ki Scheme'de tek bir
namespace var) intern (dahil?) edebilirsiniz. Sizin buradaki probleminiz
symbol'e değer atamaya çalışmanız, halbuki istediğiniz şey symbol'un
işaret ettiği variable'a değer atamak. Yani, yukarıdaki kod aslında

(let ((ken1 ...) ...) ...)

olacağı yerde

(let (('ken1 ...) ...) ...)

oluyor.
Post by Aykut Caglayan
Bu handikap nasil asilabilir?
Evvela şunu söylemek gerekir ki, `let' ile `identifier'ların işaret
ettiği değişken değerlerini kullanabilirsiniz. Sizin istediğiniz şekilde
bir şeyi Common Lisp'te şu şekilde yapabilecekken

(setf (symbol-value "x") "new value")

benzer bir şey Scheme'de şuna takabül ediyor:

(eval `(set! ,(string->symbol "x") "new value"))

Ve eğer yamulmuyorsam (ya da hala yamulmadıysam) bu her Scheme
implementation'da düzgün çalışmaz.


İyi çalışmalar.
Loading...