TCL & uplevel

perintah uplevel digunakan untuk menjalankan perintah2 yang berada di
stack frame yang berbeda, stack frame telah dijelaskan di
https://inthegarage.wordpress.com/2007/06/13/tcl-upvar/,

Mungkin lebih baik langsung pada contoh

proc a {} {
    set x 10
    set y 20

    b
}

proc b {} {
    uplevel 1 {set x 20; puts "nilai dari x : $x"}
    uplevel 1 {incr x 20}
    uplevel 1 {puts $x}
}

dan hasilnya adalah sebagai berikut

%a
nilai dari x : 20
40
% 3

contoh lain dari penggunaan uplevel adalah untuk mengkustomisasi
struktur, misalnya adalah perintah loop yang tidak terdapat pada tcl,
misalnya syntax dari loop adalah loop 1 0 {..}, maka implementasinya
adalah

proc loop {from to body} {
    for {set var $from} {$var < $to} {incr var} {uplevel 1 $body}
}

perintah uplevel pada loop untuk menjalankan perintah pada body, yang
mempunyai 1 level lebih tinggi daripada perintah loop.

Advertisements

TCL & upvar

berdasarkan tcl manual, perintah upvar berguna untuk membuat link
(?hubungan?) ke variabel yang berada pada stack yang berbeda. Syntax
dari perintah upvar sendiri adalah sebagai berikut :

upvar ?level? otherVar myVar ?otherVar myVar ...?

Berdasarkan definisi diatas akan menimbulkan pertanyaan lain, apakah
yang dimaksud dengan lingkup stack (stack frame) yang berbeda?
untuk mengetahui lebih jelasnya, misalkan kita membuat method a, dan
didalam method a tersebut kita memanggil method b, ketika method a
dibuat, maka tcl akan membuat stack frame untuk method a dimana
seluruh local variabel akan disimpan, dan ketika memanggil method b
maka tcl akan membuat lagi stack frame untuk method b, sehingga method
a dan b mempunyai stack frame yang berbeda, dan juga method a dan b
mempunyai level yang berbeda dimana method a mempunyai level 1 (bila
diasumsikan method a dipanggil dari lingkup global), sedangkan method
b mempunyai level 2.
Untuk mengetahui level dari method/procedure dapat digunakan perintah

info level.

Karena method a dan b mempunyai stack frame yang berbeda maka method b
tidak dapat mengaksed variabel yang berada pada method a, nah perintah
upvar dapat membuat method b untuk mengakses variabel yang terdapat
pada method a.

proc top {} {
    set x 10
    bottom
    puts "setelah memanggil bottom $x"

}

proc bottom {} {
   upvar 1 x localx
   incr localx 20
}

setelah kita panggil top

% top 20
setelah memanggil bottom 30
%

selain itu perintah upvar berguna untuk mengimplementasikan
call-by-name procedure, contohnya adalah sebagai berikut.


proc top {topArg} {
    set localArg [expr $topArg+1]
    puts "before calling bottom is : $localArg"
    bottom localArg
    puts "after calling  is : $localArg"
}

proc bottom {bottomArg} {
    upvar $bottomArg arg
    puts "bottom is passed $bottomArg with value $arg"
    incr arg
}

hasilnya bila kita panggil top 30

top 30
before calling bottom is : 31
bottom is passed localArg with value 31
after calling  is : 32

TCL & Scopes

Tcl mempunyai 2 jenis variabel scope (atau mungkin bila diterjemahkan
menjadi lingkup :P).

  • global
  • global variabel dapat diakses diseluruh script, akan tetapi sebuah
    prosedur/method dapat melakukan overshadow global variabel dengan
    mendefinisikan variable lokal dengan nama yang sama.

  • lokal
  • lokal variabel hanya dapat diakses dalam lingkup sebuah fungsi.

bila didalam fungsi/method ingin menggunakan variabel global, maka
kita menggunakan peringah global, berikut ini adalah contoh dari
program yang menggunakan lokal dan global variabel.

set a 10
set b 20

puts "$a $b"

proc test_scope {} {
    global a
    set a "me good"
    set b "but I feel not good"
    puts "$a $b"

}

test_scope
puts "Nilai dari a sekarang : $a"
puts "Nilai dari b sekarang : $b"

hasilnya adalah sebagai berikut.

% source scope.tcl
10 20
me good but I feel not good
Nilai dari a sekarang : me good
Nilai dari b sekarang : 20
%

dapat dilihat pada fungsi test_scope, bahwa global variabel a, dapat
digunakan apabila kita menggunakan perintah global terlebih dahulu.

could not debug in eclipse 3.2

Recently I couldn’t debug my application using eclipse 3.2, it will throw “Could not connect to VM”. And in the console there is a log

FATAL ERROR in native method: JDWP No transports initialized, jvmtiError=JVMTI_ERROR_INTERNAL(113)
ERROR: JDWP Transport dt_socket failed to initialize, TRANSPORT_LOAD(509) ["debugInit.c",L476]
JDWP exit error JVMTI_ERROR_INTERNAL(113): No transports initialized

I am using Ubuntu 7.04, after a googling session, it seems that there are a lot of people have the same problem.

I found the solution in java forum, and add 127.0.0.1 localhost in my /etc/hosts solve the problem.

TCL & Proc

Ok, Sekarang yang akan dibahas adalah proc. Proc adalah perintah yang
digunakan untuk mendefiniskan method. Syntax yang digunakan adalah
sebagai berikut

proc name { arguments } {
    body_method
}

contoh diatas membuat procedure/method dengan nama ‘name’. Tcl
mempunyai global environment untuk menyimpan nama2 procedure, sehingga
bisa dipastikan hanya terdapat 1 buah procedure dengan nama
‘name’. Apabila procedure dengan nama ‘name’ telah terdefinisikan,
maka procedure itu akan digantikan dengan procedure ‘name’ yang baru.

contoh dari procedure

proc add { a b } {
  return [expr $a +$b]
}

argument pada procedure dapat mempunyai default, contoh dari
mendefinisikan procedure yang argument-nya mempunyai nilai default

proc add { {a 10} {b 20} } {
  expr a + b
}

dari contoh diatas, argument b akan mempunyai nilai 20 bila tidak didefinisikan.

TCL & Array

tcl array adalah sebuah tipe data yang menyimpan kumpulan dari
variable, yang membadakan tcl array dengan java aray ataupun c array
adalah tcl array menggunakan string sebagai index penanda, yang
berbeda dengan java array yang menggunakan numerik sebagai penanda
index dari anggota variable array. Tcl array lebih cocok dibandingkan
dengan hashmap pada java dibanding dengan array pada java.

Syntax

index pada array dibatasi dengan menggunakan kurung tutup ‘(‘, index
berupa string apa saja.

elemet array dibuat dengan syntax:

set arr(index) value

sedangkan untuk mengetahui nilai dari sebuah array

$arr(index)

Perintah

beberapa perintah untuk array.

  • array exist arr
  • Mengembalikan 1 jika arr adalah sebuah array variable.

  • array get arr ?pattern?
  • Mengembalikan variable list yang terdiri dari index dan value, jika
    index sesuai dengan pattern, jika pattern tidak didefinisikan maka
    list akan berisi seluruh index dan value.

  • array names arr ?patern?
  • Mengembalikan variable list dari nama2 index yang sesuai dengan pattern.

  • array set arr list
  • Membuat array dari sebuah list.

  • array size arr
  • Mengembalikan banyak anggota dari array.

  • array nextelement arr id
  • Mengembalikan next element dari id index.

  • array anymore arr id
  • Mengembalikan nilai 1 jika masih ada element dalam pencarian.

  • array donesearch arr id
  • Menyelesaikan pencarian berdasarkan nilai id.

Contoh2 Sederhana

Ini ada beberapa contoh sederhana dalam penggunaan array

% set Liverpool_Player(Steven.Gerrard) 8
8
% set Liverpool_Player(Steve.Finnan) 3
3
% set Liverpool_Player(Xabi.Alonso) 14
14
% array names Liverpool_Player
Xabi.Alonso Steven.Gerrard Steve.Finnan
% info exist Liverpool_Player(Xabi.Alonso)
1
% info exist Liverpool_Player(Michael.Owen)
0

satu pertanyaan yang muncul dari contoh diatas adalah bagaimana bila
didalam variabel string index terdapat spasi (whitespace),

% set Liverpool_Player(Daniel Agger) 5
wrong # args: should be "set varName ?newValue?"
%

maka tcl akan mengindikasikan telah terjadi error,
untuk mengatasi hal diatas ada beberapa alternatif

  • Tambahkan ‘\’ sebelum karakter spasi
  • set Liverpool_Player(Daniel\ Agger) 5

  • Beri Tanda kurung pada nama array dan index
  • set {Liverpool_Player(Daniel Agger)} 5

  • Buat veriable string untuk index dan gunakan variabel itu sebagai index
  • set DanielAgger "Daniel Agger"
    set Liverpool_Player($DanielAgger) 5

TCL & List

TCL punya 2 struktur data, yang pertama adalah list yang kedua adalah
array, pada beberapa bahasa pemrograman kedua sturktur hampir
berkaitan, contohnya pada pemrograman java, list pada pemrograman java
implementasinya adalah vector atau array list yang mana didalam class
vector/array list menggunakan array. Akan tetapi pada tcl, list dan
array adalah 2 hal yang berbeda, kali ini yang akan dibicarakan adalah
list.

Tcl list adalah sebuah struktur dara yang berisi urutan dari
variable2, list mempunyai elemen yang dipisahkan oleh white space.

Membuat List

set x {1 2}
set li [list 1 2 3]

Untuk mengelompokan beberapa variable menjadi sebuah group didalam ist
dapat menggunakan tanda kutip

se l2 [list 1 "a b" 2]

List juga dapat dibuat dengan menggunakan perintah lappend

lappend new 1 2
==> 1 2

lappend new 3 "4 5"
==> 1 2 3 4 5
 

lappend tidak hanya dapat menambah element pada akhir list akan tetapi
juga dapat membuat variabel list baru.

selain lappend terdapat juga perintah concat

set x {4 5 6}
set y {2 3}
set z 1
concat $x $y $z
==> 4 5 6 2 3 1

ada hal lain tentang tanda petik dua (“), tanda petik dua pada kasus2
sederhana mempunyai efek yang sama seperti perintah concat, akan
tetapi concat akan menghilangkan white space pada akhir sebuah
argumen.

Perintah2 untuk List

  • llength
  • Perintah ini digunakan untuk mengetahui panjang dari sebuah list.

    llength {}
    ==> 0
    llength [list 1 2 3]
    ==>3
    
    

  • lindex
  • perintah lindex digunakan untuk mengetahui nilai dari sebuah elemen
    pada list, argumen dari perintah ini adalah posisi dari nilai yang
    ingin diketahui

    set x {1 2 3}
    lindex $x 1
    ==>2
    

  • lrange
  • lrange {1 2 3}0 1
    ==> 1 2
    

  • linsert
  • what can I say about this command? it insert a new element into list

    linsert {1 2}0 new stuff
    --> new stuff 1 2
    

  • lreplace
  • set x [list 1 2 3]
    lreplace $x 1 2 B C
    -> 1 B C
    

  • lsearch
  • Mencari sebuah element di list. Apabila nilai tidak ditemukan maka
    lsearch akan mengembalikan nilai -1.

    lsearch {1 2 3} 1
    -->0
    lsearch {1 2 3} 2
    -->1
    

  • lsort
  • Melakukan sorting dari list.

    lsort [list 3 4 1 2]
    --> 1 2 3 4
    
    

  • split
  • Memecah list.

    set x "123"
    split $x 2
    ==> 1 3
    
    

  • join
  • Menggabungkan list

    join [list 1 2 3] :
    --> 1:2:3