(an old rant of mine from November 2008 that's perhaps worth sending out
again, since the devel team has turned over since then, so here it is:)
[...a good thing about extensions is] extensions are separately
compiled, so they can be modified and built upon separately from the
main code base. Even after all of NetLogo becomes open source, it's
still going to be a ridiculous hassle to rebuild the entire application
just because you want to make a modified version of one network
primitive. And if you do build a modified app, then no one can run your
model unless they have your modified app, and the app is huge. That's
really no good. On the other hand if your model only depends on a
modified extension, it's much easier to distribute the modified
extension with your model.
If we need to make access to extensions easier, maybe we should make
that a priority in a future version. In the meantime, I don't think we
should be growing the core language except when it's absolutely clearcut
that something belongs there. I think it remains to be seen what
additional link primitives will qualify for that.
I think the core language is too large already and we should be moving
stuff (e.g. hubnet-*, file-*, plot-*) out of it and into extensions, not
vice versa.
If there are currently downsides to putting stuff in extensions, we
should fix those downsides, rather than let them guide design.
Just because something is an extension doesn't mean it's somehow less
important and it doesn't mean it has to be harder to access (if it's
harder now, that's fixable). Take the file primitives for example. I
think that ought to be in an extension. Does that mean I think file I/O
is somehow unimportant or peripheral? No! Does that mean we should
make the file I/O primitives harder for users to get at? No!
(For example, we could say that some extensions are available by
default, without having to add "extensions [file]" to your model.
Or we could do something with checkboxes.)
Here's what being an extension means to me:
1) It identifies a set of related primitives as a distinct entity. This
helps people understand the language: here are the core primitives,
here are the network primitives, here are the file I/O primitives,
etc. As opposed to "here's a gigantic list of 10,000 primitives
that do everything under the sun" -- we've gone too far in that
direction already.
2) It's compiled separately and can be separately modified and improved
by users.
3) The primitives share a uniform naming scheme: they begin with the
name of the extension, followed by a colon. (So for example when
I say file I/O ought to be an extension, all that really means is
that the primitive names ought to begin with "file:" instead of "file-".)
The main point I want to get across to everybody is that putting a
feature in an extension is NOT about giving that feature second class
status. It's about keeping the core language a reasonable size; it's
about modularity; and it's about having consistent naming conventions
for primitives.
--
Seth Tisue | Northwestern University |
http://tisue.net
developer, NetLogo:
http://ccl.northwestern.edu/netlogo/