You are here: Home > Uncategorized > Functional Programming Dalam Bahasa C

Functional Programming Dalam Bahasa C

 

  • Functional programming adalah program serba fungsi, yang artinya setiap persoalan diselesaikan dengan menggunakan fungsi. Functional programming sendiri mulai dikembangkan tahun 1960an, dimotivasi oleh peneliti bidang artificial intelligence, symbolic computation, theorem proving, rule-based system, dan NLP. Bahasa fungsional pertama adalah Lisp (McCarthy, 1960) yang memodelkan masalah komputasi sebagai suatu fungsi matematika, yang mempunyai input (domain) dan hasil atau output (range).

 

  1. Design dari functional languages berdasarkan fungsi matematika, yang merupakan mapping dari anggota suatu set yang dinamakan domain set, ke set lainnya yang dinamakan range set.

 

  • Ekspresi lambda menspesifikasi parameter dan mapping dari fungsi:

l(x) x * x * x

for the function  cube(x) = x * x * x

 

  • Lambda digunakan untuk mendeskripsikan fungsi yang tidak bernama dan di aplikasikan dengan menaruh parameter setelah ekspresi, misalnya (l(x) x * x * x)(2) yang menghasilkan angka 8

 

  • Bentuk Fungsional adalah bentuk fungsi yang lebih tinggi yang mengambil fungsi sebagai parameter atau menghasilkan fungsi sebagai hasilnya, ataupun kedua-duanya.

 

  • Bentuk fungsi yang membutuhkan dua funsgi sebagai parameternya dan menghasilkan fungsi yang valuenya adalah fungsi pertama yang diaplikasikan kepada fungsi kedua. Contohnya:

Form: h º f ° g

Yang berarti h (x) º f ( g ( x))

For f (x) º x + 2  dan  g (x) º 3 * x,

h º f ° g menghasilkan (3 * x)+ 2

 

  1. Data object types secara original hanya merupakan atom dan lists (List form: koleksi yang berada di dalam kurung yang berisi sublists atau atom, conthnya (A B (C D) E) ). LISP dulunya merupakan bahasa yang tidak bertipe dan di strore secara internal ke single-linked lists.

 

  1. LISP Interpretation
  • Notasi lambda digunakan untuk menspesifikasi fungsi dan definisinya. Ekspresinya disusun dalam notasi Cambridge-prefix. Contoh:

Operasi aritmatika:

(+)à  0

(+ 5) à 5

(+ 5 4 3 2 1) à 15 // maksud nya 5+4+3+2+1 = 15

(*)à 1

(*5) à 5

(* 1 2 3 4 5) à 120 // maksud nya 1*2*3*4*5 = 120

Contoh lain: (+ (* 5 4) (− 6 2) //maka akan menghasilkan (5 * 4) + (6 − 2) = 24

  • Didefinisikan dengan variable global

Contoh: (define f 120)

Evaluasi ekspresi

fà120

(+ f 5)à 125

(f)àerror, karena memiliki kurung tapi tidak melakukan sebuah operasi

5 à5

#fàfalse

#tàtrue

 

 

  1. Special Form Function: Define

Example:

(define warna (quote (merah kuning hijau)))

(define warna ’(merah kuning hijau))

(define x f)                                      120

(define x ’f)                                     x berisi simbol f

(define warna ’ merah)

(define warna merah)                         error, karena merah bukanlah suatu variable yang memiliki suatu isi

Evaluasi proses dari DEFINE berbeda, parameter pertama tidak akan di evaluasi. Paramete kedua akan di evaluasi, dan terikat pada parameter pertama.

 

  1. Untuk dapat menuliskan discriminated union syntax pada C maka header yang dibutuhkan adalah

#include <glib.h>

#include <stdio.h>

#include <assert.h>

#include <stdbool.h>

#include <signal.h>

#include <string.h>

#include “lutils.h”

Penulisan syntax union_type sama seperti penulisan struct declaration yaitu:

union_decl (Car, Volvo, Fiat, Ferrari)

union_type (Volvo, int x; double y) ;

union_type (Fiat, char* brand, *model) ;

union_type (Ferrari, char* brand, *model);

union_end (Car)

 

static void printCar(Car*);

static void testUnion() {

Car c;

union_set (&c, Volvo, .x = 3, .y = 4);

printCar (&c);

union_set (&c, Ferrari, .brand = “Ferrari”);

printCar (&c);

union_set (&c, Fiat, .brand = “Fiat”, .model = “234”);

printCar (&c);

}

Discriminated Union yang telah ditulis dapat diakses dengan pernyataan if

static void testCar(Car*, char const *);

static void printCar(Car* c) {

if(c->kind == Volvo)

{ int x = c->Volvo.x;

g_assert_cmpint(x, ==, 3);

}

static void testCar(Car* c, char const * value)

{

if(c->kind == Volvo) g_assert_cmpstr(value, ==, “3”);

else if (c->kind == Fiat) g_assert_cmpstr(value, ==, “234”);

else if (c->kind == Ferrari) g_assert_cmpstr(value, ==, “Ferrari”);

else g_assert_not_reached();

}

 

  1. Output Tools bBiasa nya tidak dibutuhkan, karena interpreter selalu menampilkan hasil dari fungsi yang di evaluasi pada top level (tidak nested). Explicit input dan output bukan bagian dari fungsional programming model murni, karena input operasi merubah kondisi program dan output operasi adalah side effects. PLT Scheme memiliki dua tools utama
  • MzScheme : the core compiler, interpreter, and run-time system
  • DrScheme : the programming environment DrScheme memiliki beberapa variant.

Untuk menggunakan Scheme standar: pilih Module (Choose Language— Module) Definisikan #lang scheme pada definition area.

  1. List Function, mengambil satu parameter dan mengembalikan parameter tersebut tanpa evaluasi dan selalu dibutuhkan sebab interpreter Sceheme yang bernama Eval, akan selalu mengevaluasi parameters ke aplikasi fungsi sebelu mengaplikasikan fungsi tersebut. Dapat ditulis : ‘ ( A B) sama dengan (quote (A B) )

 

  1. Predicate terdiri dari beberapa macam jenis
  2. EQ

Mengambil dua ekspresi sebagai parameter, akan mengembalikan true apabila kedua parameter memiliki pointer value yang sama dan false apabila tidak.

(EQ? ‘A ‘A) yields #T

(EQ? ‘A ‘B) yields #F

(EQ? ‘A ‘(A B)) yields #F

(EQ? ‘(A B) ‘(A B)) yields #T or #F

(EQ? 3.4 (+ 3 0.4))) yields #T or #F

  1. EQV

Hampir serupa dengan EQ hanya saja ini dapat digunakan oleh simbolik maupun nmerik atom dan berfungsi unduk membandingkan value.

EQV? 3 3) yields #T

(EQV? ‘A 3) yields #F

(EQV 3.4 (+ 3 0.4)) yields #T

(EQV? 3.0 3) yields #F  (floats and integers are different)

  1. List? Dan Null?

List? Mengambil satu parameter dan mengembalikan false apabila parameter sebuah list dan true bila sebaliknya.

(LIST? ‘()) yields #T

Null? Mengambil satu parameter dan mengembalikan true apabila parameter merupakan list yang kosong, dan false bila sebaliknya.

(NULL? ‘(())) yields #F

 

 

  1. Scheme Function pada C ada beberapa macam yaitu:
  • Member

Mengambil sebuah atom dan simple list, mengembalikan true apabila atom ada di dalam list dan false bila sebaliknya.

DEFINE (member atm a_list)

(COND

((NULL? a_list) #F)

((EQ? atm (CAR lis)) #T)

((ELSE (member atm (CDR a_list)))

))   

  • Equalsimp

Mengambil dua simple list sebagai parameter dan mengembalikan true apabila kedua list setara dan false bila sebaliknya.

(DEFINE (equalsimp list1 list2)

(COND

((NULL? list1) (NULL? list2))

((NULL? list2) #F)

((EQ? (CAR list1) (CAR list2))

(equalsimp(CDR list1)(CDR list2)))

(ELSE #F)

))

  • Equal

Mengambil dua general list sebagai parameternya dan mengemalikan true bila kedua list setara dan false bila sebaliknya.

(DEFINE (equal list1 list2)

(COND

((NOT (LIST? list1))(EQ? list1 list2))

((NOT (LIST? lis2)) #F)

((NULL? list1) (NULL? list2))

((NULL? list2) #F)

((equal (CAR list1) (CAR list2))

(equal (CDR list1) (CDR list2)))

(ELSE #F)

))

  • Append

Mengambil dua list sebagai parameternya dan mengembalikan parameter pertama dengan elemen dari parameter kedua yang di tambahkan di bagian akhir.

(DEFINE (append list1 list2)

(COND

((NULL? list1) list2)

(ELSE (CONS (CAR list1)

(append (CDR list1) list2)))

))

  • Let

Let merupakan kependekan dari ekspresi lambda yang diaplikasikan ke dalam sebuah parameter.

(LET ((alpha 7))(* 5 alpha))

Sama artinya dengan

((LAMBDA (alpha) (* 5 alpha)) 7)

 

  1. Operasi disebut tail recursion jika di panggil reculsive dan pada akhir dari fungsi operasi. Fungsi Tail reculsive dapat di convert secara otomatis oleh compiler untuk iterasi dengan membuat nya cepat. Scheme language definisi membutuhkan konversi scheme language system all tail reculsive fungsi untuk menggunakan iterasi.

 

  1. Contoh penulisan untuk membuatnya recursive

 

Original:         (DEFINE (factorial n)

(IF (<= n 0)

1

(* n (factorial (- n 1)))

))

Tail recursive:  (DEFINE (facthelper n factpartial)

(IF (<= n 0)

factpartial

facthelper((- n 1) (* n factpartial)))

))

(DEFINE (factorial n)

(facthelper n 1))

 

Sources :

Functional programming in C

  • Digg
  • Del.icio.us
  • StumbleUpon
  • Reddit
  • Twitter
  • RSS

Leave a Reply