aboutsummaryrefslogtreecommitdiff
path: root/examples/dynreceive.tcl
diff options
context:
space:
mode:
Diffstat (limited to 'examples/dynreceive.tcl')
-rw-r--r--examples/dynreceive.tcl53
1 files changed, 53 insertions, 0 deletions
diff --git a/examples/dynreceive.tcl b/examples/dynreceive.tcl
new file mode 100644
index 0000000..8a269f7
--- /dev/null
+++ b/examples/dynreceive.tcl
@@ -0,0 +1,53 @@
+package require Tclpd 0.2.1
+package require TclpdLib 0.17
+
+pd::class dynreceive {
+ constructor {
+ set @sym {}
+ if {[pd::args] > 0} {
+ set @sym [pd::arg 0 symbol]
+ pd_bind [tclpd_get_instance_pd $self] [gensym $@sym]
+ }
+ pd::add_outlet $self
+ }
+
+ destructor {
+ # don't forget to call pd_unbind, or sending things to a symbol
+ # bound to dead object will crash pd!
+ if {$@sym != {}} {
+ pd_unbind [tclpd_get_instance_pd $self] [gensym $@sym]
+ }
+ }
+
+ 0_set {
+ # send [set empty( to clear the receive symbol
+ set s [pd::arg 0 symbol]
+ if {$@sym != {}} {
+ pd_unbind [tclpd_get_instance_pd $self] [gensym $@sym]
+ }
+ if {$s == {empty}} {
+ set @sym {}
+ } else {
+ set @sym $s
+ pd_bind [tclpd_get_instance_pd $self] [gensym $@sym]
+ }
+ }
+
+ 0_bang {
+ pd::outlet $self 0 bang
+ }
+
+ 0_float {
+ pd::outlet $self 0 float [pd::arg 0 float]
+ }
+
+ 0_symbol {
+ pd::outlet $self 0 symbol [gensym [pd::arg 0 symbol]]
+ }
+
+ 0_anything {
+ set sel [pd::arg 0 symbol]
+ set argz [lrange $args 1 end]
+ pd::outlet $self 0 $sel $argz
+ }
+}