July 18, 2012

Hepinize teşekkür ederim harika oldu

foreach (i; 0 .. 10) {
       subt["anahtar1"].add(to!string(i));
   }
   auto bulunanlar = subt["anahtar1"].search(&notequal!"5");
	bulunanlar.writeln();

Çıktısı
*["0", "1", "2", "3", "4", "6", "7", "8", "9"]
*

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

July 17, 2012

Böyle özelleşmiş diller (yani SQL gibi domain specific language) yerine bir temsilci almaya ne dersin? Sana verilen koşulu veri üzerinde işletir ve uyanlara eriştirirsin.

Hangi yöntemle olursa olsun veriyi nasıl sunacağının da önemi var: En kolayı kopyalarını bir dilim olarak vermek olabilir. Tabii büyük verilerde pahalı olabilir.

Daha iyisi veriye tembel olarak erişim sağlamaktır. C++'ta 'iterator'lar var; D aralık soyutlamasını kullanıyor. Yani senin condition() bir aralık döndürebilir ve kullanıcı popFront() dedikçe bir sonraki veriye geçebilirsin. Ama şart değil tabii: sonuç dilim olarak da verilebilir.

Ali

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

July 18, 2012

bence böylesi de iyi oldu başka bir modul açıp şablonları oraya aldım public import ile vt modulune ekledim
benim asıl sormak istediğim şu diyelim bir kullanıcı adı şifre kıyaslamasında donen değerlerin birbirlerine eşlenmiş olduklarını nasıl anlayacağız diyelim benim kullanıcı adım abc sizinki xyz sifrem 123 sizinki 345 baska şifresi aynı olanlarda olabilir bu hatayı nasıl gidereceğiz

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

July 17, 2012

Söylediğini ben anlayamadım. And ile birleştirince sorgunun her iki tarafının da tutması gerekir. (Bunu sorduğunu sanmıyorum.)

Eğer anahtarın ve değerin birlikte dönmesinden bahsediyorsan onu da ikisinden oluşan bir yapı olarak döndürebilirsin. Yani bir kere bulduktan sonra onunla ilgili istediğin veriyi döndürebilirsin.

Ben yine de anladığımı sandığım soruyu SQL deneyimim olmadan yanıtlamaya çalışıyorum: :)

SQL gibi bir düzenekte veri genellikle başka bir programda ve hatta başka bir sunucuda olabiliyor. Öyle olduğu için veriyi teker teker almak çok zaman kaybına neden olabilir: Program ilk uyan veriyi kullanacak sonra "sonrakine geç" diyecek; bu çağrı sunucuya gidecek; işlenecek; geri gelecek... Yavaş iş. (Aslında veri çok büyük olduğunda yararlı olan 'cursor' kavramı da var.)

Hem o yüzden hem de zaten en kolayı olduğu için sonuçların hepsini birden gönderilir. (Biz SQL kullanmıyoruz ama bizde de uyan veriler tek parça halinde gönderiliyorlar.)

Sen de bunu uygulayabilirsin: Uyan bütün veriyi tek dilim halinde döndürürsün; olur biter. Çoğu SQL kullanımı ile aynı işi yapmış olursun.

Ama senin durumunda veri ile program yan yana olduklarından bir avantajdan yararlanmak isteyebilirsin: Sorgulanan veriyi teker teker sunmak. Böylece hepsini tutacak kadar büyük bir dizi oluşturulması gerekmez; ve belki de yeterli olan ilk bir kaç veriden gerisi sorgulanmamış olur.

Ben kolay olduğu için hiç olmazsa şimdilik dilim döndürmeni öneririm.

Ali

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

July 17, 2012

Evet, aynı şeyi düşünüyoruz. Benim dilim dediğim, senin returndata.datas dilimin. Sonuç olarak onu (veya tabii returndata'yı) döndürüyorsun, değil mi?

Oradaki if koşuluna kullanıcıdan alacağın kıstas işlevini yerleştirmek kullanışlılığını çok arttıracak.

Ali

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

July 18, 2012

Kullanıcı adını kıstas olarak kullanınca bence çok sorun olmayacaktır, hem kullanıcı adı hem de şifresi aynı kişilerin olması ilginç olur.
Yine de "UNIQUE" SQL belirteci gibi bir özellik eklersek aynı adlı kullanıcıların oluşturulmasını önleyebiliriz.

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

July 17, 2012

Aşağıda küçük bir örnek var. Programcı vt.ara() çağrısına bir kıstas gönderiyor ve sonuçları bir dilim olarak alıyor:

struct VeriTabanı
{
   int[] veriler;

   void ekle(int veri)
   {
       veriler ~= veri;
   }

   alias bool delegate(int) Kıstas;

   int[] ara(Kıstas kıstas)
   {
       int[] sonuç;

       foreach (veri; veriler) {
           if (kıstas(veri)) {
               sonuç ~= veri;
           }
       }

       return sonuç;
   }
}

void main()
{
   auto vt = VeriTabanı();

   foreach (i; 0 .. 10) {
       vt.ekle(i);
   }

   // Üçe tam bölünenler
   auto bulunanlar = vt.ara(v => (v % 3) == 0);
   assert(bulunanlar == [0, 3, 6, 9]);
}

vt.ara()'ya lambda göndermek yerine başlı başına bir işlev de gönderilebilir:

   // Yukarıdakiyle aynı şey
   bool üçeTamBölünür_mü(int sayı)
   {
       return (sayı % 3) == 0;
   }

   auto bulunanlar = vt.ara(&üçeTamBölünür_mü);

Ali

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

July 17, 2012

Alıntı (huseyin325325):

>

BU şekilde mi

> 			case "<":
>
> 			for(int i=0;i<datas.length;++i)
> 			{
> 				if(to!(int)(datas[i])<deger)
> ```


Evet, o da olur ama her işlemi kendin desteklemek zorunda kalıyorsun. Senin istemcin aynı programın içinde olduğundan sana kıstas olarak bir temsilci veya işlev gönderebilirler. Sen de yalnızca onun kıstasını çağırırsın.

(Not: İstemci uzakta olsa "<" diye gerçekleştirdiğin çözüm gerekecektir çünkü örneğin kıstas işlevi internet üzerinden geçemez; bir şekilde string haline gelmesi gerekecektir.)

Ali

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

VeriTabanı.ara()'nın yaptığının da filter'dan bir farkı yok. :) Daha kısaca:

   int[] ara(Kıstas kıstas)
   {
       return array(filter!kıstas(veriler));
   }

Ali

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

July 17, 2012

Alıntı (huseyin325325):

>

ben hep string ler üzerinde çalıştım veritabanında onu yazarken sonra string e mi çevireyim

Evet, ona uygun olan kıstasın string alması gerekir:

   alias bool delegate(string) Kıstas;

Kullanıcı da uygun kıstas gönderir:

import std.stdio;
import std.conv;

struct VeriTabanı
{
   string[] veriler;

   void ekle(string veri)
   {
       veriler ~= veri;
   }

   alias bool delegate(string) Kıstas;

   string[] ara(Kıstas kıstas)
   {
       return array(filter!kıstas(veriler));
   }
}

void main()
{
   auto vt = VeriTabanı();

   foreach (i; 0 .. 10) {
       vt.ekle(to!string(i));
   }

   bool eşit_mi(string arananDeğer)(string veri)
   {
       return veri == arananDeğer;
   }

   auto bulunanlar = vt.ara(&eşit_mi!"5");
   assert(bulunanlar == [ "5" ]);
}

Ali

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