Page 1 of 1
aspect oriented computing and scope
Posted: Mon Aug 09, 2004 6:23 am
by nigelbrown
People (newLispers in particular) may be interested in the discussion of
dynamically scoped functions in aspect-oriented programming in lisp.
See
http://www.cs.uni-bonn.de/~costanza/
particularly the pdf "Dynamically Scoped Functions as the Essence of AOP"
(
http://www.cs.uni-bonn.de/~costanza/dynfun.pdf ).
Nigel
Posted: Mon Aug 09, 2004 1:26 pm
by Lutz
It is good to see that somebody has a fresh look at dynamic scoping and points out the interesting possibilites it has. newLISP implements both (dynamic and lexical) scoping paradigms.
Lutz
Posted: Tue Aug 10, 2004 10:15 pm
by BrickCaster
this PDF document describes a minimal Scheme extension for AOP:
http://www.cs.uri.edu/~dbtucker/pubs/aosd2003-tk.pdf
thus, dynamic scoping is not necessary to benefit AOP.
the Scheme AOP extension seems more powerful, however i agree it is also far less intuitive because it's based on a continuation-like concept.
It is good to see that somebody has a fresh look at dynamic scoping and points out the interesting possibilites it has.
the great thing in functional programming is declarative style.
may be dynamic scoping adds some interesting possibilites but breaking declarative style is too much a cost in my opinion.
Posted: Tue Aug 10, 2004 11:42 pm
by nigelbrown
BrickCaster wrote:
the great thing in functional programming is declarative style.
may be dynamic scoping adds some interesting possibilites but breaking declarative style is too much a cost in my opinion.
I don't see that dynamic scoping of itself breaks declarative style - what's your basis
for saying that?
Nigel
PS thanks for your commenting - my question is to learn.
Posted: Wed Aug 11, 2004 6:22 pm
by BrickCaster
i mean what you declare is less statically comprehensible because it depends on other dynamic declarations rather than solely on static declarations.
now it's up to you to decide if it's a good thing (more flexible) or a bad thing (less readable).
Posted: Wed Aug 11, 2004 6:54 pm
by Lutz
>>
... it's up to you to decide if it's a good thing (more flexible) or a bad thing (less readable)
>>
yes, I agree and of course it depends in what circumstances of your code. An easy way to get lexical (and easy recognizable) separation in newLISP is to just prefix certain variable with a context name, i.e.
(set 'Foo:myvar 1234)
You don't need any previous (context ...) statements, to do this anywhere in your code. The name space gets dynamically created just by using it. This also is a tool to quickly 'declare' data structures:
(set 'Person:name "")
(set 'Person:address "")
(set 'Person:balance 0.00)
this prototype object is lexically closed from the outside and you can easy create more of it during runtime:
(new Person 'Lutz)
and then use it:
(inc 'Lutz:balance 1000000) ;; please ;-)
serialize it to the disk:
(save "lutz.obj" 'Lutz)
Lutz
Posted: Fri Aug 13, 2004 10:31 pm
by BrickCaster
(inc 'Lutz:balance 1000000) ;; please ;-)
many prototype languages (such as NewtonScript) even create the "balance" slot if it is read but do not exist. that's too much flexibility, typos become unnotified, additionnal expressiveness is insignificant :(
one great thing with newLISP contexts is context switching :)
many Scheme implementations have a module extension where module is:
(module
.....
)
that's not realistic because that favors a batch-mode rather than an interactive mode. module-switching would be better, in a batch file the scope can be visually recreated though indentation.
Posted: Fri Aug 13, 2004 11:45 pm
by Lutz
note that context switching in newLISP only switches the context for subsequent symbol translations:
(set 'x 111)
(define (foo)
(context 'Ctx)
(set 'x 222)
(context 'MAIN))
x => 111
(foo)
x => 222
the context switch had no influence, but:
(set 'x 111)
(context 'Ctx)
(set 'x 222)
(context 'MAIN))
x => 111
Ctx:x => 222
now the context switch happened on the top-level and causes the subsequent symbol to be compiled in to name-space 'Ctx
The context switch only works for subsequent symbol translations:
(set 'x 111)
(define (foo)
(context 'Ctx)
(set (symbol "x") 222) ;; or (eval-string "(set 'x 222)")
(context 'MAIN))
x => 111
(foo)
x => 111
Ctx:x => 222
but I could do this:
(define (foo)
(set 'old (context))
(set 'c (context 'CT))
(context old) ; switch back
(set 'c:x 999))
(foo)
Cyx:x => 999
The last example shows the possibility to put contexts in to variables. This way you can refer to context variables before they exist
Lutz