Thread overview
XML dosyası işlemek
Nov 01, 2011
zafer
Nov 03, 2011
zafer
November 02, 2011
	DocumentParser xml = new DocumentParser(s);
	xml.onStartTag["book"] = (ElementParser xml)
	{
		Book book;
		book.id = xml.tag.attr["id"];

		xml.onEndTag["author"] = (in Element e) { book.author = e.text; };
		xml.onEndTag["title"] = (in Element e) { book.title = e.text; };
		xml.onEndTag["genre"] = (in Element e) { book.genre = e.text; };
		xml.onEndTag["price"] = (in Element e) { book.price = e.text; };
		xml.onEndTag["publish-date"] = (in Element e) { book.pubDate = e.text; };
		xml.onEndTag["description"] = (in Element e) { book.description = e.text; };

		xml.parse();


		books ~= book;
	};

	xml.parse();

	writeln(books);

Yukarıdaki kodun tamamı şu adreste http://www.d-programming-language.org/phobos/std_xml.html ben bu kodun aşağıdaki satırını tam çözemedim.

xml.onStartTag["book"] = (ElementParser xml)

Buradaki kullanım nasıl daha açık yazılımı nasıl olur. ElemenParser nedir? Ayrıca bunun altına yeni bir bölüm açılıyor. Bu kısım bir fonksiyon olarak başka bir yere taşınabilir mi? Yoksa bu kod bloku içinde mi yazmak gerekiyor?

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

November 02, 2011

Alıntı (zafer):

>

aşağıdaki satırını tam çözemedim.

> xml.onStartTag["book"] = (ElementParser xml)
> ```

>

Çünkü aşağıda gelen kod bloğu da bu ifadenin bir parçası (noktalı virgül ta onu kapatan küme parantezinden sonra). Sağ tarafta aslında bir delegate var.

Her ne kadar 'function' anahtar sözcüğü kullanılmadığı için sağ taraftaki bir 'delegate' olsa da, çok kolay olarak şöyle tanımlayabiliriz: Sağ tarafta isimsiz bir işlev var.

Yaptıkları, "book" dizgisi ile sağ taraftaki delegate'i eşleştirmek. Daha sonradan bu eşleme tablosunda "book"u aradıklarında bu delegate'i bulacaklar ve işletecekler.

Alıntı:
> ElemenParser nedir?

O kütüphanenin bir türü o. Kütüphanenin söylediği şu: eğer bize ElementParser alan bir delegate verirseniz, biz de dosyayı tararken o string ile karşılaşırsak sizin tanımlamış olduğunuz o delegate'i bir ElementParser ile çağıracağız. Siz de o ElementParser'ı istediğiniz gibi kullanırsınız.


  http://ddili.org/ders/d/kapamalar.html

(Not: Oradaki "kapama"ları sonradan "temsilci" olarak değiştireceğim.)

Ben daha basit olarak şöyle bir programla açıklamaya çalıştım:


import std.stdio;
import std.conv;

int main(string parametreler[])
{
if (parametreler.length < 4) {
stderr.writefln(
"HATA: Parametre olarak en az iki sayı ve bir veya daha fazla\n"
" işlem ismi vermeniz gerekiyor. Örnek:\n\n"
" %s 42 100 topla çıkart topla topla\n", parametreler[0]);
return 1;
}

/* Programın kendi isminden kurtuluyoruz */
parametreler = parametreler[1 .. $];

/*
* İki tane int parametre alan ve int döndüren delegate türüne önce
* kullanışlı bir isim verelim. Bundan sonra İşlemci dediğimizde bu tür
* yerine geçecek.
*/
alias int delegate(int, int) İşlemci;

/*
* Şimdi dizgiden İşlemciye dönüşüm yapan bir eşleme tablomuz var.
*/
İşlemci[string] işlemciler;

/*
* Bu tablo içinde "topla" indeksine (anahtarına) karşılık olarak bu
* delegate bulunacak.
*/
işlemciler["topla"] = (int soldaki, int sağdaki) {
return soldaki + sağdaki;
};

/*
* Aynı biçimde, "çıkart" yerine de bu delegate.
*/
işlemciler["çıkart"] = (int soldaki, int sağdaki) {
return soldaki - sağdaki;
};

/*
* Komut satırından gelen parametreleri kullanalım
*/
immutable int birinci = to!int(parametreler[0]);
immutable int ikinci = to!int(parametreler[1]);

/* Sayılardan da kurtuluyoruz */
parametreler = parametreler[2 .. $];

writefln("sayılar: %s ve %s", birinci, ikinci);

foreach (işlem_ismi; parametreler) {
if (işlem_ismi in işlemciler) {
auto işlemci = işlemciler[işlem_ismi];
writefln("işlem: %s, sonuç: %s",
işlem_ismi, işlemci(birinci, ikinci));

   } else {
       writefln("\"%s\" işlemini bilmiyorum", işlem_ismi);
   }

}

return 0;
}



O programda 'auto' kullandığım yerde İşlemci de yazabilirdim. Hatta iyice açık olarak şunu da:


       int delegate(int, int) işlemci = işlemciler[işlem_ismi];


O tür, 'işlemci'nin *iki tane int parametre alan ve int döndüren bir delegate* olduğunu söylüyor.

Ali

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

Örnek harika olmuş Ali eline sağlık, örnek herşeyi anlatıyor zaten. Bir dizinin elemanlarına değer aktarır gibi eşleme tablosunun elemanlarına fonksiyonlarımızı dolduruyoruz. Daha sonra anahtar yardımıyla dizimizi istediğimiz bir fonksiyon yerine kullanıyoruz bir nevi joker gibi, aslında şöyle bir düşününce harika bir özellik.

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