10 Mei 2015

Elemen list pada prolog

Dalam paradigma imperatif, elemen list diperoleh dengan cara iterasi.
Oleh karena itu programmer dari paradigma ini cenderung membuat kode
untuk mengakses prolog secara iteratif.

Hal ini tidak diperlukan dalam prolog, karena paradigmanya deklaratif,
sehingga tidak peduli bagaimana cara elemen itu didapatkan,
misal list L = [1,2,3].
Untuk mendapatkan elemen list L cukup memanggil predikat member.
Predikat member biasanya digunakan untuk mengecek apakah suatu
nilai ada di dalam list, misal
member(1,L) --> true
Tapi kita juga bisa memanggil member sebagai berikut
member(E,L) --> E = 1 dst.

21 Februari 2014

pointer atau value

Ketika dihadapkan dengan suatu  prosedur dengan signature semacam ini apa yang akan dilakukan?
void simpan_siswa(siswa* s);

Untuk bisa melakukan pemanggilan prosedur tersebut kita punya paling tidak dua kemungkinan kode yang dapat lolos kompilasi:
1. menggunakan address of value
void proses_siswa(...) {
  siswa sw;
  ...
  simpan_siswa(&sw);
}

2. menggunakan pointer
void proses_siswa(...) {
  siswa* sw_ptr;
  .../* ada malloc utk alokasi siswa */
  simpan_siswa(sw_ptr);
}

Sebelum menjelaskan mengapa kode mana yang benar, ada beberapa hal yang perlu diketahui tentang pointer, antara lain alokasi statikstack, alokasi dinamikheap,  scope, dan lifetime. Selain itu juga semantik/maksud/arti dari  siswa* s pada prosedur void simpan_siswa(siswa* s);

Variabel yang dialokasikan secara statik, seperti variable sw di kode 1, akan disimpan di stack dan mempunyai lifetime selama masih dalam scopenya (yaitu dalam prosedur proses_siswa). Jadi address yang ditunjuk oleh &sw adalah alamat di stack yang akan segera dihapus begitu keluar dari prosedur proses_siswa.

Variabel yang dialokasikan secara dinamik, seperti variable sw_ptr di kode 2, akan disimpan di heap dan mempunyai lifetime selama masih belum di-free, bahkan diluar scopenya (walau scopenya hanya dalam prosedur proses_siswa tapi lifetimenya masih berlaku diluar prosedur tadi).

Semantik  siswa* s pada prosedur void simpan_siswa(siswa* s); biasanya adalah entitas siswa yang berbeda-beda yang kemudian disimpan dalam suatu struktur (sebut saja list_siswa) yang dapat diakses dari seluruh sistem. (Bayangkan akan disimpan di suatu list yang tersimpan di memori, bukan dalam basisdata external). Jika menggunakan kode 1, maka jelas akan salah, karena siswa* akan menunjuk ke satu entitas saja dan nilainya akan hilang ketika keluar dari prosedur proses_siswa.

Simpulan:
Semantik deklarasi type* var biasanya dimaksudkan untuk menunjuk ke suatu entitas, sehingga pemanggilan yang tepat adalah dengan menunjukkan alamat di heap(seperti kode 2 yang dibuat dengan malloc).

17 Oktober 2013

tuple satu elemen pada python

Tuple pada python adalah masalah krusial pada programer pemula, khususnya tuple dengan satu elemen.
Jika anda bekerja dengan tuple, dan menemukan error yang sulit dijelaskan, kemungkinan hal ini berkaitan dengan tuple 1 elemen ini. Hal ini semakin memusingkan ketika anda bekerja dengan tuple lebih dari 1 element tidak ada masalah kemudian anda menguranginya hingga satu elemen dan muncul masalah.

Misalnya pada eksekusi perintah SQL berikut jalan.
query = "select * from tabsiswa where no=%s and kelas=%s"
cursor.execute(query, (noinduk, kelas))

Kemudian anda hilangkan kelasnya:

query = "select * from tabsiswa where no=%s"
cursor.execute(query, (noinduk))

Nah error terjadi. Anda lupa bahwa parameter kedua dari cursor.execute adalah tuple.
Jadi seharusnya (perhatikan koma setelah noinduk!!):

cursor.execute(query, (noinduk,))


Jadi tuple dengan 1 elemen HARUS diakhiri koma, sementara untuk tuple lebih dari 1 elemen tidak harus, tetapi akan lebih baik jika selalu diakhiri koma agar saat copy paste kode program tidak lupa bahwa itu adalah tuple.

Pesan error yang umum pada kesalahan ini misalnya Failed processing format-parameters, Wrong number of parameter

24 Agustus 2013

operator * dan ** pada python

Sebenarnya hal ini sudah dijelaskan di dokumentasi python http://docs.python.org/2/tutorial/controlflow.html#unpacking-argument-lists

Intinya kedua operator tadi fungsinya sama, yaitu memecah list menjadi deretan argumen pada parameter suatu method. Jadi daripada menuliskan f1(arg1,arg2,...) bisa dituliskan f(*args) atau f(**args).
Perbedaan antara * dan ** adalah bahwa * untuk list sederhana [1,23] sedangkan ** untuk dictionary {"arg1":1, "arg2":23}.

voila!

13 Januari 2012

Mengapa tipe parameter fungsi sebaiknya pointer?

Hal ini berkaitan dengan efisiensi memori. Nilai parameter
bisa jadi berupa struktur yang sangat besar. Dengan menggunakan
pointer maka ukuran untuk menunjuk struktur apapun akan selalu
sama, seukuran pointer.

Sementara jika parameternya merupakan tipe bukan pointer
maka diperlukan memory untuk mengkopi struktur tersebut
yang bisa jadi sangat besar, dan ini adalah pemborosan.

Akumulator

Pada topik pelajaran pemrograman rekursif, akan kita jumpai
dua macam pola; dengan dan tanpa akumulator.
Meskipun hal ini terlihat sepele dan yang terlihat hanya
terjadi pertambahan parameter pada pola dengan akumulator,
namun jauh di dalamnya terdapat konsep yang sangat penting,
yaitu tail recursion.

Pola dengan akumulator adalah program yang menggunakan tail
recursion. Keuntungannya program semacam ini tidak menggunakan
stack dalam proses rekursifnya, sehingga bisa dikatakan dapat
membuat rekursi berapapun juga.

Pada pola tanpa akumulator, setiap melakukan rekursi harus menyimpan
pointer untuk melakukan komputasi selanjutnya setelah titik rekursi. Pointer
ini biasanya disimpan dalam stack, sementara stack adalah sumber daya
yang terbatas, sehingga jika melakukan rekursi berkali-kali makan stack
akan overflow.

Lebih jauh, pada pemrograman level bawah, pola rekursif adalah haram,
mengingat keterbatasan stack tersebut. Silahkan lihat materi sistem operasi
tentang bagaimana stack ini biasanya dialokasikan secara static.

08 Desember 2010

Kritik pedas tentang Java

Berikut ini link yang memuat kritikan pedas untuk Java dari berbagai pandangan:
Hal menarik tentang Java ini adalah peluang kerja di Amerika Serikat. Lulusan yang ahli Java kemungkinan besar akan sulit mencari pekerjaan, karena hal mudah yg bisa dilakukan di Java akan di-outsource-kan ke India atau China.
Bagaimana di Indonesia? Ya kalau memang diniatkan sebagai penerima outsource, Java mungkin pilihan yang tepat untuk SMK, Politeknik dan D3. Tapi untuk setingkat S1 saya kira dua kritik diatas cukup menjelaskan.