|
Monday, April 19, 2004 |
Finding Lisp mentions my article on continuation based web servers. For a Common Lisp version of this type of server see UnCommon Web.
It does continuations in Common Lisp by using macros. The macro
re-writes the code in continuation passing style to allow access to the
current continuation.
11:03:29 AM
|
|
When it comes to the Sealed/Unsealed question, I agree with James. The programming language Dylan
has the option to 'seal' classes or generic functions. This prevents
inheritance or adding methods to the generic function. Sealed is the
default for everything unless you explicitly request things to be
'open'.
Time and time again I'd be caught out trying to reuse classes that were
sealed and not be able to. For example, the DUIM (windowing API)
classes are mostly 'open'. The specific Win32 implementations were
sealed. I wanted to create a new type of Win32 class which would
involve deriving from some of the other Win32 classes. Unfortunately
they were sealed and I couldn't. I wanted to add methods to generic
functions to add extra functionality to these classes. Again, I
couldn't.
In the end the classes and generic functions were eventually made
'open' by the framework provider at my request but this was many months
later and required me to duplicate and re-write lots of code. And this
was mainly because sealed was the default, rather than having it sealed
by design.
Another example, I like the way Common Lisp enables you to access
variables not exported by a package. It requires you to access them in
a different way to normal but you can still do it. There are simply
times when you need to dive into the implementation of things that the
originally designer thought you should be prevented from seeing. Having
a way of doing this is invaluable when trying to do things 'outside of
the box'.
In 'Scheme' I can't do this like I can in Common Lisp. Just about every
Scheme module system in existance completely hides the non-exported
functions and variables. There is no way of getting at them. For those
times that you need to do it, if only for debugging purposes, or
extensions the designer of the library didn't anticipate, it's
important. Without it I sometimes feel like I'm fighting the developer
of the original library rather than working with them.
10:59:23 AM
|
|
© Copyright 2005 Chris Double.
|
|
|