Re: Seeking computer-programming job (Sunnyvale, CA)

S

Seamus MacRae

Lars said:
Arne referred to

I am well aware of what Arne referred to. It has been addressed by me
above, and it is not relevant to either Lisp or Java. Please let it drop.
your hang-up about having to "correct" every posting disagreeing
with you.

This is not productive or worthwhile. Personal attacks convince no one
of anything, and in fact tend to lead both sides to entrench their
positions and refuse to budge, for to do otherwise could be seen as an
admission. Therefore, your strategy is in fact actively counterproductive.

Furthermore, the particular characteristic you attribute to me is
incorrect. I shall note that I make a distinction between posts that
disagree with me but agree to disagree with me, and posts that disagree
with me and assert or imply that all those who do not agree with their
authors are idiots.
He is familiar with that from previous encounters with your other
aliases

Now you are departing completely from the realm of meaningful and
intelligent discourse and entering the realm of paranoia. Nothing useful
can be established with wild accusations backed by insults instead of by
anything remotely resembling evidence, particularly when said
accusations are apropos of nothing.
 
S

Seamus MacRae

gugamilare said:
Arne said:
One of the actual Lisp knowledgeable will have to correct me if
I am wrong but I thought that [you're a liar, Seamus!]
I am not.

Don't you know the difference between [etc]

More personal attacks? Why can you not focus on the matters that are
actually relevant here, such as CLOS.

In fact, hadn't you earlier declared that you were quitting this thread?
Yet you have made several posts in the past 48 hours.
liar and get angry about it without any motive.

I do not get angry; I calmly point out how illogical your ad hominem
attacks are. They do not prove that Lisp is superior to Java, or furnish
any support at all for that conclusion. Indeed, they are entirely
irrelevant to the conclusion you wish people to draw.
[another ad hominem attack deleted]

I found (and, unfortunately, lost again) a reference to CL being
standardized in 1986. Your implication that there is no such reference
is an implication that I lied about having found one, and therefore
constitutes yet another personal attack.

Furthermore, no such remarks are valid arguments in favor of Lisp over
Java; indeed, even if your accusations about me were true, they still
would not provide a reason for considering Lisp to be superior to Java,
and I would continue to maintain that it is not.

Your logic is lacking, and you will convince no-one of Lisp's alleged
superiority as long as that remains the case. (Not that your arguments
becoming more rational would guarantee anything. But it would improve
your odds, which are presently a flat zero.)

[rest deleted unread]
 
S

Seamus MacRae

Likely not. The fight instinct and the need to dominate, fueled by
testosterone, will far outweigh the instinct to be liked or loved.

That observation may explain the behavior of certain of my opponents --
particularly those, like "Lew", Arne, and Lars, whose posts consist
almost entirely of insults, childish posturing, and demands, with nary a
Java- or Lisp-relevant statement to be found within.

Of course, I am above such instincts; my actions are dictated, when they
are dictated at all, by logic and necessity. This is why your emotional
arguments against Java and in favor of Lisp carry no weight with me, and
why your personal attacks are ineffective in convincing me either to go
along with you or to go away. You would have greater chances of
diverting the course of the Mississippi by throwing a small stone into
it, or by standing upon its shore and having a temper tantrum.
 
S

Seamus MacRae

John said:
PÃ¥ Sat, 23 May 2009 05:12:37 +0200, skrev Seamus MacRae


Ironically all you had to do to prove him wrong was not to answer..

That would only by ironic if by object here was to prove him wrong. My
object here is to correct erroneous statements made about me, and to
point out the flaws in the reasoning of the Lisp proponents, of which
there are numerous. Flaws, that is. In fact if Lisp truly is superior my
doing so should be viewed positively by them, as it would identify the
places where their arguments could be shored up and errors corrected.

However, that shows that were Lisp truly superior to Java, the logical
result of my pointing out flaws in their arguments would be that their
arguments would get stronger over time. The observed fact, however, is
that their arguments have become weaker over time; for instance, where
once mainly technical claims for Lisp features making it exceptionally
useful were made, now invalid ad hominem arguments, petty namecalling,
and even empty threats have largely replaced them. This devolution I
take to be evidence that Lisp, while not necessarily inferior, is not
superior.
 
S

Seamus MacRae

TomSW said:
It wasn't meant to be a threat.

So, not only did you threaten me, you were also incompetent at whatever
you intended to do instead? That is hardly an improvement in my estimation.
You're always so categorical and right, aren't you?

That is the effect of using logic instead of emotion as one's basis for
forming conclusions.
I never said you were angry

I never said you did. I merely pointed out that, since I was not, the
remarks you made concerning anger were inapplicable.

The remainder of your post was incoherent and laced with several ad
hominems, and it clearly fails to make any kind of a case for preferring
Lisp to Java. I have therefore not bothered to respond to it in any
specific detail.
 
S

Seamus MacRae

Paul said:
A Lisp integer is intrinsically known by, and thus easily optimized
by, the compiler.

Disingenuous. A Lisp integer is a bignum, rather than a machine word in
size, and the compiler cannot know at compile time the sizes of the
integers that actually will occur.

And if somehow it could, Java's compiler could similarly optimize
BigInteger, since the latter is a standard library class.
The "macro processor" is Lisp.

The macro processor is a part of any conforming Lisp implementation,
yes, but this is both obvious and irrelevant.
 
S

Seamus MacRae

Thomas said:
That is what you perceived. I responded to clarify.

You failed.
My sentence concluded "... because you had been repeatedly given

How your sentence concluded is irrelevant. It does not change the fact
that very few people in the world tend to keep Lisp texts lying around.
Probably mostly just you guys.
There were three possibilities, (1) you have a problem, (2) you have
no interest in understanding Common Lisp and (3) you don't have a lisp
text. Possibility (1) is outside the scope of this discussion. You had
repeatedly been given the means to rectify possibility (3) prior my
response. Consequently, possibility (2) was the only one remaining.

That does not follow. Possibility (3) remains, because giving someone
the means to "rectify" it does not necessarily result in their instantly
actually doing so. Perhaps they have not gotten around to it yet. I also
dispute the claim that the means were actually given, and the
implication that my non-possession of a Lisp text is necessarily a state
of affairs in need of "rectification".
The fact that you have been given the means to rectify possibility (3)
and have not further supports possibility (2).

It certainly does not prove it, especially after so short a period of
time. You cannot make assumptions about my physical location, either; it
is possible I'm making NNTP connections via a modem and sat-phone from
the middle of the Amazon rain forest, so far as you can tell, and
therefore several weeks of travel from the nearest bookstore.

And as for your implication that possibility (3), a lack of interest in
Lisp, is a condition in need of "rectification", that would be begging
the question, that is to say, assuming something (Lisp's superiority)
that you have set out to prove.
No I didn't.

And there you go again.

*shakes head* Most illogical ...
[snip]
That's an exceedingly odd thing for you to say shortly after saying
things contradicting things that both of us have said AND after
insulting me personally.

You have not been insulted personally by me, ever.

That is not correct. The deeply-nested two lines quoted above, for
instance, imply such an insult.
Conversely, you have insulted me.

That much is probably true.
All omissions were noted. Enough context was left to support the
discussion.

What discussion? That quoted text was followed by a generic signoff, but
by no other unquoted content. Quoting something without a response does
not constitute discussing it.
P.S. I noticed that you selectively clipped the quotations of my
responses [rest of accusation of dishonesty deleted]
I did sometimes elide pointless and insulting parts, leaving only what
was relevant to the issue of Java vs. Lisp, in the interests of decorum,
clarity, and avoiding unnecessary distractions from the topic at hand.

The omissions contained points, you insult me calling them pointless.

With good reason. What you called "points" were invalid ad hominem
arguments that utterly failed to actually logically support your
contention that Lisp is superior to Java.
Do you, Seamus MacRae, have an interest in learning and understanding
Common Lisp?

I had a bit. Now I confess I have much less, due to the company that
Common Lisp keeps. If Common Lisp had been a female suitor, it would be
as if I had just come into contact with several of her large and
dangerously unsocialized dogs, several of them apparently possessed of a
vicious streak, the existence of which had heretofore been unknown to
me. Needless to say, that would tend to somewhat diminish my interest.
 
P

Paul Foley

Seamus MacRae said:
Disingenuous. A Lisp integer is a bignum, rather than a machine word
in size, and the compiler cannot know at compile time the sizes of the
integers that actually will occur.

It can if either (a) it knows the source of the integer, or (b) the
programmer tells it.
The macro processor is a part of any conforming Lisp implementation,
yes, but this is both obvious and irrelevant.

It's not "part of any conforming Lisp implementation", it /is/ that
Lisp implementation. There's no separate identifiable "macro
processor".
 
S

Seamus MacRae

Paul said:
It can if either (a) it knows the source of the integer, or (b) the
programmer tells it.

(a) would require that the integer can be proved to be, and remain,
small by static analysis. And then Java's compiler could do the same, in
principle, with BigInteger, and you have again failed to prove Lisp
intrinsically superior to Java.

(b) would of course require that Lisp not by dynamically typed.
It's not "part of any conforming Lisp implementation", it /is/ that
Lisp implementation.

Nonsense. The macro processor alone is incapable of generating bytecodes
or native machine code, only changing source code into other source
code. Therefore, the macro processor cannot even be the entirety of the
compiler, let alone the implementation as a whole, which contains that
compiler but also for instance the interactive REPL/interpreter,
additional tools, the standard library classes and functions, and
potentially other types of component.
 
S

Series Expansion

The really interesting thing in this trash is how fast the various
"entities" respond, just check the posting time.  Perhaps the fricken
idiot humans still posting can check that and see exactly how good
Eliza-Expansion or whatisname have been coded.

The name is Series Expansion, and I am not an AI.
 
S

Series Expansion

Actually, I think Eliza is too big a compliment for these folks... I
would guess Henley.

These tiresome personal attacks do not constitute rational arguments
in favor of either Lisp or Java, Adlai and GP Lisper.
 
T

Tim X

Series Expansion said:
Running in an xterm is not considered running on X.

That was precisely my point. Running in an xterm does not really
qualify you to claim to be graphical, contrary to what several other
people have implied.
An ASCII editor lacks Unicode support by definition.
Wrong on two counts:
* Emacs is not (entirely) an a text mode editor
* A text mode editor can support Unicode fine vi UTF-8
Fascinating. Arne appears to believe that Unicode is a subset of
ASCII.

Fascinating that someone is so dumb [rest deleted]

These tiresome personal attacks do not constitute rational arguments
in favor of either emacs or Eclipse, Arne.

Hand-editing UTF-8 (where it includes some double-wide characters) in
an ASCII editor is not a recommended way to edit text.

Graphics hardware, and software that acknowledges its existence, is
needed in order to display the full Unicode character set at one time.

Series, you have said on numerous occasions that your here to debate
matters and are not interested in personal attacks. Thats all good and I
hope you can accept the following as an attempt to correct your
misunderstanding of emacs and not as a personal attack.

I suspect some of the confusion is due to the terminology used by emacs,
which unfortunately is different to what has become the 'norm'. However,
this is understandable when you consider that emacs was often the first
to have certain features. As an example, emacs uses the terms window and
frame in ways that are different to what most people think of when they
see those terms. However, they seemed very naturaul when they first
adopted them. Some have argued that emacs should revise its terminology
to be more in line with common usage. Regardless of where someone stands
on that argument, it doesn't change what functionality the software has.

Emacs uses the term 'window' in a similar way to what other systems may
refer to as a 'pane' and uses the term 'frame' for what other systems
would call a window.

Emacs has had native support for X windows for over 20 years. By native
support, I do not mean running in an X term. I mean full native X
support with the ability to open new frames (aka windows), move frames
to different virtual desktops, stack frames on top of each other, tile
frames, iconify frames etc. Unlike other editors, I also get the added
benefit of being able to run under non-graphics environments, such as
the linux console. In fact, I can open multiple console frames on the
multiple console terminals you have under Linux - this means even if I
don't have X installed I can run emacs with multiple frames and have
each of those frames split into multiple windows. If I used the advanced
features of the Linux console, I can even have more sophisticated
fonts than the default 'fixed' version.

You are correct when you state that emacs is not a fully graphical
application. However, you are incorrect when you state that it is just
an ascii editor. Emacs has had support for a much wider range of
character sets for quite a long time. The version I'm using right now
has full UTF-8 support as well as support for a number of
asian and western european character ses. It also support true type and
anti-aliased fonts, GTK widgets for pop-ups and GTK menus, full mouse
support, tooltips (with different fonts, colors and borders to the
buffer text), toolbars with icons etc. I can use proportionally spaced,
condensed or fixed width fonts. I have italic, bold, underlined,
supersubscripts etc. I can have fonts of varying sizes, font families
etc.

Emacs also has built-in support for numerous graphics types, including
GIF, TIFF, SVGA, JPG etc and built-in support for playing sounds. You
can even display PDF, PostScript and DVI documents inside an emacs
buffer as they would look in a dedicated viewer (not as translated into
text, but graphically) and you can search those documents.

Out of the box, Emacs is not what would be considered a modern fully
integrated development environment in the same way Eclipse or a purpose
built system, such as SQL Developer or NetBeans is. However, the
components are there, they just need someone to put them together. This
can result in a far more productive environment, because it is built to
fit the individuals needs and their preferred way of working. However,
not everyone wants to go through that process and thats fine - different
strokes for different folks.

In some cases, such as with Slime, the IDE that has been put together
using basic Emacs facilities and some elisp code to glue it all together
is far superior to the support provided by the well known IDEs such as
Eclipse (which has very poor support for CL BTW).

When new languages come along, Emacs is often the first to provide any
form of IDE. For example, When I programmed in Java (from about 1995 -
1999), there simply wasn't any decent Java IDEs available. Those that
did exist tended to be extremely slow and somewhat unreliable. However,
a couple of smart people put together JDEE (The Java Development
Environment for Emacs). At the time, it was just miles in front of
anything else on offer. Compared to dedicated Java IDE's or IDEs that
have a strong Java orientation, it can look quite outdated now. However,
often the early emacs implementations are the prototypes of what will
follow and many of the good ideas found in dedicated IDEs can be traced
bak to emacs. In a similar way, if CL became more widely adopted, you
would probably eventually see CL IDEs that would make Slime look pretty
tired, but the new dedicated CL IDE would likely borrow many of the
ideas currently in Slime and it would have to do a hell of a lot to make
it much better than it already is.

You made a number of references to your use of emacs in the 90s, over a
remote connection and running it under an xterm. Rather than seeing this
as the limitation of emacs, you should actually view it as one of its
strengths as you were able to run it at all. If it had been eclipse, you
couldn't run it at all.

Running it under an xterm severely limits what Emacs can
do. Its not a limitation of emacs, but rather a limitation of how it is
being run. You should not use your experiences in running Emacs in this
limited mode as the basis for determining what it can and cannot do.In
fact, I'm somewhat confused as to why, if you were running it in an
xterm, you couldn't run it in native X mode. I'll assume it was due to
bandwidth limitations rather than due to a poorly configured
environment.

During the 90s, I administered a number of remote sites. I ran Emacs
remotely, but instead of running it in an xterm, I ran it as a native X
application. To improve performance (we are talking about 56K dial-up at
this time), I used a differential X compression utility. The performance
wasn't fantastic, but it meant I had full windowing support, mouse
support, menus, popups, tooltips etc etc.

There has been at least 1, if not two major releases of Emacs since you
used it in the 90s, emacs 21 and emacs 22. A third one, Emacs 23 is
currently under active development and probably not that far from being
released as its very stable. Each of these releases has brought
improvements and updates. From your apparent experiences with emacs, I'm
guessing the version you used was Emacs 19. There is a world of
difference between that emacs and the one you will find being used by
most people today. It is similar to the world of difference between the
first versions of Java (the ones I coded in) and the version available
today. Consider what would be your response if I stated that Java was a
poor language due to the way dates, time and locales are handled and
made reference to the classes that were part of version 1.02 and all the
problems they had.

The bottom line - your understanding of emacs is outdated and
incorrect. Your experience of emacs has been further skewed due to the
restrictive mode in which it was run. Many of the limitations or missing
features you experienced were due to the environment you were running
the application in and not limitations of the application itself.

Tim
 
S

Series Expansion

It can, if the variable name is not a string but a symbol.

It cannot. The way in which the name is constructed is irrelevant. The
only way to always construct one that did not match any existing one
in any wider scope would be to have a list of them all, in all wider
scopes. But such a list cannot, in general, be computed solely from
the macro's arguments.
Symbols have identity. So I can have two variables with different names
(different symbols) even if the printed representation of the symbols
(their name as a string) is equal.

You refer to namespaces, or some similar concept. The problem is that
the lexical expansion of the macro will be contained in lexical scopes
that may declare variables the macro has no knowledge of, because they
are not referenced in its arguments. Namespaces, in any form, will not
get you around this problem.
(eq 'a 'a) ==> T ;same symbol

(eq '#:x '#:x) ==> NIL ;different symbols due to #: syntax

The result of doing this is to make the name useless. It means that if
the macro code expanded to perform:

(let ((#:x arg-value)))
....
(somefunc (#:x))
....
(otherfunc (#:x))

this would not pass arg-value to either somefunc or otherfunc, because
every occurrence of #:x is separate from every other. This completely
defeats the purpose of even having a variable name, which requires
that it can be referred to multiple times.

Thus these #:x symbols are a mere curiosity. They do not provide a
means to avoid multiple evaluation, let alone (except trivially)
variable capture.
(let ((a '#:x)) (eq a a)) ==> T ;same symbol referenced twice

This does not get around the problem:

(let ((a '#:x)))
(let (*a arg-value))
....
(somefunc (*a))
....
(otherfunc (*a))

(I do not know how to indirect through a, so I used the C-like
notation *a above. It doesn't matter to the point I'm making.)

This may work, getting arg-value into somefunc and otherfunc, but now
if the enclosing scope also uses a variable named a, we have a new
collision.

This is precisely what I was getting at in my previous post on this
subject.
I can create a unique symbol, store it somewhere, and reference it
multiple times (e.g. as a variable name).

But to reference the same one multiple times, you need another
variable to refer to it, like the variable named "a" in your second
example above. THAT variable needs a name. If it is another of your
"gensyms", it too needs a variable referring to it, so we eventually
must arrive at a variable that has an ordinary name. And then that
name may become involved in a collision. We are reduced back to the
original problem, the inability of the macro to compute a collision-
safe name solely from its arguments.
The fact it's unique isn't a function of anything; simply is a new
symbol object which is not reachable through any package, and so
it can only be referenced by holding a pointer to it.

A clever attempt and a fine effort, but the collision problem has
simply moved to the name of the variable holding a pointer to it.

As I said before, the introduction of a layer of indirection here does
not solve the problem.
 
S

Series Expansion

That was precisely my point. Running in an xterm does not really
qualify you to claim to be graphical, contrary to what several other
people have implied.
An ASCII editor lacks Unicode support by definition.
Wrong on two counts:
* Emacs is not (entirely) an a text mode editor
* A text mode editor can support Unicode fine vi UTF-8
Fascinating. Arne appears to believe that Unicode is a subset of
ASCII.
Fascinating that someone is so dumb [rest deleted]
These tiresome personal attacks do not constitute rational arguments
in favor of either emacs or Eclipse, Arne.
Hand-editing UTF-8 (where it includes some double-wide characters) in
an ASCII editor is not a recommended way to edit text.
Graphics hardware, and software that acknowledges its existence, is
needed in order to display the full Unicode character set at one time.

This is a screenshot of Emacs on my machine taken right now:http://img219..imageshack.us/img219/3889/thisisemacs.png

For this, we have only your word, versus the overwhelming common-sense
evidence against.
 
S

Series Expansion

Series Expansion said:
Fascinating that someone is so dumb [rest deleted]
These tiresome personal attacks do not constitute rational arguments
in favor of either emacs or Eclipse, Arne.
Hand-editing UTF-8 (where it includes some double-wide characters) in
an ASCII editor is not a recommended way to edit text.
Graphics hardware, and software that acknowledges its existence, is
needed in order to display the full Unicode character set at one time.

Series, you have said on numerous occasions that your here to debate
matters and are not interested in personal attacks. Thats all good and I
hope you can accept the following as an attempt to correct your
misunderstanding [rest of personal attack, and rest of post, deleted
unread]

These tiresome personal attacks do not constitute rational arguments
in favor of either Lisp or Java, Tim and Arne.
 
S

Series Expansion

[a missing attribution goes here]

More than one, I'd wager.
Because names and symbols are different things in Lisp. Names are
symbol's printed representations. If a symbol is within the current
package, there's no need to distinguish between its name and the
symbol itself.

This is silly. You use "names" and "symbols" the way we use "names"
and "fully-qualified names", and then use this terminology difference
as a basis for arguing in favor of much more terminological pedantry?
This does nothing useful; it just impedes clear communication, and
provides you a handy excuse to ignore a detailed critique without
seeming to do so by lobbing grenades at superficial terminology
quibbles, use of (unambiguous) short-hand, and the like without
addressing the meat of that critique. Such an argument, however, has
the same problem as the following syllogism, though it may appear
otherwise if done cleverly enough:

A: The syk is blue.

B: A misspelled the word "sky" when attempting to state that it was
blue; therefore the sky is green.
 
S

Series Expansion

GENSYM generates a symbol that is not interned in any package; in
fact, any such symbol could not be re-referenced by simply reading
it's name

As a consequence of which, it could not be used to store and then
successfully recover a value, except if it were itself referenced by
another variable that was then used indirectly to store and recover
the value.

And then THAT variable becomes a potential source of collisions.

Attempting to solve the collision problem with these things is like
attempting to reach the corner store on foot by taking a step forward
on your exercise treadmill. You end up precisely where you started,
after a slight expenditure of energy, and no closer to reaching the
store.
Thus, you have to have the original reference to these symbols from
their creation to access them.

And, of course, you have to store that reference somewhere. And, of
course, you have to name that storage to refer to *it*. And, of
course, if this too is a gensym, then that too must now have a
reference, and so forth. Eventually you must stop taking more and more
steps forward on that treadmill and get off, and then you are back
where you started: with a non-gensym variable name and a risk of a
collision.
Addressed by the first paragraph in this post.

Not so, as I have explained. You haven't even succeeded in moving the
problem this time, let alone eliminating it.
I've tried to explain here again, why GENSYM creates symbols that
enable capture-free macros.

And I've tried to explain here again why they do not.
I've tried to explain them in the same terms that PCL, Successful
Lisp, or On Lisp use, since those are the resources that have taught
me about these concepts so far.

Then perhaps these reference works, which you so highly recommended
previously and even rudely demanded I purchase, are not, what is the
expression, "all they are cracked up to be"?
/Packages/ don't do that.

But apparently they do.
Saying that Lisp has separate function and variable namespaces is a bit
misleading

Then perhaps you should edit the Wikipedia article that says to to
correct it.
because all symbols are equal in the eyes of packages, the same way that
the word "bat" has one entry in the dictionary, but multiple meanings as
different parts of speech. A person /reading/ a text determines which part
of speech to use to understand the word.

If the package is analogous to a dictionary, then it stores, and
distinguishes, these multiple definitions, contrary to your claims
about Lisp packages.

Otherwise, your analogy given above fails to be applicable and is
void.
Maybe I didn't describe it clearly enough. I've tried again.

Indeed you have, and it did not take me long to discover, and explain,
why they do not solve the capture problem.
However, because they are not interned, it's impossible to reference them
without the return-value of the GENSYM function.

And this return value must be stored somewhere, whence we are back to
square one. Initially, we needed to evaluate an argument once and then
use the result multiple times, and so needed somewhere to store it.
Now, we need to generate a gensym once and then use the result
multiple times, and so need somewhere to store it.
Did you read the page that I linked to?

No. I had not the time to dig through that site looking for whatever
specific paragraph or two MIGHT have existed containing the specific
information in question, nor is it likely to have materially affected
my point here.
Although it wasn't a huge project, the results did seem to have
some statistical significance.

That seems doubtful, given that the sample size of programmers per
language/requirements pair was probably in the single digits, and the
size of the sample of requirements certainly was, being just one.
Another example I'd cite, which isn't as specific, is Viaweb's
massive success. Paul Graham, one of Viaweb's founders,
attributes much of this success to the productivity boost
experienced by Lisp programmers.

An anecdotal story has even less statistical significance.
 
S

Series Expansion

This has already been repeated 5 times in this thread.  The guy won't
learn, no matter what you may write on usenet.

These tiresome personal attacks do not constitute rational arguments
in favor of either Lisp or Java, Pascal.

I have a specific and logical objection to Adlai's claim that his
gensyms evade the variable-capture problem; at best, they move it from
the variable holding an argument's evaluation to the variable holding
a reference to the gensym.
 The only way left is to hit him on the head. Are you prepared to
buy a rule and pay the flight fare to go see him and do the needed
pedagogical actions?

If I'd considered this incitement to violence to pose a credible
threat, I would now be notifying the police in your area of residence.
 
S

Series Expansion

Congratulations!  You've just invented the macro!

You misunderstand me. I meant a function that would be called once,
with an entire source file as argument, and output an entire new
source file, something distinct from macros, which preprocess a source
file to a temporary file or within main memory prior to its
compilation.
 
S

Series Expansion

The answer is, it doesn't modify any existing code.

It follows, then, that you were incorrect about it adding more
dispatches.
It's not tabular data

It clearly is, by inspection.
The resemlance to a table is only to illustrate to a human reader the
behaviour of the dispatch table

It is structured as a table, and it manages dispatch. It is therefore,
by definition, a dispatch table.

Regardless, this is a mere quibble over terminology. Whether or not
you call it a "dispatch table" or, for that matter, a "frobulator", it
is the thing to which more dispatches are added to add more methods to
the generic function. "A rose by any other name" and so forth.
In the running Lisp image.

Certainly not -- the macro runs at compile time, not at run time. It
therefore cannot "put" anything anywhere, except into the code that
replaces its invocation.
Lisp programs aren't just executed one
statement at a time -- there's an "image" of all the symbols, classes,
functions, closures, methods, etc that are in use at the time.

This is true of any running computer program; a running C program will
contain the main method, other functions, and assorted data in memory
at any given time (albeit the functions and the like will not be first-
class objects, though pointers to functions can be manipulated in C).

It is irrelevant, though, to the dispatch-table issue, since no such
image has yet been instantiated if the program has not yet been run
and therefore particularly if it has not yet even been compiled.
Again, it's not in the source code -- it's in the Lisp image. Lisp
source just includes macros, which modify the Lisp image to update (or
generate, if you're creating a new generic fn) the dispatch tables /in
the Lisp image/.

This is incoherent. Macros may still exist at run time as first-class
objects, but they are only evaluated at compile time. At compile time,
obviously, the program does not yet exist in a runnable form.
Therefore it cannot be running, and no such image exists. Therefore,
the macro cannot store anything into that image, since it does not
exist yet.

The most it can do is generate, in its output, instructions that, when
subsequently executed when the program is run, will attempt to
construct a dispatch table in main memory. This runs into difficulties
if there is no "central clearinghouse" (e.g. created by the defgeneric
macro's output, with that output having run before any of the
defmethod macro outputs) around which to coordinate the effort. There
is a problem of symmetry breaking here, and the possibility of a data
race.
They don't have to coordinate, because the generated code deals with
the dispatch table.

The generated code is what would have to directly do the coordinating,
of course.
Well, they are "state maintained in the system's internals". It's just
state that can be generated by code, the same way that code in Java or
C++ generates some state in the system's internals.

The distinction at issue is between "low-level internals not directly
user-accessible, but which the compiler and runtime can therefore
consider trusted" and "program data generated and maintained by user-
written code, which the compiler and runtime cannot therefore consider
trusted". It is a shame that our communication difficulties apparently
force the use of such long and cumbersome ways of referring to
concepts that are understood by much shorter names within most groups
of computer programmers.
The compiler will give a warning.

That contradicts the use of the word "just" in the lines quoted above
that are five levels deeper than this line.
Although LITERALLY it's silent, there is quite the visual cue when little
red underlines start appearing in your code

So, someone does use Cusp rather than emacs. Interesting.
OK, that's reading too much meaning into what I said.

It is reading only what was there. If you did not intend the meaning
of the word "just", then you should not have used that word there to
begin with.
I've actually been corrected about that. However, it would still apply
only to the currently running Lisp image. So if, for example, you were
using a library, and a DEFMETHOD form in your code extended the
library, somebody else working in a project with you could still use
the same library code, from the same file, as you and the DEFMETHOD
form in /your/ code would not affect them.

Until your respective pieces of code were combined, as seems likely
given your hypothesis that the both of you were working on the same
project.
They do share the same name. A package doesn't know the difference
between them.

These statements inherently contradict one another. If the package
didn't know the difference between them, then the result would be
this:

add package:name -> some function definition
add package:name -> some class definition
<overwrites, since package doesn't tell functions and classes apart>
Output:
package:name -> some class definition

For this to be avoided, the package has to not merely associate a
symbol with a pointer of some kind to its referent, but it also has to
key those associations not on the symbol alone but also on some sort
of type tag:

add package:name(function) -> some function definition
add package:name(class) -> some class definition
<does not overwrite>
Output:
package:name(function) -> some function definition
package:name(class) -> some class definition
However, when EVAL hits a name, it knows the difference /
in context/ between a variable, function call, etc. The package
doesn't have to know.

It does, if only implicitly. If EVAL changes the name "name" to a
symbol using whatever scope-resolution rules, and then changes the
symbol "package:name" to a symbol/type-tag pair "package:name(class)"
that is then the lookup key in the package system for the referent
pointer, then you may be technically correct, in that the package
system may consider the type-tag in this hypothetical implementation
to be a "magic cookie" without meaning to it other than with respect
to equality comparisons (and, under the hood, probably hash codes).
However, it could then be fairly stated that the package system knows
something about classes, functions, and the like -- it just doesn't
know that it knows.
I was mistaken
Ah.

but not in the way that you thought.

These tiresome personal attacks do not constitute rational arguments
in favor of either Lisp or Java, Adlai.
These ideas don't translate so cleanly between Lisp and Java, because
only symbols are "public" or "private". The code itself is still
accessible to anybody who has the symbol reference.

The same is true in Java, in a certain sense:

public class Foo {
private static class X implements Runnable () {
public void run () {
System.out.println("Hello, world!");
}
}

public static Runnable getRunnable () {
return new X();
}
}

public class Main {
public static void main (String[] args) {
Foo.getRunnable().run();
}
}

=> "Hello, world!"

You can think of "Foo" as a package within which "getRunnable" is an
exported symbol and "X" is not, and therefore "X.run" is also not.
However, "getRunnable" provides access to an instance of X, and thus
(indirectly) to a reference to X.run, by means of polymorphic
dispatch. This is what allows Main's main method to invoke the run()
method.

A similar situation exists with reflection used in combination with
setAccessible(true).

Perhaps in this particular regard Java and Lisp are not so different
after all, aside from the very obvious syntax differences.
Firstly, Lisp has a lot more freedom, in the sense that "private"
stuff is not inaccessible; this does mean that you have to rely on
people not to use private things in a way that will cause them to
break.

The issue was that Lisp also does less to discourage this practice
than Java does, and apparently completely lacks a security model for
situations such as browsers running untrusted code, though admittedly
the latter scenario could not even have been envisioned in 1956, when
the closest anyone had come to guessing the future existence of
anything like the Web was Vannevar Bush with his concept of a "memex".
Which would have been mechanical, to the Web as a Babbage analytical
engine would have been to a computer.
However, multimethod dispatch is done in a very safe and
predictable way, so it's not a risk to allow user-defined code do
"call-next-method" to something which could be considered "private" to
an imported package.

This does not parse, but it nonetheless emits the distinctive odor of
handwavium, a notoriously dangerous and unstable substance, especially
when introduced into a high-temperature usenet thread such as this
one.
Yes, I could get to the dispatch table. I have no clue how to do it,
although I could find out by examining the macroexpansion of
DEFGENERIC and DEFMETHOD, and then essentially writing that code by
hand. However, this is not done, unless somebody wants to create their
own object system; it would be like editing the Java compiler by hand,
yourself.

Intermediate, I should say, closer to editing the source code for
java.lang.ClassLoader, or maybe even to simply subclassing that.
Lisp image != source.

The Lisp image is the program state when running. Macros operate at
compile time, before (that build of) the program can possibly have
run.
We assume (and I think I speak for others who have posted in response
to you and Seamus) that when somebody else says something that seems
wrong, it's a "thinko", rather than a real mistake.

I fail to see the distinction, though I note that you are once again
presuming to speak for other people -- this time a large number of
them.
A thinko is like a typo, but on the scale of ideas -- it's an easily
identifiable MISTAKE

This statement directly contradicts the preceding one, which implied
some sort of distinction existed between a "thinko" and a "mistake".
gugamilare seems, from other things he's said in this group in the
past, to be more knowledgeable in Lisp than I am. If he writes
something that could be read a bit ambiguously, I'm assuming it's
because of a) the fact that English doesn't seem to be his first
language (which is NO PROBLEM WHATSOEVER, you just have to THINK), and

This might be interpreted in two ways itself: one, that English not
being one's first language is not a problem for a budding Lisp
programmer; or two, as a personal attack. I do sincerely hope your
intended meaning was not the latter.
b) he's assuming that the people reading his comments are familiar
with basic Common Lisp concepts.

Given that the comments in question have been crossposted to
comp.lang.java.programmer, such an assumption would appear to be
rather suspect.
See what I said in my previous paragraph, it applies here too. By the
way, I would assume that somebody saying that the sky was green would
also be a THINKO -- maybe they meant to type blue, or meant to talk
about grass. These things happen when people are multitasking, as we
all often have to. I would assume that the person I'm talking with has
made a thinko unless they repeat the same mistake several times, in
different phrasings, and defend it when somebody tries to correct
them.

Your paragraph above seems to consist partly of excuse-making. The
more serious problem, however, is that it presupposes that all readers
of such contradictory pairs of posts will have some easy means of
deciding which statement, if either, was accurate. That is quite
evidently not the case when the posts at issue are crossposted to a
newsgroup whose population cannot, by and large, be expected to have
the necessary knowledge to make that judgment, and can therefore only
go by what people have said.

Particularly, when a statement is made that will participate in such a
contradiction, but is the first such statement made so that the others
do not yet exist, and that first statement is an erroneous one, there
is not, as yet, even a contradiction to call that statement into
question. Of course, the statement may lead immediately to an
illogical conclusion, and in some cases here that has happened. In
other cases, however, it is only when a large group of statements is
taken together than they collectively imply something preposterous,
and then until one of those statements is contradicted, it is possible
for none of them to stand out as particularly suspect, at least as
judged by a lay person.

In a way, it is similar to how lack of static typing can obfuscate the
source of a problem that is caused by a type error in the code. All
statements that touch the problem data are viable suspects, and one
must start with the point where something finally blew up, a clash of
some sort between an expected and an actual type, and then work one's
way backwards to find out which was in error, the expectation or the
actual type, and where this error initially occurred.

Perhaps you should solve this the way dynamic-typing advocates like
you so often do, by unit-testing everything to death. Proofreading one
another's usenet posts might be a good way to start. You might also
use such a mechanism as a means of dispassionate review and a source
of a "cooling off" delay, to reduce the amount of personal attacks and
other illogical, emotional, and unwanted noise that currently leaks
unproductively into both newsgroups.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
474,436
Messages
2,571,696
Members
48,796
Latest member
Greg L.
Top