From bbs@floyd.upol.czMon Jan 29 16:33:57 1996 Date: Mon, 29 Jan 1996 16:26:47 +0100 From: BBS Floyd To: hubicka@limax.paru.cas.cz Subject: Skolicka #11-tcl (fwd) *** Forwarded file follows *** Posted By: kotelnik (kotelnik) on 'Linux' Title: Skolicka #11-tcl Date: Wed Jan 10 07:50:03 1996 A mame tu prvni jazyk podobny lispovi. Tcl uz ma narozdil od lispu celkem dobrou povest a lidi se ho tak neboji. Je opravdu mnohem jednodusi. Proste nesaha lispu ani po kolena. Autor se snazil maximalne zjednodusit jazyk aby se dobre ucil vypadal pekne a na druhou stranu rozsiril a standarizoval interface do cecka. Tcl se dodava jako knihovna pod GPL a kazdy si ji muze dat do svyho programu. Proto bylo udelano hodne peknych nadstaveb tcl. Nejznamejsi aplikaci co pouziva tcl je wish coz je graficky shell pomoci ktereho muzete delat pekne uzivatelske interface co vypada jako motif. To se samozdrejme zase dodava jako knihovna takze pomoci ni muzete udelat dalsi proram co pomoci tcl/tk dela svuj uzivatelsky interface. Takovy priklad je linuxacke simcity. Je v nem napsane a vypada celkem dobre. To dokazuje ze tcl je porad dobry jazyk presto ze na lisp uz nema. Mozna by bylo zajimavy pustit interpretr lispu jako knihovnu v nejakem zmensenem provedeni. Rozhodne si myslim ze stoji za to tcl umet. Ukazuje to jak lispovsky jazyk muze byt jednoduchy. (interpretr se pusti pomoci tclsh a je v standardni distribuci slakwaru) Typy a vyhodnocovani: ===================== Protoze tcl je lispu hodne podobne jen rychle: Tcl ma jediny datovy typ a tim je string. Jeho cteni a zapisovani je jasne. Vyhodnocovani probiha tak ze se rozdeli na castni podle mezer a prvni je jmeno funkce a ostatni jsou parametry(tedy trochu podobne jako lisparsky list nebo kdyz shell pousti program): blb 1 2 3 Vola funkci blb z parametry 1,2 a 3. expr 1 + 2 + 3 je volani funkce expr ktera je soucasti standardni tcl knihovny a vyhodnocuje vyrazy. Takze matematika tu vypada lidsky ale zase je celkem nerozsiritelna. Ty cisla jsou stringy a i string se vrati. Pouze funkce expr si ty stringy prevadi do cisel. Navratova hodnota bude string 6 Parametry se uz nijak nevyhodnocuji narozdil od lispu. Pri rozsekavani na casti se deje nekolik zajimavych prevodu: bere " tedy "1 2" je jeden string:1 2 a tudiz se preda jako jeden parametr. treba: puts "hello word!" dostane jen jeden parametr a vypise i vrati hello word. Pri cteni dochazi take k expanzi promenych. Promena zacina $ jako v shellu. Nastavovani se dela pomoci set: set ahoj 10#hodnota promene ahoj je ted string 10 puts $ahoj vypise 10. No ale co kdybychom chteli promeny priradit treba vysledek volani expru Protoze se parametry nevyhodnocuji jako v lispu nemuzeme jako parametr normalne hodit volani funkce. Je na to figl. Pokud ctecka narazi na [ vyhodnoti retezec vnich jako zvlastni script a dosadi misto toho vysledek. To umoznuje vnorovani forem. Lispovske: (+ 1 (- 2 3)) muzeme prepsat do tcl: + 1 [- 2 3] A pokud by v tcl byly funkce + a - jako ze nejsou fungovalo by to. Takze to prirazeni by bylo: set ahoj [expr 1 + 2 + 3 + 4] (tady uz vidi jak se syntaxe zamotava oproti lispu.) [ jsou vlastne opakem lispovsky quote tedy ' . Misto aby vyhodnoceni zakazovaly ho dokonce prikazuji. Take se berou backshlase jako v cecku. A posledni konstrukce je ze kdyz narazi na { funguje to stejne jako " s tim rozdilem ze tam muzou byt vnorene {} a bere i entery puts {Ja jsem jeden parametr a pored jsem to ja {i tohle} a stale} vypise: Ja jsem jeden parametr a pored jsem to ja {i tohle} a stale To se hodi pri: Rizeni chodu programu ===================== Stejne jako v lispu if a smycky nejsou soucasti jazyka. Jsou to normalni funkce co volaji interpretr treba while: while podminka kod vola expr na podminku a dokud vychazi nenulovy vysledek vola tcl interpretr na kod: set $p 1 while {$p>10} {set p [$p+1]} Provede nejaky vypocet. Je to to same jako: while "$p>10" "set p [$p+1]" nebo: while $p>10 "set p [$p+1]" Takze tady vidite jak predavani funguje a ze rizeni programu je stejne jako v lispu udelano pomoci volani funkci a predavani kodu. Jenom si musite dat bozor na: if {i>10} { kod } jsou dva oddelene prikazy-prvni if {i>10} a druhy volani funkce se jmenem " kod " coz asi neni to co chcete. A pokud jste davali pozor v lispovi uz vite ze ted muzu rict: to je vse pratele! Zakladni funkce tcl knihovny: ============================= Popisu opravdu NAPROSTE ZAKLADY ostatni si muzete precist v moc preknem manualu co je v postcriptu a da se downloadnout ze sorry.vse.cz Funkce ====== proc jmeno {parametry} {kod} nadefinuje novou funkci v tcl. return hodnota co to asi muze delat...hmmm Promene ======= set jmeno hodnota nastavi jmeno na hodnotu unset jmeno rusi promenou Matematika ========== expr vyraz vyhodnoti vyraz. Podporuje vsechny bezne ceckove figly:>> && nebo treba sin Pole ==== Tcl umi i pole. Jsou to asociovana pole protoze tcl nema cisla. Takove pole muze byt treba: set slovnik(pocitac) computer set slovnik(mys) mouse Jak vidite jsou to vlastne normalni promene z jmenem slovnik(pocitac) apod. Takze nic noveho. Je tu ale nekolik funkci na praci s nimi. Ostatni ======= Je tu jeste moc dalsich funkci na praci z listy,stringy apod co jsou velmi podobne lispu. Proto je nebudu popisovat. ZAVER ===== Jak vidite tcl je mnohem jednodusi nez lisp a pritom si toho hodne z lispu zanechava. Ja osobne ho mam moc rad. Hodi se hlavne jako programovaci jazyk na rizeni nejakeho toolkitu-proste tehdy kdyz se vam nechce delat vlastni jazyk. Takze je k nezaplaceni pro veci jako toolkit na hry nebo grafickou nadstavbu(stejne jako lisp) Programy v tcl nemuzou byt tak odolne vuci chybam a robusni jako v lispovi proste CLOS tedy objektovou nadstavbu lispu v tcl nevykouzlite. Hodne lispovskych konstrukci proste v tcl nejde. Ale presto je to jazyk mnohem lepsi nez treba basic a jde v nem hodne. Jednou tu popisu tk coz je opravdu pekna nadstavba. Kotelnik ......a ten nejkotlivejsi......