18 Mart 2016 Cuma

Fonksiyonel Programlama Ve Scheme


   Fonksiyonel programlama, matematik fonksiyonlarıyla yapılır. Girdi ve çıktıları sabittir. Fonksiyon parametresi olarak aldığı girdileri işler ve sonuç döndürür. Bu sonuç sadece aldığı parametre ile değişmelidir.
   İmperative ve foksiyonel programlama yöntemleri vardır. İmperative programlamada atama ve döngü işlemleri kullanılır, ama fonksiyonel programlamada böyle bir şey yoktur. Fonksiyonel programlamada değişkene bir değer verildiğinde bir daha değişmez.
   Resimdeki gibi imperative kısmında atama ve döngü işlemleri yapılırken, fonksiyonel kısmında recursive işlemler yapılmıştır.
pd1.PNG
Özellikler
  • Referantial Transparency: Fonksiyon belli bir değer için bir tek değer üretir. Zamana veya başka koşullara göre oluşturulan değer değişmemelidir. Parametre almayan metodlar her zaman tek bir sonuç döndürür.
  • Fonksiyonlar başka fonksiyonlara parametre olabilir.
  • Composition: Birbiriyle ilişkili fonksiyonları birleştirmek. Örneğin; X -> Y  ve  Y -> X ise  X -> Z  yazılabilir.
Kalitesi
  • Parametre alması ve sonuç döndürmesi gerekir.
  • Atama ve döngü işlemleri kullanılmamalıdır.
  • Oluşturulan değer sadece aldığı parametrelere göre değişmelidir.

   

SCHEME: LISP'in Bir Biçimi

Lisp (List Processing  ), fonksiyonel programlamanın özelliklerini taşıyan ilk programlama dilidir. Kendi yorumlayısına sahiptir. Scheme, Lisp'in lehçesidir. Yorumlayıcı olarak kullanılan program Racket. Sheme dilinde prefix ifadeler kullanılır.
   
Scheme dilinde iki tür ifade vardır:
  1. Atoms : numara, string, boolean, karakter
  2. Parenthesized Expression : atom, expression
   
Scheme dilinde syntax:
→ : Atama
| : veya, alternatif ifade
{ } : liste
' ' : string ifadeler
;   : yorum satırı

Prefix işlemler:
(+ 3 5) = 3 + 5 = 8
(+ 3 ( * 4 5 ) )=  3 + 4 * 5 = 23
Boolean işlemler : 
( and ( =  a  b )  ( not  ( = a 0 ) ) )       ;   ( a = = b ) && ( a ! = 0 )

Özel fonksiyonlar:
 >> (gcd 10 35 )    ; gcd ( 10 35 )  en büyük ortak bölen bulur.
5
>>  (read- char )  ; getchar()
>> (quote ( 1 2 3 ) ) ; ifade değişmeden döndürülür.
'(1 2 3 )
>> if ( = a 0 )  0            ; if (a==0) return 0
          ( / 1 a )                  ; else return (1/a)
>>( cond ( (= a 0 ) 0)                  ; condition (if, else if , else yapısı) ; if( a==0  )  return 0
                  ( ( = a 1 ) 1)                 ; else if( a == 1 )   return 1
                  ( else ( / 1 a ) ) )        ; else return 1/a
>>(let (( a 2 )   ( b 3 ) ) ( + 1 b ) )       ;  let komutu ifadeye değer bağlar. ( + 1 b) işlemi                                                                            ;  sadece let ifadesi içinde yapılır. 
4
>>(lambda   (radius)  (*   3 .14  ( * radius radius ) ) ) 10)
   ;  lambda komutu isimsiz  fonksiyon oluşturmayı sağlar.
   ; radius aldığı parametre
   ; 10 sayısı da parametrenin değeri 
314
>> letrec                ; recursive fonksiyonları bağlar.
> > define              ; global tanımlama yapar.
   Tail Recursive : Kuyruk özyinelemesi olarak çevrilebilir. Recursive işleminin en sonda yapılmasıdır. Scheme tail recursive fonksiyonları imperative fonksiyonlara çevirerek daha verimli çalışmasını sağlıyor.
**Scheme dili delayed özelliğine sahiptir. Yani bir kod yapısı sadece ihtiyaç duyulduğunda çalışır. Aksi halde çalışmaz. Örneğin if - else yapısında if kontrolü doğruysa else kısmını hiçi çalıştırmaz.
** Scheme statically scoped bir dildir, yani kaynak kodu yazarken hataları tespit eder, çalışma esnasında değil.

Scheme' de Veri Yapıları

Scheme dilinde temel veri yapısı listelerdir. Listelerde işlemleri hızlıca yapmamızı sağlayan metodlar vardır.
car : listenin ilk elemanını döndürür.
cdr : ilk elemanından sonrakileri döndürür.
cons : listenin başına eleman ekler.
Binary Search Tree (İkili Arama Ağacı)
("horse" ("cow" () ("dog" () ()))
("zebra" ("yak" () ()) () ))
ifadelerinin ikili arama ağacı üzerinde gösterimi:
scheme3

Box and Pointer Notation 
list( 1 2 3 ) 'ün gösterimi :
scheme1

list (  ( a b )  c  ( d ) ) ' ün gösterimi :
scheme2


Hiç yorum yok:

Yorum Gönder