HDTenEightyP/NetNews huggingface dataset:
From: jeff@aiai.ed.ac.uk (Jeff Dalton)
Newsgroups: comp.lang.lisp
Subject: What do compilers optimize?
Date: 31 Aug 92 18:25:54 GMT
Organization: AIAI, University of Edinburgh, Scotland

(Do any Lisp implementors read this newsgroup?)

Are there any implementations that do any of the following (or
something similar):

  * Turn a CASE in which the alternatives are integers into
    an indirect transfer?

  * Use hashing for a CASE with many alternatives?

  * Allow fixnums (or floats) to be passed between procedures without
    any heap allocations (maybe just for local procedures in the same
    top-level form)?

-- jd
Organization: Junior, Math/Computer Science, Carnegie Mellon, Pittsburgh, PA
Newsgroups: comp.lang.lisp
Date: Tue,  1 Sep 1992 17:39:16 -0400 
From: Stefan Monnier <sm86+@andrew.cmu.edu>
Subject: Scheme equivalence in CL


I used to use (great!) Scheme, but I have (cause of the teacher)
to use CL this time.

So here are some questions after a bit of trying:

How are exactly used functions ?  It seems it is not as simple
as in scheme.
In particular, I need a function which does exacly the same
as equal (but under another name)

In scheme I just would do: 
	(define state-equal equal)

But in common-lisp, the best I found was:
	(defun state-equal #'equal)

When I call it, CL has no problems: it is recognized as a function,
it needs 2 parameters, BUT it ALWAYS returns NIL !!

I know I can redefine it more completely:
	(defun state-equal (x y) (equal x y))

But the scheme way is so much nicer that I'm sure there is an
equivalent way in CL.


	Stefan Monnier


-----------------------------------------------------
-- On the average, people seem to be acting normal --
-----------------------------------------------------
From: raman@cs.cornell.edu (T. V. Raman)
Subject: Re: Defsystem: Is this is a feature or a bug?
Organization: Cornell Univ. CS Dept, Ithaca NY 14853
Date: Thu, 27 Aug 1992 16:14:01 GMT

sjameson@atl.ge.com (Stephen M Jameson) writes:

>[***]
>>With the above setup if I do:
>>(load-system 'main)
>>
>>I get the following error:
>>package sub1 is not valid: supply a new package.
>>
>[***]
>>All explanations/tips welcome, maybe there is a good reason why
>>defsystem does the above.
>>
>>--Raman
>>-- 

>You do not indicate what Lisp you are using.  If you are using a Symbolics, I
>would guess that the problem is that the file sub1.system (or whatever the
>system declaration file is) has ";;; -*- ... Package:  SUB1" in the header
>line, and as soon as it tries to read the file, it complains about the lack of
>this package.  As someone else has pointed out (probably barmar), all system
>and package declaration files should be created and read in the USER package.
>If you are not using a Lispm, I would need more information.  

I am using lucid common lisp 4.1 on a sparc station with the defsystem
available from cmu in the lisp-utilities directory.

Thanks,
>Good luck.

>-- 
>Steve Jameson                           General Electric Aerospace 
>sjameson@atl.ge.com                     Advanced Technology Laboratories
>                                        Moorestown, New Jersey              
>****************************************************************************
-- 
   T. V. Raman <raman@cs.cornell.edu>Tel: (607)255-9202  R 272-3649
                       Office: 4116 Upson Hall,
Department of Computer Science, Cornell University Ithaca NY 14853-6201
                Res: 226 Bryant Avenue Ithaca NY 14850
From: grant@pentagon-gw.army.mil (Pete Grant)
Newsgroups: comp.lang.lisp
Subject: Re: Defsystem: Is this is a feature or a bug?
Keywords: defsystem packages including systems
Date: 27 Aug 92 00:56:11 GMT
Organization: U.S. Army Artificial Intelligence Center, The Pentagon

In article <1992Aug23.130346.22483@cs.cornell.edu> raman@cs.cornell.edu (T. V. Raman) writes:
>
>Hi!
>
>I am using defsystem to build a system that is made up of several
>other systems.
>
>Each subsystem has its own package and these systems have also been
>defined using defsystem, and the dependencies correctly declared. 
>
>I have: 
>
Without seeing the files, it's hard to diagnose, but one possibility
is that your defsystem file is in the package for your system.

Usually the defsystem file header should be in package user.  If 
that's not the case, use m-X Set Package ZMACS command.

If that's not the culprit, check for references to the package before
its declaration.

Hope this helps.

Pete.
>Main system MAIN which depends on SUB1 SUB2 SUB3.
>
>SUB(i) have their own packages.
>
>SUB1 itself has sub11 as a subsystem and sub11 has its own package. 
>
>The system definition for each of the systems contains a line at the
>top of the file of the form
>
>(unless (find-package ..) (make-package ..)) for that particular
>system. 
>
>With the above setup if I do:
>(load-system 'main)
>
>I get the following error:
>package sub1 is not valid: supply a new package.
>
>The problem disappears if I put the lines
>
>(unless (find-package sub1) (make-package ..) )  along  with similar
>declarations for sub2 sub3 and sub11 in the file main.system
>
>I feel that this is uncalled for since main.system should be loading
>sub1.system and not expect to see the package declaration for sub1
>before this time.
>
>All explanations/tips welcome, maybe there is a good reason why
>defsystem does the above.
>
>--Raman
>-- 
>   T. V. Raman <raman@cs.cornell.edu>Tel: (607)255-9202  R 272-3649
>                       Office: 4116 Upson Hall,
>Department of Computer Science, Cornell University Ithaca NY 14853-6201
>                Res: 226 Bryant Avenue Ithaca NY 14850
Newsgroups: comp.lang.lisp
From: claude@nats.informatik.uni-hamburg.de (Claudius Pyka)
Subject: RPC and ACL
Summary: Problems with calling RPC function clnt_call()
Keywords: RPC ACL Foreign Functions
Organization: University of Hamburg, FRG
Date:  4 Sep 92 18:22:31 GMT

I got stuck with using Sun's RPC implementation from within
Allegro CL.  All works fine until I try to call the RPC
function clnt_call().  This results in a segmentation fault.
I would need some advice from people who have already
used RPC in ACL.

Are there any conflicts between ACL internals and RPC functions?


Thanx for any help!

Claude.


======================================================================
==  Claudius Pyka                  Tel.:  (040) 4123-2574           ==
==  University of Hamburg                                           ==
==  Computer Science Department    email: claude@nats1.informatik.  ==
==  Natural Language Systems Division     uni-hamburg.de            ==
==                                                                  ==
==  Bodenstedtstr. 16                                               ==
==  W-2000 Hamburg 50                                               ==
======================================================================


Newsgroups: comp.lang.lisp
From: swanson@uxa.cso.uiuc.edu (swanson randall)
Subject: Looking for inexpensive Lisp for Macs
Summary: Title says it all
Organization: University of Illinois at Urbana
Date: Tue, 1 Sep 1992 17:16:38 GMT
Keywords: Lisp Mac

I am looking for an exepensive Lisp compiler or interpreter for a class I am
taking.  So any advice as to where I could find one would be much appreciated.

Thanks
Newsgroups: comp.lang.lisp
From: phfrom@nyx.uni-konstanz.de (Hartmut Frommert)
Subject: Re: ?? boolean minimization code ??
Keywords: boolean function minimization
Organization: Dept. of Physics, University of Constance
Date: Wed, 26 Aug 1992 09:03:04 GMT

nick@skate.cs.washington.edu (Nicholas Kushmerick) writes:

>does anybody have any (lisp?!) code that does boolean function minimization,
>e.g.:

>       p+~p  -->  true

>       (a&b)+~a  -->  b+~a

>       (~a&~b&c)+(~a&b&c)+(a&~b&c)+(a&b&c)  -->  c

>ideally, both the input and output should be in s-o-p form, like my examples.

There's a REDUCE (3.3) program which was some time ago on the netlib at
rand.org which does a similar job (I'm not sure how good). If you are 
interested, please e-mail. Name of the program was "PMRULES", if I remember 
right.
--
 Hartmut Frommert, Physics, Univ of Constance, | + Whale killing is murder. +
 P.O.Box 55 60, D-W-7750 Konstanz, Germany | + Eat whale killers, not whales.
 E-Mail: <phfrom@dknkurz1.bitnet> or <phfrom@nyx.uni-konstanz.de>
+    "Windows NoT" expands in German to "Windows Noch Teurer"
+                                                ^even   ^more expensive
Newsgroups: comp.lang.lisp
From: charest@Aig.Jpl.Nasa.Gov (Len Charest)
Subject: Re: Freezing a variable: how?
Followup-To: comp.lang.lisp
Keywords: Freezing variables: Declaring as constant from here on after:
Reply-To: charest@aig.jpl.nasa.gov
Organization: NASA/Jet Propulsion Laboratory
Date: Fri, 28 Aug 1992 19:43:00 GMT

In article <1992Aug28.155335.12562@cs.cornell.edu>, raman@cs.cornell.edu (T. V. Raman) writes:
|> 
|>  In common lisp Lucid 4.1 I would like to have the following:
|> 
|> After an initial setup phase, I would like to declare a variable as
|> being unmodifiable. ...  Is there a standard way of doing this?

I don't think so. I think you're stuck doing your own variable access
management. However, it would be relatively easy to 'localize' this
access management if you were willing to access the variables through a
standard form (e.g,. SLOT-VALUE, READERS in CLOS) rather than as
regular symbols. In fact, if you did use CLOS, you could store the
varibles as class slots that initially have both a READER and a WRITER.
After the setup phase was complete you could use the MOP to remove all
of the WRITER methods. (For completeness, you'd probably also want to
override the default method on SLOT-VALUE-USING-CLASS such that it
signalled an error.)
..................................................
                                  Len Charest, Jr.
                 JPL Artificial Intelligence Group
                          charest@aig.jpl.nasa.gov
From: ok@goanna.cs.rmit.oz.au (Richard A. O'Keefe)
Newsgroups: comp.lang.lisp
Subject: Re: Freezing a variable: how?
Date: 1 Sep 92 04:35:10 GMT
Organization: Comp Sci, RMIT, Melbourne, Australia

In article <19920829213038.4.KMP@PLANTAIN.SCRC.Symbolics.COM>, KMP@stony-brook.scrc.symbolics.com (Kent M Pitman) writes:
> It's not remarkably graceful, but for some purposes it might work to just
> promote the variable to a constant by doing DEFCONSTANT of the thing which
> is already a variable.

As I understand it, a program is loaded in two phases, in the first of which
a variable is updated, and in the second of which it should be read-only.

The thought that occurs to me at once is "why does it have to be the same
variable?"  Why can't there be a variable which is updated by the first phase,
and the last thing it installs is a defconstant holding the final value of the
thing?

As an alternative, you can do this in Scheme:

	(define thingy "thingy")
	(define set-thingy! "set-thingy!")
	(let ((hidden-variable initial-value))
	    (set! thingy (lambda () hidden-variable))
	    (set! set-thingy! (lambda (x) (set! hidden-variable x) "!"))
	    "access functions for thingy defined")

	;; first phase now uses (thingy) and (set-thingy! x)

	(set! set-thingy! (lambda (x) (error <dialect-dependent arguments>)))

	;; second phase now uses (thingy) but cannot change the value at all
	;; In fact, _no-one_ can change hidden-variable any more.

Presumably something similar is doable in Common Lisp.

-- 
You can lie with statistics ... but not to a statistician.
Newsgroups: comp.lang.lisp
From: moore@cs.utah.edu (Tim Moore)
Subject: Re: Macro lambda lists: &key and &body
In-reply-to: raman@cs.cornell.edu's message of Thu, 27 Aug 1992 19:20:17 GMT
Organization: University of Utah CS Dept
Date: 27 Aug 92 13:55:41

In article <1992Aug27.192017.18279@cs.cornell.edu> raman@cs.cornell.edu (T. V. Raman) writes:
   Hi!

   I need to supply a keyword argument or at least an optional argument
   with a default value to a macro.

   Lisp does not permit
   (defmacro (&key (..) &body body)

   What is the correct way of writing this?

(defmacro foo ((&key ...) &body body) ...)

   Thanks,
   --Raman

--
Tim Moore                    moore@cs.utah.edu {bellcore,hplabs}!utah-cs!moore
"Wind in my hair - Shifting and drifting - Mechanical music - Adrenaline surge"
	- Rush
From: danny@farallon.com (Danny Brewer)
Newsgroups: comp.lang.lisp
Subject: Can I use EVAL?
Date: 25 Aug 92 19:52:35 GMT
Followup-To: comp.lang.lisp
Organization: Farallon Computing, Inc.

I have a compiling matcher I've written that takes a pattern and
returns a LAMBDA expression which performs the actual match.
Here is an example:  (MCL2 prompts with a "?")

;;; Match a pattern and datum using the interpretive matcher

? (Match '(a ?x c) '(a b c))
((?X . B))

;;; It matches with one variable binding.
;;; Now compile the pattern into a LAMBDA using compiling matcher

? (Compile-Match '(a ?x c))
(LAMBDA (DATUM ...)  [...a bunch of code deleted...] )

? (SETF *p* *)           ; save pattern code in a variable
? (SETF *d* '(a b c))    ; set datum variable

Now that I've got the LAMBDA in the variable *p*, how can I do
anything with it?  I can't FUNCALL or APPLY it.  But I can
use a really ugly EVAL as follows:

? (EVAL `(,*p* ',*d*))
((?X . B))

This works okay, but yucko!

Anybody got any better ideas?
Thanks.

Danny Brewer
danny@farallon.com
From: KMP@stony-brook.scrc.symbolics.com (Kent M Pitman)
Newsgroups: comp.lang.lisp
Subject: Re: Freezing a variable: how?
Date: 29 Aug 92 21:40:16 GMT
Article-I.D.: PLANTAIN.19920829213038.4.KMP
Organization: LCS news/mail gateway
X-Unparseable-Date: Sat

It's not remarkably graceful, but for some purposes it might work to just
promote the variable to a constant by doing DEFCONSTANT of the thing which
is already a variable.  (In some implementations you might get some warnings
but they are likely not to be fatal.)  e.g., in Symbolics Lisp, I just tried
the following.  I didn't try it in Lucid Lisp only because I don't have one
on my desk, but I'd be surprised if you didn't get pretty similar results.

  ;;; -*- Mode: LISP; Syntax: Common-Lisp; Package: USER; Base: 10 -*-

  (eval-when (eval compile load) 
    ;; Make sure the value is known to the compiler.
    ;; If more computation is done on the variable to get it in its 
    ;; ready-to-be-frozen state, that stuff must also happen aggressively
    ;; at compile-time.
  (defvar *foo-17* 7)
  )
  (defmacro promote-variable-to-constant (x) `(defconstant ,x ,x))
  (promote-variable-to-constant *foo-17*)
  (defun foo (x) (+ x *foo-17*))

And then did:

  Command: Compile File (file) S:>KMP>foo.lisp.newest 
  For Variable *FOO-17*
    *FOO-17* may not have a constant compile-time value -- '7 will be used.
   S:>KMP>foo.lisp.newest compiled.
  Command: Load File (file) S:>KMP>foo
  Loading S:>KMP>foo.ibin.newest into package USER
  For Variable *FOO-17*
    Variable *FOO-17* is defined twice in the file S:>KMP>foo.
   ... Done.
  Command: (foo 3)
  10
  Command: (disassemble'foo)
   0  ENTRY: 1 REQUIRED, 0 OPTIONAL      ;Creating X
   2  FIXUP-TOS                          ;X 
   3  ADD 7
   4  RETURN-SINGLE-STACK
  #<Compiled function FOO 21001534070>
From: gadbois@mcc.com (David Gadbois)
Newsgroups: comp.lang.lisp
Subject: Re: A question: Dynamic type check
Date: 28 Aug 1992 17:57:41 -0500
Organization: UTexas Mail-to-News Gateway
NNTP-Posting-Host: cs.utexas.edu

    Date: Fri, 28 Aug 1992 14:22 CDT
    From: charest@Aig.Jpl.Nasa.Gov (Len Charest)

    In article <10026@uqcspe.cs.uq.oz.au>, gong@cs.uq.oz.au (Ming Gong) writes:
    |> I want to know *at run time* whether or not a expression is a
    |> function.  Can some knowledgeable people tell me how?

    [...]

    If the functions in question are true Lisp function objects, then
    FUNCTIONP should work as described above. Otherwise, the answer
    depends on your implementation of these 'functions'. For example, if
    you used DEFSTRUCT to define the data structure then a
    type-discriminating predicate would be automatically created. E.g.,

    (defstruct function
      name
      lambda-list
      code)

    > (setq test (make-function :name 'plus :lambda-list '(x y)
				:code '(+ x y)))
    TEST
    > (function-p test)
    T

Note that since FUNCTION is already a type name, you can lose big
redefining it as such even if your implementation lets you.  It would be
not unlike redefining CAR.  It would be OK to use a name like
MY-FUNCTION, or to define it in a package that has its own symbol named
"FUNCTION".

--David Gadbois
Xref: sparky comp.lang.lisp:2356 comp.lang.scheme:2136 eunet.misc:531
From: simon@lia.di.epfl.ch (Simon Leinen)
Newsgroups: comp.lang.lisp
Subject: Re: Can I use EVAL?
Date: 27 Aug 92 07:52:29 GMT
Followup-To: comp.lang.lisp
Organization: DI-LIA -- Ecole Polytechnique Federale de Lausanne
In-reply-to: danny@farallon.com's message of 25 Aug 92 19:52:35 GMT
X-Md4-Signature: c000bb6de9cf55af90e8b58c6acb8db9

In article <danny-250892143222@danny.farallon.com> danny@farallon.com
(Danny Brewer) writes:

   ? (Compile-Match '(a ?x c))
   (LAMBDA (DATUM ...)  [...a bunch of code deleted...] )

   ? (SETF *p* *)           ; save pattern code in a variable
   ? (SETF *d* '(a b c))    ; set datum variable

   Now that I've got the LAMBDA in the variable *p*, how can I do
   anything with it?  I can't FUNCALL or APPLY it.

You can funcall the lambda expression by coercing it to FUNCTION first
(this is only necessary in ANSIfied Common Lisps):

	(funcall (coerce *p* 'function) *d*)

...but this is really very equivalent to using EVAL.
Or you can force compilation of the code using COMPILE:

	(funcall (compile nil *p*) *d*)

In this case you would probably save the result of the COMPILE
somewhere because compilation makes most sense when you reuse the
compiled matcher for many operations.
-- 
Simon.
From: barmar@think.com (Barry Margolin)
Newsgroups: comp.lang.lisp
Subject: Re: standard output and standard error
Date: 27 Aug 1992 15:55:34 GMT
Organization: Thinking Machines Corporation, Cambridge MA, USA
NNTP-Posting-Host: telecaster.think.com

In article <1992Aug27.084614.10923@chemeng.ed.ac.uk> haitham@Chemeng.Ed.Ac.Uk writes:
>In LCL4.0 *standard-output* stream is equal to *error-output*. So the output
>directed through any of these will make no difference. Even *terminal-io* is
>the same. I don't want to direct the error output (or progress messages) to
>a file because it is important for the user to see.

The following Lucid-specific code will connect *error-output* to the Unix
stderr stream:

(defconstand unix-stderr 2)

(with-open-stream (*error-output* (make-lisp-stream :output-handle unix-stderr))
  ...)

>Another question: is there a way to decrease the size of the program (Lisp Image)?

Use the Delivery Toolkit.  It includes a treeshaker that removes unused
code.
-- 
Barry Margolin
System Manager, Thinking Machines Corp.

barmar@think.com          {uunet,harvard}!think!barmar
Newsgroups: comp.lang.lisp
From: moore@cs.utah.edu (Tim Moore)
Subject: Re: Can I use EVAL?
Followup-To: comp.lang.lisp
In-reply-to: danny@farallon.com's message of 25 Aug 92 19:52:35 GMT
Organization: University of Utah CS Dept
Date: 25 Aug 92 15:36:42

In article <danny-250892143222@danny.farallon.com> danny@farallon.com (Danny Brewer) writes:

   ;;; Now compile the pattern into a LAMBDA using compiling matcher

   ? (Compile-Match '(a ?x c))
   (LAMBDA (DATUM ...)  [...a bunch of code deleted...] )

   ? (SETF *p* *)           ; save pattern code in a variable
   ? (SETF *d* '(a b c))    ; set datum variable

   Now that I've got the LAMBDA in the variable *p*, how can I do
   anything with it?  I can't FUNCALL or APPLY it.  But I can
   use a really ugly EVAL as follows:

   ? (EVAL `(,*p* ',*d*))
   ((?X . B))

   This works okay, but yucko!

(eval `#',*p*) will return a function. In cltl2 lisps, you can coerce
the lambda expression returned by compile-match to a function:  

(coerce *p* 'function)

These solutions use eval explicitly or implicitly, but that's OK. eval
was made for this sort of thing. If you are translating little
languages to lisp code, the prohibition against using eval breaks
down.

You could compile the lambda expression:
(compile nil *p*)


Alternatively, you could think about defining your patterns in a
declarative manner so that the lambda expressions will be dealt with
at compile or load time:

(defmacro defpattern (pattern)
  `(eval-when (:compile-toplevel :execute)
     (add-pattern-to-db ,pattern #',(compile-match pattern))))

--
Tim Moore                    moore@cs.utah.edu {bellcore,hplabs}!utah-cs!moore
"Wind in my hair - Shifting and drifting - Mechanical music - Adrenaline surge"
	- Rush
Newsgroups: comp.lang.lisp.x
From: hadden@src.honeywell.com (George D. Hadden)
Subject: (write-byte), (read-byte)
Organization: Honeywell Systems & Research Center
Date: Wed, 26 Aug 1992 22:18:40 GMT

it used to be the case that these functions didn't work correctly
under msdos because (possibly among other things) xlisp closed the
file upon reading a byte corresponding to ascii ctrl-z.  (or maybe it
closed the output file on WRITING a ctrl-z -- i don't remember for
sure.) 

anyway, do any of you know whether this is fixed yet? 

thanks,

-geo
---
George D. Hadden, Honeywell Systems and Research Center
      *** Where "Research" is our middle name! ***
3660 Technology Drive, Minneapolis, MN 55418 -- (612)782-7769
hadden@src.honeywell.com -or- hadden@umn-cs.cs.umn.edu
From: secrist@kxovax.enet.dec.com (Strong datatypes for weak minds.)
Newsgroups: comp.lang.lisp.x
Subject: n! for xlisp
Keywords: n!
Date: 2 Sep 92 13:57:23 GMT
Organization: Digital Equipment Corporation


	kan@dg-rtp.dg.com was nice enough to mail me this, which
	works in XLISP V1.1..2.1 and also traps the negative number 
	case:

		(defun factorial (x)
		  (cond ((> x 1) (* x (factorial (- x 1))))
			((> x -1) 1)
			(t nil)))

	I think the error in my ways is that I was using my CP/M
	laptop where XLISP 1.1 only has integers in the range of
	-32768 to +37767 and it was too late for me to notice
	why (factorial 9) didn't work.

	(Please don't tell me the error in my ways was using CP/M
	in 1992.  I've had my NEC 8400 laptop for ~7 years and can't
	afford anything that small and more powerful on my income...
	otherwise I'd be using Scheme or a Forth-variant like UNTIL.
	Besides, the NEC does words and plays ANSI terminal just fine.)

	Regards,
	rcs
From: secrist@kxovax.enet.dec.com (Strong datatypes for weak minds.)
Newsgroups: comp.lang.lisp.x
Subject: n-factorial in XLISP V1.1
Date: 29 Aug 92 06:55:06 GMT
Organization: Digital Equipment Corporation


	I'm trying to make the classic recursive example, n-factorial,
	work under XLISP V1.1 but seem be missing the target.  Is it
	something I'm overlooking about XLISP V1.1 ?

	Regards,
	rcs
From: secrist@kxovax.enet.dec.com (Strong datatypes for weak minds.)
Newsgroups: comp.lang.lisp.x
Subject: XLISP on VMS; Betz address
Date: 30 Aug 92 04:03:36 GMT
Organization: Digital Equipment Corporation


	XLISP works fine on VMS and just about anything else with
	a descent C compiler and sufficient address space.  If you
	don't have a C compiler on a VAX (or Alpha ?) we can talk 
	offline.

	David Betz reads this conference, but there seems to be a
	wealth of experience here and in the world at large so you 
	don't have to try to exclusively address him.

	Regards,
	rcs

Newsgroups: comp.lang.lisp.x
From: kgg@mv.mv.com (Kenn Goutal)
Subject: Need xlisp for Mac pronto
Organization: MV Communications, Inc.
Date: Thu, 3 Sep 1992 22:18:43 GMT

Can someone point me to an archive site that carries a reasonably
up-to-date XLISP for the Mac?  I suddenly remembered that I need
to put it on a disk in the next 28 hours or so, along with some
2500 lines of LISP code to give to my brother to play with / critique.
Thanks!
-- Kenn Goutal
kenn@mv.MV.COM