From ... Path: archiver1.google.com!news1.google.com!newsfeed.stanford.edu!news.tele.dk!small.news.tele.dk!195.25.12.36!oleane.net!oleane!pasteur.fr!univ-lyon1.fr!nmaster.kpnqwest.net!nreader3.kpnqwest.net.POSTED!not-for-mail Newsgroups: comp.lang.lisp Subject: Re: On nil qua false [was: Re: On conditionals] References: <3215299538573186@naggum.net> <3215481014063125@naggum.net> <3BFDF255.3153E96F@nyc.rr.com> <87u1vggt5i.fsf@teonanacatl.andreas.org> <9u0n7n$pds$2@rznews2.rrze.uni-erlangen.de> <87adx7gbcf.fsf@teonanacatl.andreas.org> <861yijw8hi.fsf@gondolin.local.net> Mail-Copies-To: never From: Erik Naggum Message-ID: <3216096657595675@naggum.net> Organization: Naggum Software, Oslo, Norway Lines: 43 User-Agent: Gnus/5.09 (Gnus v5.9.0) Emacs/21.1 MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Date: Fri, 30 Nov 2001 08:11:00 GMT X-Complaints-To: newsmaster@KPNQwest.no X-Trace: nreader3.kpnqwest.net 1007107860 193.71.66.49 (Fri, 30 Nov 2001 09:11:00 MET) NNTP-Posting-Date: Fri, 30 Nov 2001 09:11:00 MET Xref: archiver1.google.com comp.lang.lisp:21470 * Kent M Pitman | Is the reason that people focus so much on static type checking that it's | so hard to get a program to RUN in those languages? In CL, you can run a | partial program immediately upon writing it, and we often do. So in | those other programs, one runs the compiler to find errors on the basis | of "static" info. Whereas in CL you often also run a program fragment. | In a language that makes you wait longer to test your code, perhaps the | sense of need for static typechecking is higher, since that's all you can | get for a long time... Interesting perspective. If a CL program omits a function definition, the debugger is invoked when it is called, and one may usually define it and try the calling form again, even when the caller is compiled. If a function in a static language program is omitted, there has traditionally _not_ been a debugger to invoke because the debugger or any other part of the development environment are not part of the "executable", so what do you do? You could just terminate with a linking error, but that would only be marginally more useful than having the compiler gripe about it -- and it is easy enough to write your own "stub function" that signals the absence of a real function body. How useful would a debugger be for a language that forces the programmer to recompile a large number of its source files if you made changes? The choice to use as much as possible of the available information from the compilation process in the _caller_, instead of in the _callee_, may account for more of the difference between languages than the static vs dynamic nature of its type system, since that appears to be the fall-out of the former choice, not fundamental to it, as the more you (want to) optimize the _user_ of any object, the more static the whole language has to be. However, as more and more information becomes available and is known to be static, more and more of it _may_ be used in the caller. This is probably also why declarations in static languages are promises that are required, yet expected to be broken, so the compiler punishes you when you do have lied (the IRS model of honesty), while they are (optional) promises that are expected to be kept in Common Lisp (the family model of honesty). /// -- The past is not more important than the future, despite what your culture has taught you. Your future observations, conclusions, and beliefs are more important to you than those in your past ever will be. The world is changing so fast the balance between the past and the future has shifted.