Thread overview
Fonksiyon parametresine bir fonksiyon parametresi geçmek
Apr 04, 2018
kerdemdemir
Apr 04, 2018
kerdemdemir
Apr 05, 2018
kerdemdemir
April 04, 2018

Merhaba,

Sanal para kütüphanecim ile biraz uğraşıyorum bu aralar. Şu anda web socketlerini eklemeye çalışıyorum.

	short InitSocket(CallBack)( string name, string txName, string streamName, CallBack  )
	{
		import std.uni : toLower;
		string uniqStreamName = name.toLower() ~ txName.toLower() ~ "@" ~ streamName;

		if ( uniqStreamName in sockets )
		{
			writeln( "Socket with unique name: ", uniqStreamName, " was already existed will return"  );
			return -1;
		}
		auto ws_url = URL("wss://stream.binance.com:9443/ws/" ~ uniqStreamName);
		auto ws = connectWebSocket(ws_url);
		if ( !ws.connected )
			return -1;
		sockets[uniqStreamName] = ws;

		while (ws.waitForData())
		{
			try
			{
				Json result = parseJsonString(ws.receiveText);
				callBackfunction(result);
			}
			catch ( std.json.JSONException e )
			{
				writeln("Exception was caught while making the binance socket call: ", e);
				continue;
			}
		}
		CloseSocket(name.toLower(), txName.toLower(), streamName);
		writeln( "Socket will be closed reason was: ", ws.closeReason );
		return ws.closeCode;
	}

	bool CloseSocket( string name, string txName, string streamName )
	{
		string uniqStreamName = name ~ txName ~ "@" ~ streamName;
		return sockets.remove(uniqStreamName);
	}
unittest
{
	import vibe.core.sync;
	import vibe.core.concurrency;
	import vibe.core.core;

	writeln( "***** BinanceHelper Tests  *****" );

	auto helper = new BinanceHelper();

	void testFoo( Json json )
	{
		writeln(json);
	}
	// helper.InitSocket( "iota", "btc", "aggTrade", &testFoo ) Bu güzel çalışıyor fakat blokluyor başka hiç birşey yapamıyorum.

       // Bloklanmamak için vibe'ın fiberlarını kullanmaya çalışıyorum.
	vibe.core.concurrency.async(  helper.InitSocket, "iota", "btc", "aggTrade", &testFoo );

	//helper.CloseSocket( "eth", "btc", "aggTrade");
}

Yukarda yazdığım InitSocket dediğim method çalışıyor. Fakat bloklanıyorum yani başka bir iş yapamıyorum. Bu neden bu methodu vibe 'ın fiberleri ile derlemeye çalışıyorum fakat derleyemedim.

Error: cannot resolve type for helper.InitSocket(CallBack)(string name, string txName, string streamName, CallBack)

Bir fikriniz var mı acaba cağrıyı nasıl yapmam gerektiğini.

<https://github.com/kerdemdemir/DCryptoWrapper/blob/master/source/Client/ClientHelper/BinanceHelper.d

>

Erdemdem

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

April 04, 2018

Abi oncelikle 42' ci oldugunu gormek beni sevindirdi.

Aslinda bende sunu denedim sagolsun hsencan sayesinde typeof anahtar kelimesini tartismistik.

alias fooType = typeof(&testFoo);
vibe.core.concurrency.async( helper.InitSocket!(fooType), "iota", "btc", "aggTrade", &testFoo );

Ama derleyemedim yine diye hatirliyorum.

Dedigin sekilde eve gidince bir daha deneyecegim.

Erdemdem

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

April 04, 2018

tl;dr: async'e parametre almayan bir delegate ver.

InitSocket'ın türü bilinmiyor çünkü kendisi yalnızca bir işlev şablonu. Aynı sorunun küçük bir örneği ve çözümü:

// Bu InitSocket'in eşdeğeri
void foo(F)(F f, int parametre) {
   f(parametre);
}

// Bu vibe.d'nin async'inin eşdeğeri
void bar(P...)(P parametreler) {
   static assert (parametreler.length != 0, "İşlev vermeyi unuttunuz");
   // Herhalde diğer parametreleri ilk parametreye işlev parametresi olarak geçiriyorlardır:
   parametreler[0](parametreler[1..$]);
}

void main() {
   // Senin testFoo'nun eşdeğeri
   double işlev(int i) {
       import std.stdio;
       writefln("%s değeri ile çağrıldım", i);
       return 2 * i;
   }

   // DERLEME HATASI çünkü foo bir ifade değildir.
   // &foo yapmayı düşünebiliriz ama o da olmaz çünkü
   // foo yalnızca bir işlev şablonu:
   // bar(foo);

   // Bu çalışır ama çok çirkin
   bar(&foo!(typeof(&işlev)), &işlev, 42);

   // Daha temiz bir çözüm, bar'ı (vibe.d'nin async'ini)
   // isimsiz bir işlevle çağırmaktır:
   bar({ foo(&işlev, 42); });
}

Ali

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

April 05, 2018

Dayanamadim is yerinde ogle tatilinde indirip denedim.

Evet
vibe.core.concurrency.async( &helper.InitSocket!(typeof(&testFoo)), "iota", "btc", "aggTrade", &testFoo );

Calisti Ali Abinin dedigi gibi &'i eklememisim.

Ilgi cekermi bilmem ama kafamdaki plani paylasmak istedim.

Bu client helper en dusuk seviyeli yardimci islevler iceriyor. O yuzden biraz esnek olsun istiyorum. Kullanici istedigi uzantiyi cagirabilecek bununla. Sadece cagriyi gerceklestirerek json objesi donecek.

Bunun bir ustu clientWrapper sinifi biraz daha yuksek seviye islevler iceriyor ve clientHelper'i kullaniyor. Json objesini parse edip data.d'de belirtilmis yapilari olusturuyor. (https://github.com/kerdemdemir/DCryptoWrapper/tree/master/source/Client/ClientWrapper)

ClientWrapper'in bir ustude olacak. "BlackList"(ornegin botu calistirdiginiz hesabinizda BTC tutuyorsunuz ayri olarak ve botun BTC lere dokunmasini istemiyorsunuz) , "Status Mesajlarini" filan isleyecek. Bazi davranislari kendisi karar verip daha yuksek seviye fakat daha kisitlayici olacak.

Asil projemi ufak ufak kutuphaneye tasiyorum. Birseye benzer insallah.

Erdemdem.

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

April 05, 2018

Senin gösterdiğin benim çirkin dediğimin aynısı ama adres alma işlecini unutmuş olabilirsiniz: '&helper.InitSocket!(fooType)'. (C ve C++'ın aksine, işlevin adı D'de işlevin adresi yerine geçmez.)

Ali

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