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

📄 00000004.htm

📁 一份很好的linux入门资料
💻 HTM
📖 第 1 页 / 共 5 页
字号:
created.&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;set&nbsp;template&nbsp;{&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;proc&nbsp;@classname@&nbsp;{obj_name&nbsp;args}&nbsp;{&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;The&nbsp;class&nbsp;command&nbsp;in&nbsp;turn&nbsp;creates&nbsp;an&nbsp;object&nbsp;command.&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;Fewer&nbsp;escape&nbsp;characters&nbsp;thanks&nbsp;to&nbsp;the&nbsp;'@'&nbsp;sign.&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;proc&nbsp;$obj_name&nbsp;{command&nbsp;args}&nbsp;\&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;return&nbsp;\[eval&nbsp;dispatch_@classname@&nbsp;$obj_name&nbsp;\$command&nbsp;&nbsp;<BR>\$args\]&quot;&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;Set&nbsp;variable&nbsp;defaults&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;upvar&nbsp;#0&nbsp;$obj_name&nbsp;arr&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;array&nbsp;set&nbsp;arr&nbsp;{@vars@}&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;Then&nbsp;possibly&nbsp;override&nbsp;those&nbsp;defaults&nbsp;with&nbsp;user-supplied&nbsp;&nbsp;<BR>values&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;{&nbsp;[llength&nbsp;$args]&nbsp;&gt;&nbsp;0&nbsp;}&nbsp;{&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;eval&nbsp;$obj_name&nbsp;configure&nbsp;$args&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;regsub&nbsp;-all&nbsp;@classname@&nbsp;$template&nbsp;$classname&nbsp;template&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;regsub&nbsp;-all&nbsp;@vars@&nbsp;$template&nbsp;$vars&nbsp;template&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;eval&nbsp;$template&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;Create&nbsp;the&nbsp;dispatcher,&nbsp;which&nbsp;dispatches&nbsp;to&nbsp;one&nbsp;of&nbsp;the&nbsp;class&nbsp;&nbsp;<BR>methods&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;set&nbsp;template&nbsp;{&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;proc&nbsp;dispatch_@classname@&nbsp;{obj_name&nbsp;command&nbsp;args}&nbsp;{&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;upvar&nbsp;#0&nbsp;$obj_name&nbsp;arr&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;{&nbsp;$command&nbsp;==&nbsp;&quot;configure&quot;&nbsp;||&nbsp;$command&nbsp;==&nbsp;&quot;config&quot;&nbsp;}&nbsp;{&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;array&nbsp;set&nbsp;arr&nbsp;$args&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;elseif&nbsp;{&nbsp;$command&nbsp;==&nbsp;&quot;cget&quot;&nbsp;}&nbsp;{&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;$arr([lindex&nbsp;$args&nbsp;0])&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;{&nbsp;[lsearch&nbsp;{@methods@}&nbsp;$command]&nbsp;!=&nbsp;-1&nbsp;}&nbsp;{&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;uplevel&nbsp;1&nbsp;@classname@_${command}&nbsp;$obj_name&nbsp;$args&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;regsub&nbsp;-all&nbsp;@classname@&nbsp;$template&nbsp;$classname&nbsp;template&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;regsub&nbsp;-all&nbsp;@methods@&nbsp;$template&nbsp;$methods&nbsp;template&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;eval&nbsp;$template&nbsp;<BR>&nbsp;&nbsp;&nbsp;}&nbsp;<BR>&nbsp;<BR>You&nbsp;see&nbsp;that&nbsp;this&nbsp;simplifies&nbsp;the&nbsp;code.&nbsp;We&nbsp;use&nbsp;the&nbsp;'@'&nbsp;sign&nbsp;because&nbsp;it&nbsp;is&nbsp;<BR>&nbsp;not&nbsp;frequently&nbsp;used&nbsp;in&nbsp;normal&nbsp;TCL&nbsp;code.&nbsp;We&nbsp;postpone&nbsp;the&nbsp;evaluation&nbsp;of&nbsp;&nbsp;<BR>$classname&nbsp;and&nbsp;other&nbsp;variables&nbsp;until&nbsp;we&nbsp;are&nbsp;out&nbsp;of&nbsp;the&nbsp;inner&nbsp;procedure&nbsp;&nbsp;<BR>body,&nbsp;so&nbsp;that&nbsp;the&nbsp;number&nbsp;of&nbsp;escape&nbsp;characters&nbsp;is&nbsp;reduced&nbsp;to&nbsp;almost&nbsp;zero.&nbsp;<BR>&nbsp;&nbsp;<BR>&nbsp;<BR>With&nbsp;or&nbsp;without&nbsp;this&nbsp;&quot;template&quot;&nbsp;technique,&nbsp;we&nbsp;can&nbsp;now&nbsp;create&nbsp;our&nbsp;&nbsp;<BR>original&nbsp;classes&nbsp;apple&nbsp;and&nbsp;fridge&nbsp;in&nbsp;a&nbsp;more&nbsp;compact&nbsp;way:&nbsp;&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;example12/classes.tcl&nbsp;<BR>&nbsp;&nbsp;&nbsp;class&nbsp;apple&nbsp;{-color&nbsp;green&nbsp;-size&nbsp;5&nbsp;-price&nbsp;10}&nbsp;{byte}&nbsp;<BR>&nbsp;&nbsp;&nbsp;proc&nbsp;apple_byte&nbsp;{self}&nbsp;{&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;upvar&nbsp;#0&nbsp;$self&nbsp;arr&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;puts&nbsp;&quot;Taking&nbsp;a&nbsp;byte&nbsp;from&nbsp;apple&nbsp;$self&quot;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;incr&nbsp;arr(-size)&nbsp;-1&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;{&nbsp;$arr(-size)&nbsp;&lt;=&nbsp;0&nbsp;}&nbsp;{&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;puts&nbsp;&quot;Apple&nbsp;$self&nbsp;now&nbsp;completely&nbsp;eaten!&nbsp;&nbsp;Deleting&nbsp;it...&quot;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delete&nbsp;$self&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<BR>&nbsp;&nbsp;&nbsp;}&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;class&nbsp;fridge&nbsp;{-state&nbsp;closed&nbsp;-label&nbsp;A}&nbsp;{open&nbsp;close}&nbsp;<BR>&nbsp;&nbsp;&nbsp;proc&nbsp;fridge_open&nbsp;{self}&nbsp;{&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;upvar&nbsp;#0&nbsp;$self&nbsp;arr&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;{&nbsp;$arr(-state)&nbsp;==&nbsp;&quot;open&quot;&nbsp;}&nbsp;{&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;puts&nbsp;&quot;Fridge&nbsp;$self&nbsp;already&nbsp;open.&quot;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;set&nbsp;arr(-state)&nbsp;&quot;open&quot;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;puts&nbsp;&quot;Opening&nbsp;fridge&nbsp;$self...&quot;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<BR>&nbsp;&nbsp;&nbsp;}&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;proc&nbsp;fridge_close&nbsp;{self}&nbsp;{&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;upvar&nbsp;#0&nbsp;$self&nbsp;arr&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;{&nbsp;$arr(-state)&nbsp;==&nbsp;&quot;closed&quot;&nbsp;}&nbsp;{&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;puts&nbsp;&quot;Fridge&nbsp;$self&nbsp;already&nbsp;closed.&quot;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;set&nbsp;arr(-state)&nbsp;&quot;closed&quot;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;puts&nbsp;&quot;Closing&nbsp;fridge&nbsp;$self...&quot;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<BR>&nbsp;&nbsp;&nbsp;}&nbsp;<BR>&nbsp;<BR>There&nbsp;are&nbsp;several&nbsp;things&nbsp;to&nbsp;note&nbsp;in&nbsp;this&nbsp;implementation:&nbsp;&nbsp;<BR>&nbsp;<BR>Creating&nbsp;new&nbsp;classes&nbsp;is&nbsp;indeed&nbsp;a&nbsp;lot&nbsp;simpler&nbsp;than&nbsp;before.&nbsp;We&nbsp;only&nbsp;need&nbsp;&nbsp;<BR>one&nbsp;line&nbsp;with&nbsp;the&nbsp;class&nbsp;&quot;declaration&quot;,&nbsp;plus&nbsp;one&nbsp;proc&nbsp;for&nbsp;each&nbsp;of&nbsp;the&nbsp;&nbsp;<BR>class&nbsp;methods.&nbsp;&nbsp;<BR>Each&nbsp;method&nbsp;is&nbsp;implemented&nbsp;as&nbsp;a&nbsp;global&nbsp;proc&nbsp;which&nbsp;has&nbsp;the&nbsp;instance&nbsp;&nbsp;<BR>name&nbsp;as&nbsp;its&nbsp;first&nbsp;argument.&nbsp;Any&nbsp;other&nbsp;arguments&nbsp;are&nbsp;optional.&nbsp;&nbsp;<BR>In&nbsp;the&nbsp;implementation&nbsp;of&nbsp;each&nbsp;method,&nbsp;we&nbsp;access&nbsp;the&nbsp;object's&nbsp;array&nbsp;&nbsp;<BR>directly.&nbsp;We&nbsp;could&nbsp;make&nbsp;the&nbsp;methods&nbsp;less&nbsp;dependent&nbsp;on&nbsp;the&nbsp;actual&nbsp;&nbsp;<BR>implementation&nbsp;of&nbsp;the&nbsp;object&nbsp;by&nbsp;using&nbsp;configure&nbsp;and&nbsp;cget&nbsp;instead,&nbsp;for&nbsp;&nbsp;<BR>example&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;example13/classes.tcl&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;proc&nbsp;fridge_close&nbsp;{self}&nbsp;{&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;{&nbsp;[$self&nbsp;cget&nbsp;-state]&nbsp;==&nbsp;&quot;closed&quot;&nbsp;}&nbsp;{&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;puts&nbsp;&quot;Fridge&nbsp;$self&nbsp;already&nbsp;closed.&quot;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;else&nbsp;{&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$self&nbsp;configure&nbsp;-state&nbsp;&quot;closed&quot;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;puts&nbsp;&quot;Closing&nbsp;fridge&nbsp;$self...&quot;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<BR>&nbsp;<BR>This&nbsp;is&nbsp;less&nbsp;implementation-dependent,&nbsp;and&nbsp;perhaps&nbsp;slightly&nbsp;more&nbsp;&nbsp;<BR>readable.&nbsp;It&nbsp;is&nbsp;less&nbsp;efficient&nbsp;though,&nbsp;because&nbsp;the&nbsp;configure&nbsp;and&nbsp;cget&nbsp;&nbsp;<BR>implementations&nbsp;add&nbsp;an&nbsp;extra&nbsp;level&nbsp;of&nbsp;procedure&nbsp;calls&nbsp;with&nbsp;a&nbsp;couple&nbsp;of&nbsp;&nbsp;<BR>ifs.&nbsp;You&nbsp;should&nbsp;probably&nbsp;decide&nbsp;for&nbsp;yourself&nbsp;which&nbsp;of&nbsp;the&nbsp;two&nbsp;ways&nbsp;you&nbsp;&nbsp;<BR>are&nbsp;going&nbsp;to&nbsp;use,&nbsp;depending&nbsp;on&nbsp;the&nbsp;importance&nbsp;of&nbsp;efficiency&nbsp;in&nbsp;your&nbsp;&nbsp;<BR>application.&nbsp;&nbsp;<BR>Also&nbsp;note&nbsp;that&nbsp;we&nbsp;can&nbsp;implement&nbsp;the&nbsp;class&nbsp;procedure&nbsp;in&nbsp;a&nbsp;slightly&nbsp;&nbsp;<BR>different&nbsp;way,&nbsp;without&nbsp;actually&nbsp;knowing&nbsp;in&nbsp;advance&nbsp;the&nbsp;list&nbsp;of&nbsp;all&nbsp;the&nbsp;&nbsp;<BR>variables&nbsp;and&nbsp;methods&nbsp;of&nbsp;the&nbsp;class.&nbsp;The&nbsp;new&nbsp;implementation&nbsp;could&nbsp;look&nbsp;&nbsp;<BR>like&nbsp;this:&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;example14/classes.tcl&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;No&nbsp;more&nbsp;'methods'&nbsp;argument&nbsp;here;&nbsp;'vars'&nbsp;is&nbsp;optional&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;proc&nbsp;class&nbsp;{classname&nbsp;{vars&nbsp;&quot;&quot;}}&nbsp;{&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;Create&nbsp;the&nbsp;class&nbsp;command,&nbsp;which&nbsp;will&nbsp;allow&nbsp;new&nbsp;instances&nbsp;to&nbsp;&nbsp;<BR>be&nbsp;created.&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;set&nbsp;template&nbsp;{&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;proc&nbsp;@classname@&nbsp;{obj_name&nbsp;args}&nbsp;{&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;The&nbsp;class&nbsp;command&nbsp;in&nbsp;turn&nbsp;creates&nbsp;an&nbsp;object&nbsp;command.&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;Fewer&nbsp;escape&nbsp;characters&nbsp;thanks&nbsp;to&nbsp;the&nbsp;'@'&nbsp;sign.&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;proc&nbsp;$obj_name&nbsp;{command&nbsp;args}&nbsp;\&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;return&nbsp;\[eval&nbsp;dispatch_@classname@&nbsp;$obj_name&nbsp;&nbsp;<BR>\$command&nbsp;\$args\]&quot;&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;Set&nbsp;variable&nbsp;defaults,&nbsp;if&nbsp;any&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;upvar&nbsp;#0&nbsp;$obj_name&nbsp;arr&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@set_vars@&nbsp;<BR>&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#&nbsp;Then&nbsp;possibly&nbsp;override&nbsp;those&nbsp;defaults&nbsp;with&nbsp;&nbsp;<BR>user-supplied&nbsp;values&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i

⌨️ 快捷键说明

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