Subject: Re: Lisp is neither (was Re: Ousterhout and Tcl lost the plot)
From: Erik Naggum <erik@naggum.no>
Date: 1997/04/23
Newsgroups: comp.lang.scheme,comp.lang.scheme.scsh,comp.lang.lisp,comp.lang.tcl,comp.lang.functional,comp.lang.c++,comp.lang.perl.misc,comp.lang.python,comp.lang.eiffel
Message-ID: <3070826073518641@naggum.no>


* David Hanley
| Ok, so you found one example on one CPU.  Great.  Do you have any others?

amusing rejoinder.

| Accusing someone of being stupid, and making stupid arguments oneself
| does make someone look like a fool though; though it's not who you're
| insulting.

actually I don't generally accuse people of being stupid.  I demonstrate
it.  you, however, keep accusing people of being stupid, among a lot of
other irrelevant accusations.

| > (defun foo (x y) (declare (fixnum x y)) (+ x y))
| > 
| >    0:   cmp     %g3, #x2
| >    4:   tne     %g0, #x13
| >    8:   taddcctv        %g0, %g1, %g0
| >   12:   sra     %o0, #x2, %o0
| >   16:   sra     %o1, #x2, %o1
| >   20:   add     %o0, %o1, %o0
| >   24:   ld      [%g4 + 135], %g2        ; fixnum-or-bignum
| >   28:   jmp     %g2 + 0
| >   32:   xor     %g0, #x1, %g3

| I'm glad that the usual C compiler will not produce the preceeding code.
| I'm glad the usual java compiler will not produce the preceeding code.
| First of all, it specifies fixnums, but appears to be performing the
| computation for all types--nice optimization.

the incoming arguments are in %o0 and %o1.  they are shifted right two bits
because the type tag is in the two least significant bits.  (actually, they
are in the lowest _three_ bits, but even and odd integers have different
type tags that conveniently overlap with the least significant bit of the
value.  I told you tagged pointers were optimized in Lisp.)  the result is
added together, and then that value is passed to a system function that
builds a bignum if necessary (i.e., the most significant bit, apart from
the sign bit is 1).

| And testing the number of parameters is only necessary due to the
| structure of lisp--berating C compilers for not doing this is silly.

again, you demonstrate a belligerent ignorance that is just astonishing.
what's wrong with asking whether it can be turned off?  here's the same
function, now compiled with (declaim (optimize (speed 3) (safety 0))) in
effect:

   0:	add	%o0, %o1, %o0
   4:	mov	#x1, %g3
   8:	jmp	%o7 + 8
  12:	nop

note that this does not handle bignums, but it does return the number of
return values to the continuation.  it does not handle bignums because I
specified fixnum arguments, and I'm assumed to know what I'm doing if I use
(safety 0).  note that this is the same as C cannot escape.  I've had my
Lisp system crash with bad code compiled with (safety 0), but otherwise
not.  I can't force a failing C program not to crash by tweaking a simple
declaration!

| Also, it appears that the whole function ought to be compiled to a single
| tail-recursive jump or inlined for that matter.

looks to me like the function it could have jumped to _is_ inlined.  note
that the fixnum-or-bignum function is used by a lot of other functions.

| Perhaps you could try counting to 100 before responding to someone on the
| net?  The time might be used to actually think about what you're posting,
| which might work wonders.

how far did you count?

| > Bastard Sex Therapist from Hell: "Read the F*cking Manual!"
| 
| A freudinan message??

OK, so let's try another one.

#\Erik
-- 
if we work really hard, will obsolescence be farther ahead or closer?