diff options
author | N.N. <matju@users.sourceforge.net> | 2010-01-05 22:49:36 +0000 |
---|---|---|
committer | N.N. <matju@users.sourceforge.net> | 2010-01-05 22:49:36 +0000 |
commit | 8dbec761cf858ea65900c8a094599857208d8c3a (patch) | |
tree | 3228c023f87f23a354da3b57fdc2afe5b7052032 /desiredata/src/poe.tcl | |
parent | 529e59635598e2d90a7a49f6b4c676f8366109ba (diff) |
svn path=/trunk/; revision=12907
Diffstat (limited to 'desiredata/src/poe.tcl')
-rw-r--r-- | desiredata/src/poe.tcl | 285 |
1 files changed, 0 insertions, 285 deletions
diff --git a/desiredata/src/poe.tcl b/desiredata/src/poe.tcl deleted file mode 100644 index 22c72d3f..00000000 --- a/desiredata/src/poe.tcl +++ /dev/null @@ -1,285 +0,0 @@ -# $Id: poe.tcl,v 1.1.2.2.2.27 2007-10-15 15:58:13 chunlee Exp $ -#----------------------------------------------------------------# -# POETCL -# -# Copyright (c) 2005,2006,2007,2008 by Mathieu Bouchard -# -# This program is free software; you can redistribute it and/or -# modify it under the terms of the GNU General Public License -# as published by the Free Software Foundation; either version 2 -# of the License, or (at your option) any later version. -# -# See file ../COPYING.desire-client.txt for further informations on licensing terms. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -# -# Note that this is not under the same license as the rest of PureData. -# Even the DesireData server-side modifications stay on the same license -# as the rest of PureData. -# -#-----------------------------------------------------------------------------------# - -# (please distinguish between what this is and what dataflow is) -# note, the toplevel class is called "thing". - -package provide poe 0.1 - -set nextid 0 -set _(Class:_class) Class -set _(Class:_super) {Thing} -set have_expand [expr ![catch {set a {foo bar}; list {expand}$a}]] - -proc correct_splat {code} { - if {!$::have_expand} {return $code} - regsub {{*}} $code {{expand}} -} - -proc proc* {name args body} { - set argl {} - foreach arg $args {set arg [lindex $arg 0]; lappend argl "$arg=\$$arg"} - if {[regexp {_unknown$} $name]} { - proc $name $args "upvar 1 selector ___; puts \"\[VTgreen\]CALL TO PROC $name selector=\$___ [join $argl " "]\[VTgrey\]\"; $body" - } else { - if {![regexp "return" $body]} { - set body "time {$body}" - proc $name $args "puts \"\[VTgreen\]CALL TO PROC $name [join $argl " "], \[VTred\]\[lrange \[split \[$body\] \] 0 1\] \[VTgrey\]\"" - } { - proc $name $args "puts \"\[VTgreen\]CALL TO PROC $name [join $argl " "]\[VTgrey\]\"; $body" - } - } -} - -#proc Class_def {self selector args body} { -# global _; if {![info exists _($self:_class)]} {error "unknown class '$self'"} -# proc ${self}_$selector "self $args" "global _; [regsub -all @(\[\\w\\?\]+) $body _(\$self:\\1)]" -#} -#proc def {class selector args body} {$class def $selector $args $body} - -proc expand_macros {body} { - return [regsub -all @(\\\$?\[\\w\\?\]+) $body _(\$self:\\1)] -} - -proc def {self selector argnames body} { - global _ __trace __args - if {![info exists _($self:_class)]} {error "unknown class '$self'"} - set name ${self}_$selector - set argnames [concat [list self] $argnames] - if {([info exists __trace($self:$selector)] || [info exists __trace(*:$selector)] - || [info exists __trace($self:*)] || [info exists __trace(*:*)]) - && ![info exists __trace($self:!$selector)] - && ![info exists __trace(*:!$selector)] - } { - proc* $name $argnames "global _; [expand_macros $body]" - } { - proc $name $argnames "global _; [expand_macros $body]" - } - set __args($name) $argnames - #trace add execution ${self}_$selector enter dedebug -} - -proc class_new {self {super {Thing}}} { - global _ - set _($self:_class) Class - set _($self:_super) $super - set _($self:subclasses) {} - foreach sup $super {lappend _($sup:subclasses) $self} - proc ${self}_new {args} "global _ - set self \[format o%07x \$::nextid\] - incr ::nextid - set _(\$self:_class) $self - setup_dispatcher \$self - eval [concat \[list \$self init\] \$args] - return \$self - " - proc ${self}_new_as {self args} "global _ - if {\[info exists _(\$self:_class)\]} {error \"object '\\$self' already exists\" } - set _(\$self:_class) $self - setup_dispatcher \$self - eval [concat \[list \$self init\] \$args] - return \$self - " - setup_dispatcher $self -} - -# TODO: remove duplicates in lookup -proc lookup_method {class selector methodsv ancestorsv} { - global _ - upvar $methodsv methods - upvar $ancestorsv ancestors - set name ${class}_$selector - if {[llength [info procs $name]]} {lappend methods $name} - lappend ancestors $class - foreach super $_($class:_super) {lookup_method $super $selector methods ancestors} -} - -proc cache_method {class selector} { - global _ __ - set methods {}; set ancestors {} - lookup_method $class $selector methods ancestors - if {![llength $methods]} {set methods [cache_method $class unknown]} - set __($class:$selector) $methods - return $methods -} - -if {$have_expand} { - set dispatch { - set i 0; set class $::_($self:_class) - if {[catch {set methods $::__($class:$selector)}]} {set methods [cache_method $class $selector]} - [lindex $methods 0] $self {expand}$args - } -} else { - set dispatch { - set i 0; set class $::_($self:_class) - if {[catch {set methods $::__($class:$selector)}]} {set methods [cache_method $class $selector]} - [lindex $methods 0] $self {*}$args - } -} -proc setup_dispatcher {self} { - if {[llength [info commands $self]]} {rename $self old_$self} - proc $self {selector args} [regsub -all {\$self} $::dispatch $self] -} - -set super { - upvar 1 self self - upvar 2 methods methods i oi - set i [expr {1+$oi}] - if {[llength $methods] < $i} {error "no more supermethods"} -} -if {$have_expand} { - append super {[lindex $methods $i] $self {expand}$args} -} else { - append super {eval [concat [list [lindex $methods $i] $self] $args]} -} -proc super {args} $super - -class_new Thing {} -#set _(Thing:_super) {} -def Thing init {} {} -def Thing == {other} {return [expr ![string compare $self $other]]} - -# virtual destructor -def Thing delete {} { - foreach elem [array names _ $self:*] {array unset _ $elem} - rename $self "" -} - -def Thing vars {} { - set n [string length $self:] - set ks [list] - foreach k [array names _] { - if {0==[string compare -length $n $self: $k]} {lappend ks [string range $k $n end]} - } - return $ks -} - -def Thing inspect {} { - set t [list "#<$self: "] - foreach k [lsort [$self vars]] {lappend t "$k=[list $@$k] "} - lappend t ">" - return [join $t ""] -} - -def Thing class {} {return $@_class} - -def Thing unknown {args} { - upvar 1 selector selector class class - error "no such method '$selector' for object '$self'\nwith ancestors {[Class_ancestors $class]}" -} - -class_new Class - -# those return only the direct neighbours in the hierarchy -def Class superclasses {} {return $@_super} -def Class subclasses {} {return $@subclasses} - -# those look recursively. -def Class ancestors {} { - #if {[info exists @ancestors]} {} - set r [list $self] - foreach super $@_super {eval [concat [list lappend r] [$super ancestors]]} - return $r -} -def Class <= {class} {return [expr [lsearch [$self ancestors] $class]>=0]} - -# note: [luniq] is actually defined in desire.tk -def Class methods {} { - set methods {} - set anc [$self ancestors] - foreach class $anc { - foreach name [info procs ${class}_*] { - lappend methods [join [lrange [split $name _] 1 end] _] - } - } - return [luniq [lsort $methods]] -} - -# those are static methods, and poe.tcl doesn't distinguish them yet. -def Class new { args} {eval [concat [list ${self}_new ] $args]} -def Class new_as {id args} {eval [concat [list ${self}_new_as $id] $args]} - -#-----------------------------------------------------------------------------------# - -# this makes me think of Maximus-CBCS... -proc VTgrey {} {return "\x1b\[0m"} -proc VTred {} {return "\x1b\[0;1;31m"} -proc VTgreen {} {return "\x1b\[0;1;32m"} -proc VTyellow {} {return "\x1b\[0;1;33m"} -proc VTblue {} {return "\x1b\[0;1;34m"} -proc VTmagenta {} {return "\x1b\[0;1;35m"} -proc VTcyan {} {return "\x1b\[0;1;36m"} -proc VTwhite {} {return "\x1b\[0;1;37m"} - -proc error_text {} { - set e $::errorInfo - regsub -all " invoked from within\n" $e "" e - regsub -all "\n \\(" $e " (" e - regsub -all {\n[^\n]*procedure \"(::unknown|super)\"[^\n]*\n} $e "\n" e - regsub -all {\n\"\[lindex \$methods 0\][^\n]*\n} $e "\n" e - regsub -all {\s*while executing\s*\n} $e "\n" e - #regsub {\n$} $e "" e - return $e -} -set suicidal 0 -proc error_dump {} { - puts "[VTred]Exception:[VTgrey] [error_text]" - if {$::suicidal} {exit 1} -} - -proc tracedef {class method {when enter}} { - global __trace - set __trace($class:$method) $when -} - -proc yell {var key args} { - global $key - puts "[VTyellow]HEY! at [info level -1] set $key [list $::_($key)][VTgrey]" -} - -proc object_table {} { - set n 0 - puts "poe.tcl object_table: {" - foreach o [lsort [array names ::_ *:_class]] { - set oo [lindex [split $o :] 0] - set class $::_($o) - incr by_class($class) - puts " $oo is a $class" - incr n - } - puts "} ($n objects)" - set n 0 - puts "poe.tcl class_stats: {" - foreach o [array names by_class] { - puts " class $o has $by_class($o) objects" - incr n - } - puts "} ($n classes)" -} - -proc object_exists {self} {info exists ::_($self:_class)} |