🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.lang.tcl
5 messages
5 total messages Started by Maciej Sobczak Mon, 15 May 2006 07:58
unknown dla zmiennych
#379
Author: Maciej Sobczak
Date: Mon, 15 May 2006 07:58
15 lines
1436 bytes
Polecenie unknown pozwala podłączyć się z własnym handlerem na okazję 
wywołania procedury, która jeszcze nie jest zdefiniowana.

Chciałbym mieć coś takiego dla zmiennych, czyli jeśli ktoś zawoła 
$blabla w sytuacji, gdy blabla nie istnieje, to chciałbym, żeby wywołana 
została moja procedura, która być może tą zmienną zdefiniuje "w locie".

Wyląda na to, że standardowo czegoś takiego nie ma, a szkoda.
Ktoś ma może jakiś pomysł?


-- 
Maciej Sobczak : http://www.msobczak.com/
Programming    : http://www.msobczak.com/prog/
Re: unknown dla zmiennych
#380
Author: Artur
Date: Mon, 15 May 2006 11:44
57 lines
2740 bytes
Witam!

No rzeczywiście Tcl nie ma zbyt zaawansowanego Error handling.
To znaczy; nie można wskoczyć spowrotem do mniejsca gdzie wystąpił
błąd.
SmallTalk na takie stuczki pozwala.
Można ale zostosować wrapper dla dostępu do danej i upvar dla
definicji

proc lasyInitVar {varref init} {
      upvar $varref var
      if {[info exists var]} {
           set var
      } else {
           set var $init
      }
}

set b [lasyInitVar c 10]
set c

# albo z scriptem który jest evaluowany tylko jeśli trzeba

proc lasyInitVarHandle {varref script} {
      upvar $varref var
      if {[info exists var]} {
           set var
      } else {
           set var [uplevel $script]
      }
}
proc expensiveProc {} {
      return "expensiveReturn"
}

set b [lasyInitVarHandle wh {expensiveProc}]
set wh

Można by także przedefiniować set ale zamiany $ bez przeróbki
interpretera się nie da.

Artur

> Polecenie unknown pozwala podłączyć się z własnym handlerem na okazję
> wywołania procedury, która jeszcze nie jest zdefiniowana.
>
> Chciałbym mieć coś takiego dla zmiennych, czyli jeśli ktoś zawoła
> $blabla w sytuacji, gdy blabla nie istnieje, to chciałbym, żeby wywołana
> została moja procedura, która być może tą zmienną zdefiniuje "w locie".
>
> Wyląda na to, że standardowo czegoś takiego nie ma, a szkoda.
> Ktoś ma może jakiś pomysł?
>
>
> --
> Maciej Sobczak : http://www.msobczak.com/
> Programming    : http://www.msobczak.com/prog/
Re: unknown dla zmiennych
#381
Author: Maciej Sobczak
Date: Mon, 15 May 2006 12:13
37 lines
2849 bytes
Artur wrote:

> No rzeczywiście Tcl nie ma zbyt zaawansowanego Error handling.
> To znaczy; nie można wskoczyć spowrotem do mniejsca gdzie wystąpił
> błąd.
> SmallTalk na takie stuczki pozwala.
> Można ale zostosować wrapper dla dostępu do danej i upvar dla
> definicji
[...]

Dzięki, ale w moim przypadku problem jest jeszcze ogólniejszy: nie znam 
z góry nazwy zmiennej. Dopiero pierwsze jej użycie (któro może być 
odczytem!) pozwoli tą nazwę poznać. Tzn. nie pozwoli, bo właśnie nie ma 
mechanizmu, który by to umożliwił.

Widziałem na wiki rozważania, czy dałoby sie jeszcze obciąć gramatykę 
Tcla. Otóż dałoby się i np. zamiast $x stosować [val x]. Oczywiście jest 
to mniej wygodne, ale akurat w moim przypadku doskonale rozwiązuje 
problem: polecenie val i tak sprawdza we własnym słowniku, czym jest x, 
więc może też podjąć leniwą inicjalizację zmiennej o podanej nazwie.

A dla ciekawskich: jest graf obiektów, z których każdy ma różne 
atrybuty. Niektóre z tych atrybutów wskazują na inne obiekty (węzły w 
grafie). Chciałbym umożliwić nawigację po grafie tych obiektów a la 
języki obiektowe, czyli używając zapisu "obiekt.atrybut". A ponieważ 
atrybuty mogą wskazywać inne obiekty, to ktoś mógłby chcieć napisać np. 
a.b.c.d.e.f.g.h i oznacza to wartość atrybutu h w obiekcie wskazywanym 
przez atrybut g obiektu wskazywanego przez atrybut f obiektu... 
wskazywanego przez a. Oczywiste jest, że w takim układzie nie znam z 
góry wszystkim możliwych nazw i to jest właśnie ten ciekawy przypadek, 
kiedy chciałbym móc wyliczyć wartość zmiennej na podstawie jej "nazwy", 
nawet jeśli taka nazwa nigdy jeszcze nie była użyta.


-- 
Maciej Sobczak : http://www.msobczak.com/
Programming    : http://www.msobczak.com/prog/
Re: unknown dla zmiennych
#383
Author: Googie
Date: Mon, 15 May 2006 12:57
41 lines
2002 bytes
Maciej Sobczak wrote:
> 
> Polecenie unknown pozwala podłączyć się z własnym handlerem na okazję 
> wywołania procedury, która jeszcze nie jest zdefiniowana.
> 
> Chciałbym mieć coś takiego dla zmiennych, czyli jeśli ktoś zawoła 
> $blabla w sytuacji, gdy blabla nie istnieje, to chciałbym, żeby wywołana 
> została moja procedura, która być może tą zmienną zdefiniuje "w locie".
> 
> Wyląda na to, że standardowo czegoś takiego nie ma, a szkoda.
> Ktoś ma może jakiś pomysł?
> 
> 

Niestety używając operatora $ nie uda się. Natomiast można pójść na 
kompromis i używać komendy do odczytu zmiennej, tak jak robi się to za 
pomocą:

set a 1
puts [set a]

Wtedy zamiast set użyć własnej procedury:

proc czytaj {var} {
	uplevel "
		if {[info exists $var]} {
			return [set $var]
		} else {
			set $var ""
			return [set $var]
		}
	"
}
puts "To jest wartość zmiennej a: [czytaj a]"

tyle że to będzie wolniejsze niż sam operator $. Pozostałe metody 
odwołań do zmiennej można nadpisać, bo są to tylko komendy/procedury.

-- 
Pozdrawiam! (Greetings!)
Googie
Re: unknown dla zmiennych
#382
Author: Artur
Date: Wed, 17 May 2006 08:30
31 lines
1919 bytes
Co do zapisu w stylu a.b.c.d.e.f
to zobacz
objectwalker
http://wiki.tcl.tk/9519

Uzywa sie tam prefix notation w stylo OO (z uzyciem XOTcl)

package require XOTcl
namespace import ::xotcl::*

Object instproc > {attr args} {
     if {[llength $args]==0} {
	my set $attr
     } else {
         eval [my set $attr] $args
     }
}

Object ::o1
Object ::o2
o2 set attr2 myvalue
o1 set attr1 ::o2

o1 > attr1 > attr2
o1 > attr1

Takiego typu definiowanie nowego dynamicznego syntaksu
czesto uzywa RS
http://wiki.tcl.tk/496

Artur
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads