On 8/19/2011 11:05 AM, DeNigris Sean wrote:
Alan,
I'm thinking more deeply about computers and language and have realized that,
after programming for 15 years, I still have no idea what I'm talking about :)
just offering my opinions here.
but, yeah, maybe many of us don't really know what we are talking about.
I think the problem is that it is very hard to know in advance what is
best or how things will go, so better probably to try out ideas and see
what all works and doesn't work, and use these to guide and refine
possible future technologies.
After reading many of the LISP suggestions (thanks), the primary features seem
to me to be:
* parsimony (again you got to me and I finally looked it up;
"extreme unwillingness to spend money or use resources")
o little syntax - you can learn the language in 5 minutes
o uniformity - everything from variables to procedures are
treated the same.
both points are "double-edged swords" though.
the minimal syntax makes many constructions overly verbose and
operations are often not "visually distinctive", which slows down
reading and thinking about code (the contrast is a "glyph soup"
strategy, where particular glyphs/operators/... will more often stand out).
granted an "ugly mass of glyphs" is not exactly an ideal strategy either.
building on common experience is another possibility to reduce the
learning curve (many things will retain a familiar look and feel), but
granted a strict/dogmatic adherence to convention might be overly
limiting, so there are tradeoffs.
uniform treatment of variables and functions also has good and bad
points. for example, it is possible to easily get/set methods, ... which
can be very useful.
some languages, such as Java, lack this ability (ability to get/set
functions or methods), and it is painfully obvious from the POV of
someone who is used to languages with this capability (namely: most
non-Java languages...). (having to use an class instance for sake of,
say, a callback, is just nasty...).
( Java then had later added anonymous classes/... to partly work around
some of this, but personally I feel that using anonymous classes to make
up for the lack of first-class functions/closures and ex-nihilo objects
and similar to be "not a very good strategy". )
a downside though is that most languages don't generally support
overloaded variables, meaning that the uniform treatment of variables
and methods will often come at the cost of being able to overload them
(may be hacked around, but often these have worse drawbacks).
a common result is that assignable functions are often explicit in the
language and may not be overloaded, and that typically getting a
function handle will require it to not be overloaded (more common, say,
in C++), or require an explicit cast to indicate the desired signature (C#).
a downside of C and C++ style function pointers is that they don't
(generally) capture binding state (nevermind GCC and C++0x, which add
support for "closures", but which are limited to the lifetime of the
parent scope). sadly, general-purpose state-capture then requires using
an object.
however, in the common case of using function pointers to implement
getable/setable methods, the lack of state capture isn't too much of an
issue (hence, C++ ends up still being somewhat more convenient than the
level of hassle required to do similar in a language like Java).
* power - a meta-system where you can change anything e.g. the order
the arguments are processed in, what syntax is legal, etc.
yep, this is a nifty feature.
sadly, the Lisp macro system is not something which can be faithfully
done in notably different languages.
another biggie problem is that a lot of this may conflict with the use
of late binding (and a delegation-based scoping model), since by design
macros have to be early-bound, making them potentially a "sore thumb" in
a language design sense.
they may also risk exposing some implementation "nastiness", or may be
used in confusing and/or counter-intuitive ways (since there may not be
any obvious way to tell them apart from built-in functions or similar).
some of what could be done in using macros can be done in my case using
the "quote" and "unquote" keywords, but these are sort of a "lame joke"
vs macros.
for example:
unquote foo(quote x+3);
would be (sort of) similar to:
(eval (foo '(+ x 3)))
although possible could be to do similar with the syntax:
foo<x+3>;
I don't really like this option (I don't really like the <...> syntax
for sake of it creating ambiguities).
"foo!(...)" or "foo![...]" could also be possible.
also:
"foo:(...)" but this would create a whitespace sensitive operation.
"foo::(...)", could also work, and is not *too* ugly.
note that, ideally, this would be a cached operation, rather than
naively rebuilding the code-fragment on every execution (or being a "one
off" static operation), but this leads to another problem:
how to make this semantically-transparent?... (I lack ideas for an
obvious flushing/invalidation mechanism in this case).
this could lead to several edge cases:
a case where it is preferable to have it be one-off;
a case where it is preferable to dynamically re-build the expression.
* I'm not sure where, if at all, security comes in
doesn't really appear to me that Lisp was really designed with security
in mind.
<snip>
I can't really comment on a lot of this (too far outside my area).
_______________________________________________
fonc mailing list
[email protected]
http://vpri.org/mailman/listinfo/fonc