⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 00000004.htm

📁 一份很好的linux入门资料
💻 HTM
📖 第 1 页 / 共 5 页
字号:
<HTML><HEAD>  <TITLE>BBS水木清华站∶精华区</TITLE></HEAD><BODY><CENTER><H1>BBS水木清华站∶精华区</H1></CENTER>发信人:&nbsp;cybergene&nbsp;(基因~也许以后~~),&nbsp;信区:&nbsp;Linux&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>标&nbsp;&nbsp;题:&nbsp;Objects&nbsp;in&nbsp;TCL&nbsp;<BR>发信站:&nbsp;BBS&nbsp;水木清华站&nbsp;(Thu&nbsp;Dec&nbsp;14&nbsp;16:00:20&nbsp;2000)&nbsp;<BR>&nbsp;<BR>&nbsp;<BR>Objects&nbsp;in&nbsp;TCL&nbsp;<BR>&nbsp;<BR>&nbsp;<BR>------------------------------------------------------------------------&nbsp;<BR>--------&nbsp;<BR>&nbsp;<BR>&nbsp;<BR>Introduction&nbsp;<BR>C++&nbsp;and&nbsp;Java&nbsp;are&nbsp;two&nbsp;well-known&nbsp;languages&nbsp;that&nbsp;offer&nbsp;primitives&nbsp;and&nbsp;&nbsp;<BR>in-language&nbsp;support&nbsp;for&nbsp;object&nbsp;oriented&nbsp;programming.&nbsp;That&nbsp;does&nbsp;not&nbsp;&nbsp;<BR>mean&nbsp;that&nbsp;object&nbsp;oriented&nbsp;programming&nbsp;is&nbsp;impossible&nbsp;in&nbsp;other&nbsp;languages.&nbsp;<BR>&nbsp;Object&nbsp;orientation&nbsp;is&nbsp;really&nbsp;just&nbsp;a&nbsp;way&nbsp;of&nbsp;thinking;&nbsp;it&nbsp;has&nbsp;more&nbsp;to&nbsp;&nbsp;<BR>do&nbsp;with&nbsp;design&nbsp;than&nbsp;with&nbsp;implementation.&nbsp;Look&nbsp;at&nbsp;the&nbsp;source&nbsp;code&nbsp;of&nbsp;&nbsp;<BR>the&nbsp;TCL&nbsp;interpreter&nbsp;for&nbsp;a&nbsp;great&nbsp;example&nbsp;of&nbsp;object&nbsp;oriented&nbsp;programming&nbsp;&nbsp;<BR>in&nbsp;C&nbsp;(not&nbsp;C++!).&nbsp;If&nbsp;you&nbsp;are&nbsp;disciplined&nbsp;enough&nbsp;to&nbsp;always&nbsp;pass&nbsp;a&nbsp;&nbsp;<BR>pointer&nbsp;to&nbsp;a&nbsp;struct&nbsp;as&nbsp;the&nbsp;first&nbsp;parameter&nbsp;to&nbsp;a&nbsp;function,&nbsp;you&nbsp;can&nbsp;see&nbsp;&nbsp;<BR>such&nbsp;a&nbsp;function&nbsp;as&nbsp;a&nbsp;'method'&nbsp;of&nbsp;the&nbsp;struct.&nbsp;You&nbsp;do&nbsp;not&nbsp;need&nbsp;actual&nbsp;&nbsp;<BR>language&nbsp;support&nbsp;to&nbsp;create&nbsp;object-oriented&nbsp;code.&nbsp;&nbsp;<BR>&nbsp;<BR>TCL&nbsp;does&nbsp;not&nbsp;offer&nbsp;object&nbsp;oriented&nbsp;primitives,&nbsp;but&nbsp;it&nbsp;is&nbsp;flexible&nbsp;enough&nbsp;<BR>&nbsp;to&nbsp;accomodate&nbsp;new&nbsp;primitives.&nbsp;This&nbsp;paper&nbsp;decribes&nbsp;a&nbsp;well&nbsp;known&nbsp;&nbsp;<BR>technique,&nbsp;object&nbsp;commands,&nbsp;to&nbsp;add&nbsp;some&nbsp;object&nbsp;primitives&nbsp;to&nbsp;TCL.&nbsp;Once&nbsp;&nbsp;<BR>you&nbsp;understand&nbsp;how&nbsp;object&nbsp;commands&nbsp;work,&nbsp;you&nbsp;will&nbsp;be&nbsp;able&nbsp;to&nbsp;figure&nbsp;&nbsp;<BR>out&nbsp;the&nbsp;code&nbsp;of&nbsp;most&nbsp;object&nbsp;packages&nbsp;and&nbsp;extensions.&nbsp;&nbsp;<BR>&nbsp;<BR>This&nbsp;paper&nbsp;assumes&nbsp;that&nbsp;you&nbsp;are&nbsp;familiar&nbsp;with&nbsp;TCL,&nbsp;and&nbsp;that&nbsp;you&nbsp;have&nbsp;&nbsp;<BR>written&nbsp;at&nbsp;least&nbsp;a&nbsp;few&nbsp;simple&nbsp;scripts&nbsp;in&nbsp;TCL.&nbsp;&nbsp;<BR>&nbsp;<BR>Existing&nbsp;extensions&nbsp;<BR>Many&nbsp;extensions&nbsp;of&nbsp;TCL&nbsp;exist,&nbsp;that&nbsp;add&nbsp;flavours&nbsp;of&nbsp;objects&nbsp;and&nbsp;classes&nbsp;&nbsp;<BR>to&nbsp;the&nbsp;basic&nbsp;language.&nbsp;Some&nbsp;of&nbsp;these&nbsp;extensions&nbsp;are&nbsp;written&nbsp;in&nbsp;C,&nbsp;and&nbsp;&nbsp;<BR>must&nbsp;be&nbsp;compiled&nbsp;and&nbsp;linked&nbsp;to&nbsp;the&nbsp;TCL&nbsp;library&nbsp;to&nbsp;make&nbsp;them&nbsp;available&nbsp;in&nbsp;<BR>&nbsp;the&nbsp;language.&nbsp;A&nbsp;good&nbsp;example&nbsp;is&nbsp;&gt;&gt;&nbsp;[Incr&nbsp;Tcl],&nbsp;an&nbsp;extension&nbsp;that&nbsp;&nbsp;<BR>introduces&nbsp;primitives&nbsp;such&nbsp;as&nbsp;class,&nbsp;method&nbsp;and&nbsp;constructor.&nbsp;Other&nbsp;&nbsp;<BR>extensions,&nbsp;such&nbsp;as&nbsp;Jean-Luc&nbsp;Fontaine's&nbsp;&gt;&gt;Stooop,&nbsp;are&nbsp;written&nbsp;in&nbsp;TCL&nbsp;&nbsp;<BR>itself.&nbsp;They&nbsp;don't&nbsp;require&nbsp;any&nbsp;recompilation.&nbsp;You&nbsp;may&nbsp;wonder&nbsp;how&nbsp;it&nbsp;is&nbsp;&nbsp;<BR>possible&nbsp;to&nbsp;extend&nbsp;TCL&nbsp;with&nbsp;new&nbsp;primitives&nbsp;written&nbsp;in&nbsp;TCL&nbsp;itself.&nbsp;This&nbsp;&nbsp;<BR>paper&nbsp;answers&nbsp;that&nbsp;question&nbsp;by&nbsp;zooming&nbsp;in&nbsp;on&nbsp;the&nbsp;techniques&nbsp;of&nbsp;object&nbsp;&nbsp;<BR>commands&nbsp;and&nbsp;class&nbsp;commands.&nbsp;We&nbsp;will&nbsp;not&nbsp;handle&nbsp;the&nbsp;category&nbsp;of&nbsp;&nbsp;<BR>extensions&nbsp;that&nbsp;requires&nbsp;compilation.&nbsp;&nbsp;<BR>&nbsp;<BR>Another&nbsp;important&nbsp;difference&nbsp;is&nbsp;that&nbsp;between&nbsp;extensions&nbsp;with&nbsp;static&nbsp;&nbsp;<BR>and&nbsp;dynamic&nbsp;classes.&nbsp;With&nbsp;static&nbsp;classes,&nbsp;the&nbsp;members&nbsp;of&nbsp;a&nbsp;class&nbsp;&nbsp;<BR>cannot&nbsp;be&nbsp;changed&nbsp;at&nbsp;runtime.&nbsp;You&nbsp;can&nbsp;introduce&nbsp;new&nbsp;classes&nbsp;into&nbsp;a&nbsp;&nbsp;<BR>running&nbsp;system,&nbsp;but&nbsp;once&nbsp;a&nbsp;class&nbsp;is&nbsp;created,&nbsp;you&nbsp;cannot&nbsp;add&nbsp;new&nbsp;&nbsp;<BR>methods&nbsp;or&nbsp;data&nbsp;members&nbsp;to&nbsp;it.&nbsp;Similarly,&nbsp;you&nbsp;can&nbsp;create&nbsp;new&nbsp;instances&nbsp;&nbsp;<BR>of&nbsp;a&nbsp;class,&nbsp;but&nbsp;you&nbsp;cannot&nbsp;(easily)&nbsp;change&nbsp;the&nbsp;class&nbsp;of&nbsp;an&nbsp;existing&nbsp;&nbsp;<BR>instance.&nbsp;&nbsp;<BR>&nbsp;<BR>[Incr&nbsp;Tcl]&nbsp;is&nbsp;an&nbsp;example&nbsp;of&nbsp;a&nbsp;TCL&nbsp;extension&nbsp;with&nbsp;static&nbsp;classes.&nbsp;You&nbsp;&nbsp;<BR>cannot&nbsp;add&nbsp;methods&nbsp;or&nbsp;variables&nbsp;to&nbsp;an&nbsp;existing&nbsp;class&nbsp;or&nbsp;object.&nbsp;You&nbsp;can,&nbsp;<BR>&nbsp;however,&nbsp;change&nbsp;the&nbsp;implementation&nbsp;of&nbsp;any&nbsp;method&nbsp;of&nbsp;a&nbsp;class&nbsp;(just&nbsp;&nbsp;<BR>like&nbsp;rewriting&nbsp;a&nbsp;procedure&nbsp;body&nbsp;in&nbsp;pure&nbsp;TCL).&nbsp;And&nbsp;of&nbsp;course,&nbsp;you&nbsp;can&nbsp;&nbsp;<BR>inherit&nbsp;from&nbsp;an&nbsp;existing&nbsp;class&nbsp;and&nbsp;add&nbsp;new&nbsp;methods&nbsp;and&nbsp;variables&nbsp;in&nbsp;&nbsp;<BR>the&nbsp;derived&nbsp;class.&nbsp;&nbsp;<BR>&nbsp;<BR>But&nbsp;since&nbsp;TCL&nbsp;is&nbsp;a&nbsp;dynamic&nbsp;language,&nbsp;in&nbsp;which&nbsp;you&nbsp;can&nbsp;introduce&nbsp;new&nbsp;&nbsp;<BR>procedures&nbsp;and&nbsp;new&nbsp;variables&nbsp;at&nbsp;run-time,&nbsp;it&nbsp;seems&nbsp;more&nbsp;appropriate&nbsp;to&nbsp;&nbsp;<BR>also&nbsp;allow&nbsp;the&nbsp;creation&nbsp;of&nbsp;new&nbsp;methods&nbsp;and&nbsp;member&nbsp;variables&nbsp;at&nbsp;run-time.&nbsp;<BR>&nbsp;That&nbsp;requires&nbsp;a&nbsp;dynamic&nbsp;class&nbsp;mechanism&nbsp;such&nbsp;as&nbsp;offered&nbsp;by&nbsp;&gt;&gt;&nbsp;OTcl.&nbsp;&nbsp;<BR>&nbsp;<BR>Both&nbsp;static&nbsp;and&nbsp;dynamic&nbsp;object-oriented&nbsp;extensions&nbsp;of&nbsp;TCL&nbsp;can&nbsp;make&nbsp;use&nbsp;&nbsp;<BR>of&nbsp;the&nbsp;techniques&nbsp;described&nbsp;in&nbsp;this&nbsp;paper.&nbsp;&nbsp;<BR>&nbsp;<BR>Many&nbsp;thanks&nbsp;for&nbsp;bob&nbsp;Techentin&nbsp;for&nbsp;sharing&nbsp;his&nbsp;[Incr&nbsp;Tcl]&nbsp;knowledge.&nbsp;&nbsp;<BR>&nbsp;<BR>A&nbsp;simple&nbsp;example&nbsp;<BR>Suppose&nbsp;we&nbsp;want&nbsp;to&nbsp;manipulate&nbsp;objects&nbsp;that&nbsp;store&nbsp;a&nbsp;single&nbsp;attribute,&nbsp;for&nbsp;<BR>&nbsp;example&nbsp;the&nbsp;name&nbsp;of&nbsp;a&nbsp;color.&nbsp;Each&nbsp;object&nbsp;has&nbsp;its&nbsp;own&nbsp;color.&nbsp;We&nbsp;also&nbsp;&nbsp;<BR>need&nbsp;to&nbsp;give&nbsp;each&nbsp;object&nbsp;a&nbsp;unique&nbsp;identifier&nbsp;or&nbsp;number&nbsp;to&nbsp;distinguish&nbsp;it&nbsp;<BR>&nbsp;from&nbsp;other&nbsp;objects.&nbsp;&nbsp;<BR>&nbsp;<BR>We&nbsp;store&nbsp;the&nbsp;object&nbsp;colors&nbsp;in&nbsp;a&nbsp;TCL&nbsp;array,&nbsp;indexed&nbsp;by&nbsp;the&nbsp;object&nbsp;name.&nbsp;&nbsp;<BR>For&nbsp;example:&nbsp;&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;set&nbsp;a_color(a1)&nbsp;green&nbsp;<BR>&nbsp;&nbsp;set&nbsp;a_color(a2)&nbsp;yellow&nbsp;<BR>&nbsp;&nbsp;set&nbsp;a_color(a3)&nbsp;red&nbsp;<BR>&nbsp;<BR>We&nbsp;now&nbsp;have&nbsp;three&nbsp;objects&nbsp;a1,&nbsp;a2,&nbsp;a3,&nbsp;each&nbsp;with&nbsp;its&nbsp;own&nbsp;color.&nbsp;Even&nbsp;an&nbsp;&nbsp;<BR>extremely&nbsp;simple&nbsp;approach&nbsp;like&nbsp;this&nbsp;one&nbsp;is&nbsp;already&nbsp;useful&nbsp;in&nbsp;many&nbsp;&nbsp;<BR>cases&nbsp;where&nbsp;you&nbsp;need&nbsp;to&nbsp;map&nbsp;object&nbsp;attributes&nbsp;to&nbsp;their&nbsp;values.&nbsp;&nbsp;<BR>Simplicity&nbsp;is&nbsp;not&nbsp;a&nbsp;bad&nbsp;property&nbsp;of&nbsp;designs,&nbsp;but&nbsp;a&nbsp;very&nbsp;good&nbsp;one.&nbsp;&nbsp;<BR>We&nbsp;can&nbsp;make&nbsp;this&nbsp;more&nbsp;attractive&nbsp;and&nbsp;hide&nbsp;the&nbsp;array,&nbsp;by&nbsp;writing&nbsp;two&nbsp;&nbsp;<BR>access&nbsp;procedures:&nbsp;&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;example1/apples.tcl&nbsp;<BR>&nbsp;&nbsp;&nbsp;proc&nbsp;get_color&nbsp;{obj_name}&nbsp;{&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;global&nbsp;a_color&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;{&nbsp;[info&nbsp;exists&nbsp;a_color($obj_name)]&nbsp;}&nbsp;{&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;$a_color($obj_name)&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;puts&nbsp;&quot;Warning:&nbsp;$obj_name&nbsp;has&nbsp;no&nbsp;color!&quot;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;&quot;transparent&quot;&nbsp;&nbsp;&nbsp;;&nbsp;#&nbsp;return&nbsp;a&nbsp;default&nbsp;color&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<BR>&nbsp;&nbsp;&nbsp;}&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;proc&nbsp;set_color&nbsp;{obj_name&nbsp;color}&nbsp;{&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;global&nbsp;a_color&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;set&nbsp;a_color($obj_name)&nbsp;$color&nbsp;<BR>&nbsp;&nbsp;&nbsp;}&nbsp;<BR>&nbsp;<BR>We&nbsp;now&nbsp;access&nbsp;the&nbsp;colors&nbsp;of&nbsp;objects&nbsp;as&nbsp;follows:&nbsp;&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;set_color&nbsp;a1&nbsp;green&nbsp;<BR>&nbsp;&nbsp;&nbsp;puts&nbsp;&quot;a1&nbsp;has&nbsp;color&nbsp;[get_color&nbsp;a1]&quot;&nbsp;<BR>&nbsp;<BR>The&nbsp;next&nbsp;step&nbsp;is&nbsp;to&nbsp;introduce&nbsp;some&nbsp;syntactic&nbsp;sugar:&nbsp;just&nbsp;a&nbsp;small&nbsp;&nbsp;<BR>improvement&nbsp;that&nbsp;makes&nbsp;the&nbsp;syntax&nbsp;look&nbsp;better,&nbsp;but&nbsp;does&nbsp;not&nbsp;really&nbsp;&nbsp;<BR>change&nbsp;anything&nbsp;fundamental.&nbsp;We&nbsp;create&nbsp;the&nbsp;following&nbsp;procedure:&nbsp;&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;example2/apples.tcl&nbsp;<BR>&nbsp;&nbsp;&nbsp;proc&nbsp;a1&nbsp;{command&nbsp;args}&nbsp;{&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;{&nbsp;$command&nbsp;==&nbsp;&quot;get_color&quot;&nbsp;}&nbsp;{&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;[get_color&nbsp;a1]&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;elseif&nbsp;{&nbsp;$command&nbsp;==&nbsp;&quot;set_color&quot;&nbsp;}&nbsp;{&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;set_color&nbsp;a1&nbsp;[lindex&nbsp;$args&nbsp;0]&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;puts&nbsp;&quot;Error:&nbsp;Unknown&nbsp;command&nbsp;$command&quot;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<BR>&nbsp;&nbsp;&nbsp;}&nbsp;<BR>&nbsp;<BR>Using&nbsp;this&nbsp;procedure,&nbsp;we&nbsp;can&nbsp;now&nbsp;access&nbsp;the&nbsp;color&nbsp;of&nbsp;the&nbsp;a1&nbsp;object&nbsp;as&nbsp;&nbsp;<BR>follows:&nbsp;&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;a1&nbsp;set_color&nbsp;yellow&nbsp;<BR>&nbsp;&nbsp;&nbsp;puts&nbsp;&quot;a1&nbsp;has&nbsp;color&nbsp;[a1&nbsp;get_color]&quot;&nbsp;<BR>&nbsp;<BR>As&nbsp;you&nbsp;can&nbsp;see,&nbsp;all&nbsp;this&nbsp;really&nbsp;does&nbsp;is&nbsp;swap&nbsp;the&nbsp;positions&nbsp;of&nbsp;the&nbsp;object&nbsp;<BR>&nbsp;name&nbsp;and&nbsp;the&nbsp;name&nbsp;of&nbsp;the&nbsp;get_color&nbsp;or&nbsp;set_color&nbsp;procedure.&nbsp;Not&nbsp;very&nbsp;&nbsp;<BR>useful&nbsp;in&nbsp;itself,&nbsp;but&nbsp;it&nbsp;makes&nbsp;the&nbsp;syntax&nbsp;look&nbsp;more&nbsp;like&nbsp;an&nbsp;object&nbsp;&nbsp;<BR>invocation.&nbsp;It&nbsp;looks&nbsp;as&nbsp;if&nbsp;we&nbsp;invoke&nbsp;the&nbsp;'method'&nbsp;set_color&nbsp;on&nbsp;the&nbsp;&nbsp;<BR>'object'&nbsp;a1.&nbsp;&nbsp;<BR>&nbsp;<BR>Procedure&nbsp;a1&nbsp;is&nbsp;called&nbsp;an&nbsp;object&nbsp;command.&nbsp;Its&nbsp;first&nbsp;argument&nbsp;is&nbsp;the&nbsp;name&nbsp;<BR>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -