Thread View: pl.comp.lang.tcl
5 messages
5 total messages
Started by Maciej Sobczak
Mon, 15 May 2006 07:58
unknown dla zmiennych
Author: Maciej Sobczak
Date: Mon, 15 May 2006 07:58
Date: Mon, 15 May 2006 07:58
15 lines
1436 bytes
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
Author: Artur
Date: Mon, 15 May 2006 11:44
Date: Mon, 15 May 2006 11:44
57 lines
2740 bytes
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
Author: Maciej Sobczak
Date: Mon, 15 May 2006 12:13
Date: Mon, 15 May 2006 12:13
37 lines
2849 bytes
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
Author: Googie
Date: Mon, 15 May 2006 12:57
Date: Mon, 15 May 2006 12:57
41 lines
2002 bytes
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
Author: Artur
Date: Wed, 17 May 2006 08:30
Date: Wed, 17 May 2006 08:30
31 lines
1919 bytes
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