Wednesday, September 12, 2018

JavaScript'de Kısmi Fonksiyon Yazımı

JavaScript eşbiçimli (=isomorphic) bir programlama dilidir: JavaScript'de yazdığınız kod hem önuçta, tarayıcıda hem de arkauçta, örneğin Nodejs'de ya da jjs ile JVM'de çalışabilir. Yine de JavaScript'i ağırlıklı olarak önuçta çalışacak uygulamaları kodlamak için kullanıyoruz. Dil olarak incelendiğinde JavaScript, nesne tabanlı, olay tetiklemeli, fonksiyonel bir programlama dilidir: 

numbers= [4, 8 , 15, 16, 23, 42];
numbers.filter(function(x){ return x%2 == 1;})

Yukarıdaki örnekte Array sınıfının filter metoduna parametre olarak bir fonksiyon geçiyoruz. Bu parametre olarak geçtiğimiz fonksiyonu λ ifadesi olarak da tanımlayabiliriz:

numbers.filter((x)=>{ return x%2 == 1;})

Eğer λ ifadesi tek bir parametre alıyor ve gövdesi sadece return ifadesinden oluşuyor ise daha da basit yazılabilir:

numbers.filter( x => x%2 == 1 )

Şimdi bir λ ifadesini bir değişken olarak tanımlayalım:

var add = (x,y) => x+y ;

Bu λ ifadesini normal fonksiyon gibi çağırabilirsiniz:

add(5,49);

Şimdi de numbers dizisindeki değerlerin bir fazlasından oluşan yeni bir dizi oluşturmaya çalışalım. Bunu basitçe Array sınıfındaki map çağrısını kullanarak başarabiliriz:

numbers.map( x => x + 1)

Peki map fonksiyonunda parametre olarak add λ ifadesini kullanmak istersek, bunu nasıl başarabiliriz?

Sorunun cevabı kısmi fonksiyonda gizli:

numbers.map(add.bind(null,1))

Burada add fonksiyonunun ilk parametresinin değerini 1'e bağlayıp tek parametreli bir fonksiyon elde ediyoruz:

> var add = (x,y) => x+y ;
> var plus1 = add.bind(null,1);
> plus1(42)
43
> numbers= [4, 8 , 15, 16, 23, 42]
(6) [4, 8, 15, 16, 23, 42]
> numbers.map(plus1)
(6) [5, 9, 16, 17, 24, 43]

1 comment:

  1. Javascript gerçekten garip bi dil. benim gibi yıllarca nesneye dayalı programlamaya alışmış biri için de fonksiyonel programlama mantığını benimsemek sancılı olacak gibi ama ona da alışırız. daha neler görecez kim bilir.. Yazı için teşekkürler.

    ReplyDelete