You're point being...? I'm an old lisp hacker too, and lisp developed objects too, because they're cool and useful (Flavors & CLOS).
Java has inner classes also, and nobody misses FLET & LABELS. Limiting responsiblity and enhanced type safety, as well as improved readablity are a win hands down over the bad old days. Lisp is not a more advanced language than Java. Its 30+ years older and shows it in alot places. Lisp has some things I wish were in Java but the corralary holds true. Object orient programming in Lisp is nice too. Xah Lee wrote: > What are OOP's Jargons and Complexities > Xah Lee, 20050128 > > The Rise of Classes, Methods, Objects > > In computer languages, often a function definition looks like this: > subroutine f (x1, x2, ...) { > variables ... > do this or that > } > > In advanced languages such as LISP family, it is not uncommon to define > functions inside a function. For example: > subroutine f (x1, x2, ...) { > variables... > subroutine f1 (x1...) {...} > subroutine f2 (x1...) {...} > } > > Often these f1 f2 inner functions are used inside f, and are not > relevant outside of f. Such power of the language gradually developed > into a style of programing. For example: > subroutine a_surface () { > coordinatesList = ...; > subroutine translate (distance) {...} > subroutine rotate (angle) {..} > } > > Such a style is that the a_surface is no longer viewed as a function. > But instead, a boxed set of functions, centered around a piece of data. > And, all functions for manipulating this piece of data are all embodied > in this function. For example: > subroutine a_surface (arg) { > coordinatesList = ... > subroutine translate (distance) {set coordinatesList to translated > version} > subroutine rotate (angle) {set coordinatesList to rotated version} > subroutine return () {return coordinatesList} > > if (no arg) {return coordinatesList} > else { apply arg to coordinatesList } > } > > In this way, one uses a_surface as a data, which comes with its owe set > of functions: > mySurface = a_surface(); > mySurface(rotate(angle)); // now the surface data has been > rotated > mySurface(translate(distance)); // now its translated > newSurface = mySurface(return()) > > So now, a_surface is no longer viewed as a subroutine, but a boxed set > of things centered around a piece of data. All functions that work on > the data are included in the boxed set. This paradigm possible in > functional languages has refined so much so that it spread to other > groups and became known as Object Oriented Programing, and complete > languages with new syntax catered to such scheme emerged. > > In such languages, instead of writing them like this: > mySurface = a_surface(); > mySurface(rotate(angle)); > > the syntax is changed to like this, for example: > mySurface = new a_surface(); > mySurfaceRotated = mySurface.rotate(angle); > > In such languages, the super subroutine a_surface is no longer called a > function or subroutine. It is now called a “Class”. And now the > variable holding the function "mySurface = a_surface()" is now called a > “Object”. Subroutines inside the function a_surface() are no longer > called inner-subroutines. They are called “Methods”. The act of > assigning a super-subroutine to a variable is called instantiation. > > This style of programing and language have become so fanatical that in > such dedicated languages like Java, everything in the language are > “Classes”. One can no longer just define a variable or subroutine. > Instead, one creates these meta-subroutine “Classes”. Everything > one do are inside Classes. And one assign Classes inside these Classes > to create “Objects”. And one uses “Methods” to manipulate > Objects. In this fashion, even basic primitives like numbers, strings, > and lists are no longer atomic entities. They are now Classes. > > For example, in Java, a string is a class String. And inside the class > String, there are Methods to manipulate strings, such as finding the > number of chars, or extracting parts of the string. This can get very > complicated. For example, in Java, there are actually two Classes of > strings: One is String, and the other is StringBuffer. Which one to use > depends on whether you intend to change the data. > > So, a simple code like this in normal languages: > a = "a string"; > b = "another one"; > c = join(a,b); > print c; > > or in lisp style > (set a "a string") > (set b "another one") > (set c (join a b)) > (print c) > > becomes in pure OOP languages: > public class test { > public static void main(String[] args) { > String a = new String("a string"); > String b = new String("another one"); > StringBuffer c = new StringBuffer(40); > c.append(a); c.append(b); > System.out.println(c.toString()); > } > } > > Here, the "new String" creates a String object. The "new > StringBuffer(40)" creates the changeable string object StringBuffer, > with room for 40 chars. "append" is a method of StringBuffer. It is > used to join two Strings. > > Notice the syntax "c.append(a)", which we can view it as calling a > inner subroutine "append", on a super subroutine that has been assigned > to c, where, the inner subroutine modifies the inner data by appending > a to it. > > And in the above Java example, StringBuffer class has another method > "toString()" used to convert this into a String Class, necessary > because System.out.println's parameter requires a String type, not > StringBuffer. > > For a example of the complexity of classes and methods, see the Java > documentation for the StringBuffer class at > http://java.sun.com/j2se/1.4.2/docs/api/java/lang/StringBuffer.html > (local copy) > > In the same way, numbers in Java have become a formalization of many > classes: Double, Float, Integer, Long... and each has a bunch of > "methods" to operate or convert from one to the other. > > Instead of > aNumber = 3; > print aNumber^3; > > In Java the programer needs to master the ins and outs of the several > number classes, and decide which one to use. (and if a program later > needs to change from one type of number to another, it is often > cumbersome.) > > This Object Oriented Programing style and dedicated languages (such as > C++, Java) have become a fad like wild fire among the programing mass > of ignoramuses in the industry. Partly because of the data-centric new > perspective, partly because the novelty and mysticism of new syntax and > jargonization. > > It is especially hyped by the opportunist Sun Microsystems with the > inception of Java, internet, and web applications booms around 1995. At > those times, OOP (and Java) were thought to revolutionize the industry > and solve all software engineering problems, in particular by certain > "reuse of components" concept that was thought to come with OOP. > > As part of this new syntax and purity, where everything in a program is > of Classes and Objects and Methods, many complex issues and concept > have arisen in OOP. > > We now know that the jargon Class is originally and effectively just a > boxed set of data and subroutines, all defined inside a subroutine. And > the jargon "Object" is just a variable that has been set to this super > subroutine. And the inner subroutines are what's called Methods. > > ---------- > to be continued tomorrow. > > This is part of an installment of the article > “What are OOP's Jargons and Complexities” > by Xah Lee, 20050128. The full text is at > http://xahlee.org/Periodic_dosage_dir/t2/oop.html > > © Copyright 2005 by Xah Lee. Verbatim duplication of the complete > article for non-profit purposes is granted. > > The article is published in the following newsgroups: > comp.lang.c,comp.lang.c++,comp.lang.lisp,comp.unix.programmer > comp.lang.python,comp.lang.perl.misc,comp.lang.scheme,comp.lang.java.programmer > comp.lang.functional,comp.object,comp.software-eng,comp.software.patterns > > Xah > [EMAIL PROTECTED] > ∑ http://xahlee.org/ > -- http://mail.python.org/mailman/listinfo/python-list