<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.robnugen.com/w/index.php?action=history&amp;feed=atom&amp;title=Programming%3ATcl_Basique_%28unauthorized_copy%29</id>
	<title>Programming:Tcl Basique (unauthorized copy) - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.robnugen.com/w/index.php?action=history&amp;feed=atom&amp;title=Programming%3ATcl_Basique_%28unauthorized_copy%29"/>
	<link rel="alternate" type="text/html" href="https://wiki.robnugen.com/w/index.php?title=Programming:Tcl_Basique_(unauthorized_copy)&amp;action=history"/>
	<updated>2026-04-06T23:09:01Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.39.3</generator>
	<entry>
		<id>https://wiki.robnugen.com/w/index.php?title=Programming:Tcl_Basique_(unauthorized_copy)&amp;diff=749&amp;oldid=prev</id>
		<title>Rob: Protected &quot;Programming:Tcl Basique (unauthorized copy)&quot;: don&#039;t want anyone to muck with this copy; they should work with the original [edit=sysop:move=sysop]</title>
		<link rel="alternate" type="text/html" href="https://wiki.robnugen.com/w/index.php?title=Programming:Tcl_Basique_(unauthorized_copy)&amp;diff=749&amp;oldid=prev"/>
		<updated>2008-12-21T09:29:37Z</updated>

		<summary type="html">&lt;p&gt;Protected &amp;quot;&lt;a href=&quot;/wiki/Programming:Tcl_Basique_(unauthorized_copy)&quot; title=&quot;Programming:Tcl Basique (unauthorized copy)&quot;&gt;Programming:Tcl Basique (unauthorized copy)&lt;/a&gt;&amp;quot;: don&amp;#039;t want anyone to muck with this copy; they should work with the original [edit=sysop:move=sysop]&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 02:29, 21 December 2008&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-notice&quot; lang=&quot;en&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(No difference)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Rob</name></author>
	</entry>
	<entry>
		<id>https://wiki.robnugen.com/w/index.php?title=Programming:Tcl_Basique_(unauthorized_copy)&amp;diff=748&amp;oldid=prev</id>
		<title>Rob: unauthorized copy (with some edits to make it work on MediaWiki)</title>
		<link rel="alternate" type="text/html" href="https://wiki.robnugen.com/w/index.php?title=Programming:Tcl_Basique_(unauthorized_copy)&amp;diff=748&amp;oldid=prev"/>
		<updated>2008-12-21T09:28:51Z</updated>

		<summary type="html">&lt;p&gt;unauthorized copy (with some edits to make it work on MediaWiki)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt; THIS IS AN UNAUTHORIZED COPY OF THE PAGE Basique.  THE ORIGINAL PAGE IS HERE: [http://wiki.tcl.tk/15750 Basique]&lt;br /&gt;
&lt;br /&gt;
(I&amp;#039;m making a copy just in case [http://wiki.tcl.tk http://wiki.tcl.tk] goes away, but with a great domain like that, I imagine it will be stable for a while.)&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
[http://wiki.tcl.tk/9126 Sarnold] is the creator of this software.&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;basique.tcl&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;tcl&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    namespace eval ::basique {&lt;br /&gt;
	namespace export class&lt;br /&gt;
	variable classes&lt;br /&gt;
	array set classes {}&lt;br /&gt;
&lt;br /&gt;
	proc class {name code} {&lt;br /&gt;
	    if {[string range $name 0 1] ne &amp;quot;::&amp;quot;} {&lt;br /&gt;
		set name ::$name&lt;br /&gt;
	    }&lt;br /&gt;
	    variable classes&lt;br /&gt;
	    if {[info exists classes($name)]} {&lt;br /&gt;
		cdelete $name&lt;br /&gt;
	    }&lt;br /&gt;
	    set common_prelude [string map [list %NAME% $name] {&lt;br /&gt;
		# does nothing&lt;br /&gt;
		proc variable {var args} {&lt;br /&gt;
		    lappend ::basique::classes(%NAME%,instvars) $var&lt;br /&gt;
		}&lt;br /&gt;
		# provide common variable statement&lt;br /&gt;
		proc common {var args} {&lt;br /&gt;
		    if {[llength $args] &amp;gt; 1} {&lt;br /&gt;
			error &amp;quot;common varname ?default?&amp;quot;&lt;br /&gt;
		    }&lt;br /&gt;
		    if {[llength $args] == 0} {&lt;br /&gt;
			uplevel 1 ::variable $var&lt;br /&gt;
			return&lt;br /&gt;
		    }&lt;br /&gt;
		    uplevel 1 ::variable $var [lindex $args 0]&lt;br /&gt;
		    return&lt;br /&gt;
		}&lt;br /&gt;
		proc alias {name args} {&lt;br /&gt;
		    if {[llength $name] != 1} {&lt;br /&gt;
			error &amp;quot;cannot create such a composite alias&amp;quot;&lt;br /&gt;
		    }&lt;br /&gt;
		    proc $name {args} [string map [list ARGS $args] {&lt;br /&gt;
			eval [linsert $args 0 ARGS]&lt;br /&gt;
		    }]&lt;br /&gt;
		}&lt;br /&gt;
		proc component {var args} {&lt;br /&gt;
		    foreach {opt val} $args {&lt;br /&gt;
			switch -- $opt {&lt;br /&gt;
			    -common	 {set common $val}&lt;br /&gt;
			    -initscript     {::basique::initscript    %NAME% $val $var $common}&lt;br /&gt;
			    -destroyscript  {::basique::destroyscript %NAME% $val $var $common}&lt;br /&gt;
			    default {&lt;br /&gt;
				error &amp;quot;option should be one of : -common -initscript -destroyscript&amp;quot;&lt;br /&gt;
			    }&lt;br /&gt;
			}&lt;br /&gt;
		    }&lt;br /&gt;
		    if {![info exists common] || !$common} {&lt;br /&gt;
			return&lt;br /&gt;
		    }&lt;br /&gt;
		    proc $var {subcmd args} [string map [list VAR $var] {&lt;br /&gt;
			common VAR&lt;br /&gt;
			uplevel 1 [linsert $args 0 $VAR $subcmd]&lt;br /&gt;
		    }]&lt;br /&gt;
		}&lt;br /&gt;
	    }]&lt;br /&gt;
	    namespace eval $name $common_prelude\n$code&lt;br /&gt;
	    if {[info exists classes($name,compinit)]} {&lt;br /&gt;
		namespace eval $name $classes($name,compinit)&lt;br /&gt;
	    }&lt;br /&gt;
	    catch {${name}::__classinit__}&lt;br /&gt;
	    set classes($name) $code&lt;br /&gt;
	    CreateClass $name&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	proc initscript {class script var common} {&lt;br /&gt;
	    variable classes&lt;br /&gt;
	    if {$common} {&lt;br /&gt;
		append classes($class,compinit) &amp;quot;common $var\n $script\n&amp;quot;&lt;br /&gt;
	    } else  {&lt;br /&gt;
		append classes($class,instcompinit) &amp;quot;variable $var\n $script\n&amp;quot;&lt;br /&gt;
	    }&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	proc destroyscript {class script var common} {&lt;br /&gt;
	    variable classes&lt;br /&gt;
	    if {$common} {&lt;br /&gt;
		append classes($class,compdestroy) &amp;quot;common $var\n $script\n&amp;quot;&lt;br /&gt;
	    } else  {&lt;br /&gt;
		append classes($class,instcompdestroy) &amp;quot;variable $var\n $script\n&amp;quot;&lt;br /&gt;
	    }&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	proc cdelete {name} {&lt;br /&gt;
	    variable classes&lt;br /&gt;
	    unset classes($name)&lt;br /&gt;
	    catch {${name}::__classdestroy__}&lt;br /&gt;
	    catch {namespace eval $name $classes($name,compdestroy)}&lt;br /&gt;
	    foreach sub {instvars compinit instcompinit compdestroy instcompdestroy} {&lt;br /&gt;
		catch {unset classes($name,$sub)}&lt;br /&gt;
	    }&lt;br /&gt;
	    catch {namespace delete $name}&lt;br /&gt;
	    catch {rename $name &amp;quot;&amp;quot;}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	# crée la commande qui instanciera les objets&lt;br /&gt;
	proc CreateClass {name} {&lt;br /&gt;
	    variable classes&lt;br /&gt;
	    # the &amp;#039;real&amp;#039; constructor (__init__ is the one at user level)&lt;br /&gt;
	    # le constructeur réel (le constructeur public est __init__)&lt;br /&gt;
	    proc $name {args} [string map [list %NAME% $name] {&lt;br /&gt;
		if {![llength $args]} {&lt;br /&gt;
		    set args {%AUTO%}&lt;br /&gt;
		}&lt;br /&gt;
		if {[lindex $args 0] eq &amp;quot;%AUTO%&amp;quot;} {&lt;br /&gt;
		    set args [linsert $args 0 new]&lt;br /&gt;
		}&lt;br /&gt;
		switch -- [lindex $args 0] {&lt;br /&gt;
		    new {&lt;br /&gt;
			set instance [lindex $args 1]&lt;br /&gt;
			if {$instance eq &amp;quot;%AUTO%&amp;quot;} {&lt;br /&gt;
			    set instance [::basique::autoname %NAME%]&lt;br /&gt;
			}&lt;br /&gt;
			set args [lrange $args 2 end]&lt;br /&gt;
		    }&lt;br /&gt;
		    default {&lt;br /&gt;
			return [uplevel 1 namespace eval %NAME% $args]&lt;br /&gt;
		    }&lt;br /&gt;
		}&lt;br /&gt;
		if {[string range $instance 0 1] ne &amp;quot;::&amp;quot;} {&lt;br /&gt;
		    set instance ::$instance&lt;br /&gt;
		}&lt;br /&gt;
		# creates the prelude&lt;br /&gt;
		set instance_prelude [string map [list %OBJ% $instance] {&lt;br /&gt;
		    proc common {var args} {&lt;br /&gt;
			if {[llength $args]&amp;gt;1} {&lt;br /&gt;
			    error &amp;quot;common var ?default?&amp;quot;&lt;br /&gt;
			}&lt;br /&gt;
			if {[llength $args]==0} {&lt;br /&gt;
			    uplevel 1 [list upvar %NAME%::$var $var]&lt;br /&gt;
			}&lt;br /&gt;
		    }&lt;br /&gt;
		    proc body {name arglist body} {&lt;br /&gt;
			proc %OBJ%::$name $arglist $body&lt;br /&gt;
		    }&lt;br /&gt;
		    proc . {varname} {&lt;br /&gt;
			return %OBJ%::$varname&lt;br /&gt;
		    }&lt;br /&gt;
		    proc self {} {&lt;br /&gt;
			return %OBJ%&lt;br /&gt;
		    }&lt;br /&gt;
		    proc -&amp;gt; {varname} {&lt;br /&gt;
			variable $varname&lt;br /&gt;
			set $varname&lt;br /&gt;
		    }&lt;br /&gt;
		    proc component {var args} {&lt;br /&gt;
			foreach {opt val} $args {&lt;br /&gt;
			    switch -- $opt {&lt;br /&gt;
				-common       {set common $val}&lt;br /&gt;
				-initscript - -destroyscript {}&lt;br /&gt;
				default {&lt;br /&gt;
				    error &amp;quot;option should be one of : -common -initscript -destroyscript&amp;quot;&lt;br /&gt;
				}&lt;br /&gt;
			    }&lt;br /&gt;
			}&lt;br /&gt;
			if {![info exists common] || !$common} {&lt;br /&gt;
			    set type variable&lt;br /&gt;
			    uplevel 1 variable $var&lt;br /&gt;
			} else  {&lt;br /&gt;
			    set type common&lt;br /&gt;
			}&lt;br /&gt;
			proc $var {subcmd args} [string map [list TYPE $type VAR $var] {&lt;br /&gt;
			    TYPE VAR&lt;br /&gt;
			    uplevel 1 [linsert $args 0 $VAR $subcmd]&lt;br /&gt;
			}]&lt;br /&gt;
		    }&lt;br /&gt;
		    proc alias {name args} {&lt;br /&gt;
			if {[llength $name] != 1} {&lt;br /&gt;
			    error &amp;quot;cannot create such a composite alias&amp;quot;&lt;br /&gt;
			}&lt;br /&gt;
			proc $name {args} [string map [list ARGS $args] {&lt;br /&gt;
			    uplevel 1 [linsert $args 0 ARGS]&lt;br /&gt;
			}]&lt;br /&gt;
		    }&lt;br /&gt;
		}]&lt;br /&gt;
		# insert &amp;#039;instance&amp;#039; where you want quickly to get instance variables&lt;br /&gt;
		# (instead, you would have to type lots of &amp;#039;variable&amp;#039; statements)&lt;br /&gt;
		append instance_prelude &amp;quot;proc instance \{\} \{\nuplevel 1 \{\n&amp;quot;&lt;br /&gt;
		if {[info exists ::basique::classes(%NAME%,instvars)]} {&lt;br /&gt;
		    foreach var $::basique::classes(%NAME%,instvars) {&lt;br /&gt;
			append instance_prelude &amp;quot;variable $var\n&amp;quot;&lt;br /&gt;
		    }&lt;br /&gt;
		}&lt;br /&gt;
		append instance_prelude &amp;quot;\}\n\}\n&amp;quot;&lt;br /&gt;
		# %NAME% is preprocessed into ::myclass&lt;br /&gt;
		# then ::myclass body&amp;#039;s namespace is mapped into the instance namespace&lt;br /&gt;
		set body [string map [list [string trim %NAME% :]:: \&lt;br /&gt;
			[string trim $instance :]::] $::basique::classes(%NAME%)]&lt;br /&gt;
		namespace eval $instance $instance_prelude&lt;br /&gt;
		namespace eval $instance $body&lt;br /&gt;
		# builds the instance&lt;br /&gt;
		#puts before&lt;br /&gt;
		if {[info exists ::basique::classes(%NAME%,instcompinit)]} {&lt;br /&gt;
		    # initscript at instance level&lt;br /&gt;
		    namespace eval %NAME% $::basique::classes(%NAME%,instcompinit)&lt;br /&gt;
		}&lt;br /&gt;
		uplevel 1 [linsert $args 0 ${instance}::__init__]&lt;br /&gt;
		#puts after&lt;br /&gt;
		proc $instance {command args} [string map [list %OBJ% $instance] {&lt;br /&gt;
		    if {$command eq &amp;quot;destroy&amp;quot;} {&lt;br /&gt;
			%OBJ%::__destroy__&lt;br /&gt;
			if {[info exists ::basique::classes(%NAME%,instcompdestroy)]} {&lt;br /&gt;
			    # destroyscript at instance level&lt;br /&gt;
			    namespace eval %NAME% $::basique::classes(%NAME%,instcompdestroy)&lt;br /&gt;
			}&lt;br /&gt;
			catch {namespace delete %OBJ%}&lt;br /&gt;
			catch {rename %OBJ% &amp;quot;&amp;quot;}&lt;br /&gt;
			return&lt;br /&gt;
		    }&lt;br /&gt;
		    switch -- $command {&lt;br /&gt;
			__init__ - __destroy__ - __classinit__ - __classdestroy__ - common - instance {&lt;br /&gt;
			    error &amp;quot;protected command&amp;quot;&lt;br /&gt;
			}&lt;br /&gt;
			default {&lt;br /&gt;
			    return [uplevel 1 [linsert $args 0 %OBJ%::$command]]&lt;br /&gt;
			}&lt;br /&gt;
		    }&lt;br /&gt;
		}]&lt;br /&gt;
		return $instance&lt;br /&gt;
	    }]&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	proc lfilter {var list condition} {&lt;br /&gt;
	    upvar $var x&lt;br /&gt;
	    set out &amp;quot;&amp;quot;&lt;br /&gt;
	    foreach x $list {&lt;br /&gt;
		if {[uplevel 1 expr $condition]} {&lt;br /&gt;
		    lappend out $x&lt;br /&gt;
		}&lt;br /&gt;
	    }&lt;br /&gt;
	    return $out&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	proc autoname {name} {&lt;br /&gt;
	    variable classes&lt;br /&gt;
	    if {![info exists classes($name)]} {&lt;br /&gt;
		error &amp;quot;class $name not found&amp;quot;&lt;br /&gt;
	    }&lt;br /&gt;
	    if {![info exists classes($name,counter)]} {&lt;br /&gt;
		set classes($name,counter) 0&lt;br /&gt;
	    }&lt;br /&gt;
	    while {[llength [info procs ${name}__$classes($name,counter)]]} {&lt;br /&gt;
		incr classes($name,counter)&lt;br /&gt;
	    }&lt;br /&gt;
	    return ${name}__$classes($name,counter)&lt;br /&gt;
	}&lt;br /&gt;
    }&lt;br /&gt;
    package provide basique 1.0&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Rob</name></author>
	</entry>
</feed>