Saturday, July 19, 2014

Tcl tutorial for Begineers

Initially, we should get ns or tcl shell installed to work with tcl script. 
If you didn't install ns2, click here for the installation procedure. Else, follow the tutorial. 
After installing ns-2, type ns in terminal. Then, there appears % symbol, which symbolizes the invokement of tcl shell script.
Note(optional): TCL scripting individually can be practiced with in Linux system with tcl shell scripting.


Introduction: 
TCL is an abbreviation for Tool Command Language. Tcl is a string-based command (script) language, with simple syntax. Tcl is designed to be a glue that assembles software building blocks into applications.The latest version of TCL is 8.8.2. 

The goal of this tutorial is to introduce the learner to TCL scripting and make comfortable to do scripting required for ns2 network simulations. It covers working with variables, lists, arrays, control structures and other core features, in TCL. The tutorial was created on Ubuntu Linux, but the users can practice TCL scripting individually in WINDOWS by downloading ActiveTCL.


Working with TCL:

set – command to assign a value to a variable.

set variable_name value
set u 10

set variable_name2 $variable_name
set c $u

# - Symbol used for line comment. Tcl interpreter will not execute that line. There isn’t any paragraph commenter in tcl/otcl scripting.

expr – command to invoke any mathematical operation.
set variable_name [expr $var1+$var2]
set d [expr $b + $c]

puts – Command to print output to the console.
puts 10
puts d
puts $d
puts d is different from puts $d

In Tcl, there are no variable types. So, a variable can be a string or integer depending on value you assign to it. Also, the typecasting rules also apply here.
puts [expr 1/2]
puts [expr 1.0/2]
puts [expr 1/2.0]
puts [expr 1.0/2.0]

/  operator is used for division. \ operator is not defined in tcl. NOTE: spaces are not important
expr 5*3
expr 5    *     3

Both these statements, result the same answer. But, spaces are not preferable for good programming.

NOTE:
Dividing by zero
expr 1/0
Interpreter shows "DIVIDE BY ZERO" error.
This can't be done by a programming language

Working with strings, in TCL:

set e “udhay prakash”;
set f {udhayprakash.blogspot.in};
puts $e
puts “udhay prakash”
puts $f
puts “udhayprakash.blogspot.in”



Conditional Statements:
Syntax:
if {expression}
{          <execute some commands>
} else {
            <execute some commands>
}

Example:
set a 10;
set b 20;
if($a!=$b){
puts “$a!=$b”;
}else{
puts “$a=$b”;
}

Loop Statements:
for loop syntax:
for{initialization}{condition}{increment/decrement}
{ <execute some commands>
}

for loop example:
set i 0
for{set i 0}{$i<5}{incr i}{
puts “$i/t”
puts [expr $i/t]
}

while loop syntax:
while {condition}{
<execute some commands>
<increment/decrement looping variable>
}

while loop example:
set m 10
set n 2
while{$m!=0}{
puts {$m\n}
incr m -1
}

do-while loop syntax:
do{
<execute some commands>
<increment/decrement looping variable>
}while{condition};

do-while loop example:
set m 10
set n 2
do{
puts {$m\n}
incr m -1
}while{m};

return – command to return a value from procedure
continue – command to bypass a loop in a procedure
break – command to come out of a procedure
proc – command to create a procedure(function). The procedure receives some parameters that can be objects, files or variables.

Procedure syntax:
 proc procedure{in_par1, in_par2, …..}{
            global variable_list, file_list
            <execute some commands>
             return $something
            }
Procedure Example1:
proc factorial {j} {
for {set result 1} {$j > 1} {set j [expr $j ­1]} {
set result [expr $result * $j]
}
Procedure Example2:
#create a procedure
proc test{}{
set a 4
set b 2
set c [expr $a+$b]
set d [expr [expr $a-$b]*$c]
puts “c=$c, d=$d”
for {set k 0}{$k<10}{incr k}
if {$k<5}{
puts “k<5,pow=[expr pow($d,$k)]”
} else{
puts “k>=5,mod=[expr $d%$k]”
}
}}
Calling a Procedure:
Syntax: procedure_name
Example: test



Working with files, in TCL:
·         To create and write in a new file, with file1 as the filename: set file1 [open filename w]; 
·         To read an already existing file, with file2 as the filename:   set file2 [open filename r];
·         To print data into a file, with file2 as filename:                                   puts $file2 “text”;