July 19, 2012

Benim de ilgimi çekiyor ama derlenen bir dil olmaması ve yavaşlığından dolayı ilgim azalıyor. Hoş bu iki olumsuz yanı birbiriyle ilişkili. Belki biz Türkler yeterince destek verirsek neden D1'in ilk sürümleri gibi olmasın!

Asal sayılara ilgim olduğundan şu kodu ve bir de daha hızlı asal sayı bulan algoritmayı deneyim dedim. Örneğin yukarıdaki işlevi şu şekilde denediğimde 7 asal sayını göstermediğini tespit ettim:

(let a (: 2 20))
(let say 0)
(foreach i in a
   (if (= (isPrime i) 1)
      	(print i "\n")
   )
)
(print "\nToplam bulunan asallar: " say)

Çıktısı:'
2
3
5
11
13
17
19

Toplam bulunan asallar: 0'
Alıntı:

>

C:\Users\Netbook\Downloads\fuzuli-win_0.1-5>fuzuli
Fuzuli build Jun 12 2012 12:36:46

Kullandığım sürüm son sürüm ve Hakan hoca ile iletişime geçmeden evvel bir kaç şey daha denedim. Örneğin block içine almayı:

(let a (: 2 20))
(let say 0)
(foreach i in a
   (if (= (isPrime i) 1)
   	(block
      		(print i "\n")
      		(++say)
   	)
   )
)

Çıktısı:'
2
3
7
11
13
17

Toplam bulunan asallar: 6'

Gördüğünüz gibi bu sefer 5 ile 19 asal sayıları kayboldu. İlginçtir bunun karşılığında 7 asal sayısı geri geldi. Block kullanma sebebim ise anladığım kadarıyla 'if()''den önce yer alan parantez bizim alışık olduğumuz küme parantezi gibi değil. Yani sadece tek satıra duyarlı. Eğer block kullanmazsanız say değişkeni 13 oluyor. Bu bulunan asal sayının iki katından bir fazlası.

Şurada (http://ddili.org/forum/post/6893) bahsettiğim algoritmayı da çalıştıramadım. Aslında notasyona yabancıyım ve hiç sevmiyorum diyebilirim. Öyle ya dünya yüzeyinde kaç ülkede kullanılıyor ki! Yinede kendimi zorlayarak algoritmadaki döngüyü şu şekilde yaptım:

(for (let n 3) (<= (* n n) p) (+ n 2)

Ama sonra bunu tek başına çalıştırdığımda n sayısının tahmin ettiğim gibi artmadığını gördüm. Ben de C'den esinlenerek iki farklı değişkeni arttırabileceğimize göre şöyle yapabiliriz diye düşündüm ve tek sayıları ekrana yansıtabildim:

(for (let n 2) (<= n 19) (++n) (++n)

Dikkat ederseniz n sayısı 2'den başlıyor! Çok ilginç değil mi? Çünkü anladığım kadarıyla iki defa arttırma yapıyorsam 2 sayısı ilk (++n)'i gördüğünde 3, sonraki (++n)'i gördüğünde ise 4 olmalıydı. Ama ilginçtir ki 5 çıkıyor...:)

En son bu şekilde ASAL_MI işlevine uyarladığımda maalesef şöyle bir hata aldım:
Alıntı:

>
  5 [main] fuzuli 14572 exception::handle: Exception: STATUS_ACCESS_VIOLATION

5364 [main] fuzuli 14572 open_stackdumpfile: Dumping stack trace to fuzuli.exe.stackdump

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

July 19, 2012

@Salih;
O kodu yazarken çok kırılgan bir yapıda tasarlamışım. Öyleki asallığı test ederken kullandığımız sayılar sıfırdan başlıyor ve Fuzuli'de 0'a bölmek yasal. İşlemin sonucu inf olarak belirtiliyor. Sanırım bu yanlış, değil mi?
Sıkıntıyı düzelttim ve artık sorunsuz çalışıyor.

(function isPrime (params a)
   (block
       (let c 0)
   (foreach b in (: 1 a )
       (if (= 0 (% a b ))
           (++ c)
       )
   )
   (if (= c 2)
       (return 1)
       (return 0)
   )
   )
)
(let a (: 2 20))
(let say 0)
(foreach i in a
   (block
       (if (= (isPrime i) 1)
           (block
              (print i "\n")
              (++say)
           )
       )
   )
)
(print "\nToplam bulunan asallar: " say)

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

July 19, 2012

Fuzuli ye bir göz attım da hoşuma gitti deneyeceğim

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

July 19, 2012

Ben de şimdi gönderiyordum. :)
Malesef şu an için Fuzuli çok yavaş, ama ileride çok daha iyi olacağına eminim.
Blokların foreach için de kullanılması gerekli diye biliyorum, zira örnekte de öyle yapılmış. Bizim küme parantezli kapsamlarımız yerine geçiyor.
Bu arada konusu açılmışken söyleyeyim, Fuzuli'nin Türkçe çevirilerine başlandı ve gömülü(built-in) pakedi bitirildi.

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

July 19, 2012

Alıntı (Kadir Can):

>

@Salih;
O kodu yazarken çok kırılgan bir yapıda tasarlamışım. Öyleki asallığı test ederken kullandığımız sayılar sıfırdan başlıyor ve Fuzuli'de 0'a bölmek yasal. İşlemin sonucu inf olarak belirtiliyor. Sanırım bu yanlış, değil mi?
Sıkıntıyı düzelttim ve artık sorunsuz çalışıyor.

'foreach()''den sonra koyduğun fazladan block'un ne işe yaradığını anlayamadım. Ama 'isPrime()' içindeki 'foreach()''i 1'den başlatman sorunu kökünden çözmüş görünüyor. Bu benim dikkatimden kaçmıştı. Peki diğer algoritmayı (kareköküne kadar tarama for(n=3; n*n > p; n+=2) döngüsü ile) uyarlaman mümkün mü?

İlginçtir eski 0'a bölmeli algoritmada fazladan konulan block olmadığında (2, 3, 7, 11, 13, 17) asal sayıları bulunurken block dahil olduğunda 19 asal sayısının geldiğini ama 7, 13 asal sayılarının da çıktığını görüyorum. Demek ki sıfıra bölme ciddi kararsızlıklara sebep oluyor.

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

July 19, 2012

Bu kararsız durum hakkında Hakan hoca şöyle cevap yazmış:
Alıntı:

>

sanırım windows versiyonunu kullanıyorsun ve bunu derleyeli çok uzun zaman geçti. yavaş ve ilkel bir versiyon bu. son linux paketleri daha verimli çalışır.

Mehmet Hakan Satman
http://www.mhsatman.com

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

July 19, 2012

Tekrar baktım da Hakan hoca bir cevap daha yazmış ve takıldığım diğer algoritmayı uyarlamış:

Alıntı:

>

kodunu şöyle değiştirdim:

> (function ASAL_MI(params p)
>   (block
>    (if (< p 2)
>          (return 0)
>    )
>    (if (and (!= p 2) (= 0 (% p 2)))
>          (return 0)
>    )
>    (for (let n 3) (<= (* n n) p) (let n (+ n 2))
>          (if (= 0 (% p n ))
>                (return 0)
>          )
>    )
>    (return 1)
>  )
> )
>
> (let a (: 2 10))
> (let say 0)
> (foreach i in a
>     (if (= (ASAL_MI i) 1)
>         (block
>             (print i "\n")
>             (++say)
>         )
>     )
> )
> (print "Toplam: " say "\n")
> ```

> burada şu değişiklikler yapıldı:
> 1) function içindeki kodlar (block) içinde yazılmalı. yani fonksiyon gövdesi her zaman bir blocktur.
> 2) for döngüsünde (+ n 2) n'e iki ekler ama sonucu havaya atar. (let n (+ n 2)) demek lazım modifikasyon için.
>
> kodun çıktısı şöyle:
> '
> 2
> 3
> 5
> 7
> Toplam: 4
> '
> buraya kadar her şey doğru görünüyor.
>
> ancak yazdığın algoritma 605 'in de asal sayı olduğunu söylüyor. halbuki bu sayı 5 'e kalansız bölünür.
>
> Mehmet Hakan Satman
> http://www.mhsatman.com
>

-- 
[ Bu gönderi, <http://ddili.org/forum>'dan dönüştürülmüştür. ]
July 19, 2012

Meğer TinyCore dağıtımı içinde, QEMU'yu kullanarak Fuzuli uygulamaları geliştirebiliyormuşuz. Gerçi Windows harici her ortamda parçalama hatası alıyorum ama böyle bir olanağını olması güzel bir şey. Bir benzerini de D için yapmak istemiştim. Tabi benim dağıtımım bir CD'ye yakın olacaktı...:)

http://desmond.imageshack.us/Himg708/scaled.php?server=708&filename=fuzuli.png&res=crop
Büyüğü için üzerine tıklayınız... (http://img708.imageshack.us/img708/4053/fuzuli.png)

Sistem görüntüsü (image) için tıklayın... (~ 64 MB.) (http://code.google.com/p/fuzuli/downloads/detail?name=Fuzuli-Demo-tinycore-v0.1.2.zip&can=2&q=)

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

July 31, 2012

Merhaba Salih,

foreach 'den sonra konulan block ifadesinin kafa karıştırması normal. Fuzuli 'de block ifadesinin kullanılmasının zorunlu olduğu tek yer fonksiyonlar. örneğin

(function myFunc (params a b)
  (block
     ..
     ..
     (return ...)
  )
)

for, while, foreach gibi ifadelerde kullanılmasına gerek yok. isteğe bağlı. ancak bir if ifadesinde eğer birden fazla iş yapılacaksa block zorunlu oluyor. Mesela aşağıdaki kod içinde block ifadesine gerek yok:

(if (= a 3)
  (print "eşit")
)

Ancak koşulun doğru olması durumunda birden fazla iş yapılacaksa, block kullanılmalı. Mesela:

(if (= a 3)
  (block
     ....
     ....
  )
)

çünkü if iki farklı yapıda kullanılıyor. birinci if-then, ikincisi if-then-else. bu yapıların birbirine karışmaması için birden fazla satır için block kullanıldı.

Ayrıca bugün itibariyle Fuzuli 'nin artık toplama mekanizmasında büyük gelişmeler meydana geldi. Size verdiğim online interpreter üzerinden (henüz herkesin kullanımına açık değil) hızını test edebilirsiniz. Ayrıca artık toplama ile ilgili yazı (tabiki fuzulinin artık toplama mekanizması) http://stdioe.blogspot.com/2012/07/garbage-collection-mechanism-of-fuzuli.html adresinde yer alıyor.

sevgiler.

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

July 31, 2012

Linux paketlerini idogan hazırlıyor. Artık ne zaman bu işe ayıracak vakti olursa o zaman çıkaracağız. Paketlerle ilgili gecikme yaşamamak için online interpreter 'ı kullanıma sunmayı düşünüyoruz. Online interpreter ile kodda bir değişiklik olduğu anda insanlara sunma imkanımız oluyor. Paketler ise daha stabil sürümler oluyor ve mutlaka bir gecikme içermek zorunda.

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]