IWETHEY v. 0.3.0 | TODO
1,095 registered users | 1 active user | 0 LpH | Statistics
Login | Create New User
IWETHEY Banner

Welcome to IWETHEY!

New Re: The awakening begins
Hi, this post may seem too long, or offtopic at first but I mostly
want to use this typing debate to elaborate on my problems with learning how
to program.
You should know I don't consider myself a programmer yet,I almost did not write any programs (but I of course tested, played with code and example from books I read)

What's really creating the crisis/delay/problem/barrier for me is that
I usually try to figure out the big picture of things before I bother with
details, in creating a progam this is not always possible, sometimes you
have to start from creating the details, until you have large enough concepts
that you can use to figure out the big picture or how a program will finally
look like.
Plus creating any significant program require lots of library studying, trial and error work, wich compared to learning a new language ,is very boring and feels like labor!

Anyway, since I decided to learn how to program, I went to the issue/thing of
choosing a language to learn, my first attempt was Java
why?
The java sdk was free, several free IDEs (Netbeans, eclipse, etc...)
plus j2ee looked like an impressive framework ...

I bought learning-java in 21 days (3 weeks) I read the first week
few chapters from thinking in Java by bruce eeckel and gave up on java !!!
the books does an extremely poor job on keeping you exited about the
wonderful skill/ability to create a functional program

I decided to look for another language ... by that time I have gottin into
linux, got a clear view of the GNU, FSF and the whole thing

Most of the programmer communities seem to have forgotin how it was before
they knew this world existed

I decided to learn about the cult, vim vs emacs, kde vs gnome, python vs perl..
I do believe that those debates are as serious as it gets

Comapring software is serious
we are supposed to learn how to make software
we should know a good program when we see it,
and one way or another some programs should be "by design" better then others
plus we are talking free software here, we dont just get to see what the
program do, we also get to see how it was built, i dont recall ever seeing
an article comparing the source code and source code design choices of 2
programs that do the same thing,
what is good code? how do i know it when i see it !!!!

Some people call these comparisions religious or flame wars ...
Of course if we are gonna settle for vim sux, emacs rules then yes
this is shallow, but if we start discussing whats the best UI interface
or human interface as some like to call it we might really get somewhere..
Plus maybe they have a point, preferring kde or gnome can be purely a matter
of taste (unless one offer a basic need/function that the other doesnt)
but on the source code level, which have better code, and why?

Anyway, I after reading a dozen lang-x vs lang-x vs ....
I picked python
Perl had a nasty and scary reputation of being write only
Python had more free books online (at the time I didnt know how big the perldocs were, probably since I mainly started to favor python since my win98 days)
And python also had Zope, which looked impressive.( till today I haven't learned what zope really do, on how it do it, yet it was mostly the determining factor for me to choose to learn python over other langs )

I downloaded several books, read some, got bored again !!!

C followed python, I already took 2 programming course in uni in which we used C, is low level compared to Java and Python
And it was not object oriented.
It was fun and challenging until I finished learning the semantics

By that time I had already heard of Ocaml and Objective-C

So i started considereing picking up one of them!
For different reasons I picked Ocaml, mainly because it was a functional
lang, and I thought that I need to be introduced to that paradigm.

Aahh, the programming paradigm, I was introduced to that topic
by a post made by ben tilly on perlmonks, and I kind of find out
about this forum from his home node @ perlmonks. (Thank you)

Beside traditional functional programming ocaml also introduced me to types
and to the notion of comparing classes to modules not just to types!

All the time I was learning I was always tried to philosophy programming, and OOP, what are objects? what a program should be like?
(first I design my objects, then I design possible scenarios where those
objects will send message to each other or what? And those scenario they will be objects themselves, right? I don't know, but the stuff i read make it seem that way to me!)

There is a strong barrier for people who want to learn how to program
that many books ignore, and that is how do I really create a program, divide it into
modules, create the main function/loop
After I learn how to create functions and classes, now what, how should they play togethe
maybe I am stupid or avoiding the obvious.

Anyway, I do believe that the CS literature (the sum of books writen on the topic) is full of irresponsible writer and very poorly writen books!

Static typing, good or bad ( why is that even an issues today in 2003 )
Shoudnt the CS literature be mature enough to objectively answer this question!!!

==Types==
lets move to my attempt to understand and philosophy types

why do many ppl insist on ignoring the fact
that interger as a group of acceptable values that have a useful meaning!
are fundamentaly different then ... let say structures(or lists or hashtables) !
they are both so very different I dont think we should call em the same
thing! (types)

==c==
int a = 1;
// a can only hold a value in a certain range

int a = 'a';

this would pass, but is 'a' an acceptable value for an integer no
but the c compiler dont mind it cause 'a' is actually a binary value that
can in turn be meaningful as an integer!

but'a', is not an integer type, not in this world, only in the computer world for sure!!

==ocaml==
Ocaml (which is strictly typed) allow you to do this
type day = Mon | Tue | Wed | Thu | Fri | Sat | Sun ;;

Now any variable known to be of type day can only have one of those values!

==c==
you can emulate this in c by doing
typedef enum { Mon , Tue , Wed , Thu , Fri ,Sat , Sun } weekdays_t;

but we know that weekdays_t is actually a collection of intergers, in ocaml we don't it's another type, and we can never treat Mon as 1 in ocaml!!!

==Objects==
Now Objects are a sturcture (that is of special value to us, so in
that sense it is a value)!

{
Number = 1 ;
Character = 'A' ;
String = "something";
}

But of course, we always had stuctures in C so what's the fuzz ??

==Objective-C==
the free book from apple, does a great job at explaining oop concepts , dynamic typing, binding and more ...
especially messaging!

Objective-C, says that ( or so far it does, I am at page 92 in that book )
data are hidden inside an object, an object have methods
and you can send an object a message to request a value (function)
or perform a task (procedure), if the object encapsulate a value that you
would like to know, you must create a method that retrieve it represent it
to you!
I think this goes inline with Ocaml when it compared classes to modules
and when the objective-c books said that Classes are a true logical piece
of the program (unlike module)

<!---
on side note:
you can use objects to emulate closures!!!
very interesting, i wonder doesnt that mean, that a language with objects
would be making redundant efforts by adding closures!
---!>

==Back to the main topic==

so where does static typing fit in all that how can we discuss it, in a way better then static typind suxxxxx dynamism ruuuulllllllleeeeeeeesssssssssssss
or cause it makes right shorter code, or that it makes me right code easier!
(what can the average person who want to be a descent programmer one day, learn from that?)

I really don't think I know, I don't think I got the big picutre yet, but i will give it a shot anyway:
C is said to be a static and weakly typed language!
Ocaml is static, strict, polymorphic, compiled
Objective-c is OO, dynamic, compiled
Python it's interpreted, dynanmic OO

They all work So It's like <!--- BLANK, WHITE, VOID ---!> for me
Does strict typing allow for less testing ? (if so isn't that good)
wouldn't that mean shorter test session, less time to make software
which can be seen as a benefit!

I read this in the objective-c books
NSobject, is an abstract class, that is not usefull by it self
cause it does nothing in particular!

And I think that's what type checking can do for a new programming student
it's help him construct programs that does something specific and useful, rather that chasing shadows!

Most of those top notch programmers who say I dont need static type
checking are probably skilled enough not to do the mistakes that static typing highlight!
And they enjoy the flexibility of the "all structural types are generic!"
a list in python can hold a combination of arbitary types
(I want to ask experienced programmers when is that useful)

so if i may i see that the current popular terminology defines that:
(...)type checking done at compile time is called static
(...)type checking done at run time is called dynamic

and if i may, i would like to create my own terminology which i think
describe the situatio better:
(...)type checking done by the compiler, is called automated type checking
(...)type checking done at runtime, is called manual type checking

so maybe we have a problem, because manual type checking performed by human
usually lead, to better (as in more flexible) results then that done by
the machine!
this is sad, the solution should not be to recommend manual type checking
but rather create better software type checkers
if the process of verifying which objects are accept by a method and which objects are rejected is structured enough, we can theoratically create a software
that identify them and report them (as they are) to the programmer
I think this should, be part of the compiler job

this already exist, and is known as type inference (check ocaml)

if the certian aspects of the type are irrelevant then the compiler report just
just (in ocaml we 'a list type, which is a list of anything, that is any one kind of things )
it's good the compiler points that to you, right!

===Conclusion===

I dont think the problem is static typing
i think the problem is how we do static typing
and more importantly how we seem to fail to identify types

If a function call, on specific attributes of a type
for example: obj.walk()
the type here should be partially defined
obj should be typed any objects that have attribute method walk()

and this should be make clear in the method or function signature
of course many statically typed langs wont let you do this
and the solution there is as ToddBlanchard said, to refactor ( I assume
this means, redesign) your class hierarchy, to have an abstract type
that have just enough attributes to path this method sucessfully

the dynanmic manual solution wont have this problem since it allow a JIT kind
of type checking
but if an object have to pass this method, but unfortunatly
generate a run-time type error, the solution here would be to read the method implemenation to see which attribute is missing, and add to the object that must use this method
which still seem more akward to me then successful (partial) static typing
and this mean that here you have to completly reveil the implementation
detail whereas in automated type checking, the implementation is partially
reveiled

of course the key issue here is good type inference

we are programmers, our job, is to find ways to let to machine
do as much of the work as possible.
if the machine can do it, the machine should do it
TDD+dynamic typing shouldn't be the solution, to partial types
working on type inference techniques, and automated (static) type checking is!

Of course, until we have that, and maybe we do ( i still dont know all that much about ocaml)
TDD + a dynamic language could be the best we have now!

but of course a descent advice that stresses the importance of testing will always be good!(and it actually do more then type checking)

Anyway, I dont know how to continue any furthur in this debate
But I just wanted to say how I think so that maybe others
can highlight to me, where I think wrong or where I gone bogus

Thanx for reading such a long post :)
And I hope to read long meaningfull post from all!

Expand Edited by systems May 12, 2003, 10:43:42 AM EDT
Expand Edited by systems May 13, 2003, 10:27:56 PM EDT
Expand Edited by systems May 14, 2003, 09:55:29 AM EDT
New A couple answers
The beef most dynamic language fans have with static typing is the loss in flexibility. It puts up all sorts of unnecessary walls and development often feels like an exercise in digging tunnels for no good reason.

These computer models of types just approximate the real world. The world isn't that well organized. You can take slices of things and they seem organized within the slice, but its only one perspective.

A typical example:

Birds can fly.
A penguin is a bird.
A penguin can fly.

An error caused by an overly general assumption early on. (Not all birds can fly - but most do).

This kind of error occurs in program development all the time. You make a simplifying assumption early on. You proceed based on that assumption. Eventually, some new information comes along that doesn't fit your original assumption.

Question - when your assumption is proven to be false, what do you do?

In a strong statically typed language, you have no choice, you must aggresively refactor you class hierarchy to account for these differences. Suddenly instead of abstract class Bird with operation fly(), you have to create FlyingAnimal, add each of the types of birds that can fly individually. And you've lost the birdness of them. You have gained the ability to add bats, flying fish, and flying squirrels.

You can say that you could solve this with multiple inheritance and divide the types into protocols or interfaces. Then you might have something like:

Penguin : <Bird, FurBearing, Swimmer, LandDweller, Diurnal>
Canary : <Bird, Feathered, Flying, TreeDweller, Diurnal>
Bat : <Mammal, FurBearing, Flying, CaveDweller, Nocturnal>

But this fine level of factoring maybe isn't necessary for your application to work (maybe its a zoo food distribution system).

I'd like to refer you to Bart Kosko's "Fuzzy Thinking" as an interesting (and not too technical) read. Fuzzy people's idea of set membership isn't binary, its a float - how strongly do you exhibit a certain membership? How Catholic are you? In my younger dating days I came to understand with girls that there's Catholic and Catholic. That's just life.

OK, so assuming we have a dynamically typed system and we make the same bad assumption. We don't have to refactor the entire type hierarchy to account for shifts in the way we look at things. We can implement the flying protocol on anything we like and simply remember to only hand flyers to things that expect things to fly.


a list in python can hold a combination of arbitary types
(I want to ask experienced programmers when is that useful)


Well, this is Smalltalk. But consider:

"a collection of stuff with nothing in common?"
stuff := OrderedCollection with: (Refrigerator new) with: (Sofa new) with: (Penguin new) with: (BowlingBall new) with: (Sandwich new).

truck := Truck withCapacity: 2000. "One ton truck"

weight := 0.
truck load: (stuff select: [:item |
((weight + (item weight)) < (truck capacity))
ifTrue: [weight := weight + item weight. true]
ifFalse: [false]]).

Apparently all that stuff has something in common after all.




"Packed like lemmings into shiny metal boxes.
Contestants in a suicidal race."
    - Synchronicity II - The Police
New ICLRPD
Fuzzy people's idea of set membership isn't binary, its a float - how strongly do you exhibit a certain membership? How Catholic are you? In my younger dating days I came to understand with girls that there's Catholic and Catholic. That's just life.
Or just:
In my younger dating days I came to understand with girls that there's Catholic and Catholic. That's just life.
===

Implicitly condoning stupidity since 2001.
New Do I C another one...?
Penguin : <Bird, FurBearing, Swimmer, LandDweller, Diurnal>
Penguins are "FurBearing"?!?

Only in Todd's World! :-)


   [link|mailto:MyUserId@MyISP.CountryCode|Christian R. Conrad]
(I live in Finland, and my e-mail in-box is at the Saunalahti company.)
Your lies are of Microsoftian Scale and boring to boot. Your 'depression' may be the closest you ever come to recognizing truth: you have no 'inferiority complex', you are inferior - and something inside you recognizes this. - [link|http://z.iwethey.org/forums/render/content/show?contentid=71575|Ashton Brown]
New Aren't they like seals?
They aren't feathered.



"Packed like lemmings into shiny metal boxes.
Contestants in a suicidal race."
    - Synchronicity II - The Police
New Yes they are.
There are several species of penguins that have feathered crests. Other than that it's just skin and blubber. Seals have hair.
Regards,

-scott anderson

"Welcome to Rivendell, Mr. Anderson..."
New No - they're "almost, but not entirely, unlike" seals.
Toddsko:
They aren't feathered.
Who aren't - the seals? No, that's right.

Penguins, OTOH, being birds, frigging well ARE feathered. (And not just the crests, either; where the heck didya get *that* from, Scott?)

I mean, just look at the blurbs ON THIS SEARCH PAGE ITSELF: [link|http://www.google.com/search?q=penguins+feathers+fur|http://www.google.com/search?q=penguins+feathers+fur] !

Sheesh...


   [link|mailto:MyUserId@MyISP.CountryCode|Christian R. Conrad]
(I live in Finland, and my e-mail in-box is at the Saunalahti company.)
Your lies are of Microsoftian Scale and boring to boot. Your 'depression' may be the closest you ever come to recognizing truth: you have no 'inferiority complex', you are inferior - and something inside you recognizes this. - [link|http://z.iwethey.org/forums/render/content/show?contentid=71575|Ashton Brown]
New NFC.
Regards,

-scott anderson

"Welcome to Rivendell, Mr. Anderson..."
New Does the phrase "Splitting Hairs" come to mind. :-)
New birds are feathered and hairy
anyone who has spent time plucking ducks and geese know that
thanx,
bill
will work for cash and other incentives [link|http://home.tampabay.rr.com/boxley/resume/Resume.html|skill set]

questions, help? [link|mailto:pappas@catholic.org|email pappas at catholic.org]

Carpe Dieu
New It's all feathers.
The stuff underneath is a type of feather that only develops wisps, instead of wisps and barbed interlocking spines.
Regards,

-scott anderson

"Welcome to Rivendell, Mr. Anderson..."
New Re: It's all feathers.
Could be Conrad is a feather expert. Anki says, "Chrissy, put on the Indian outfit!"

(PS: Aren't feathers just morphed scales anyway?)
-drl
New Re, "PS": Yeah, sure - so, whatchathink HAIRS are?!?
New Never really thought about it..
..but these guys have!

[link|http://www.cmnh.org/dinoarch/1998Jul/msg00323.html|http://www.cmnh.org/...Jul/msg00323.html]
-drl
New Sometimes there aren't right answers
Just trade-offs. And a lot of people with strong opinions. And a lot of people without real opinions, but who are scared that the answers might not be what they have learned.

This situation can last indefinitely, particularly since in different problem domains, different answers can be better.

In fact I don't expect debates about typing to go away in my lifetime...

Cheers,
Ben

PS It is always a good feeling to believe that you have had a positive role in someone else's learning curve. So if I helped you at some point, it was my pleasure. :-)
"good ideas and bad code build communities, the other three combinations do not"
- [link|http://archives.real-time.com/pipermail/cocoon-devel/2000-October/003023.html|Stefano Mazzocchi]
New Down with Determinants! :)
-drl
New Please indicate what you changed in an Edit. Thanks. :-)
     The awakening begins - (tuberculosis) - (140)
         Quotes from Uncle Bob - (admin) - (12)
             Maybe it's just me... - (Simon_Jester) - (5)
                 Static languages make the code brittle ... - (bluke)
                 History revisionism - beware !!! (IMHO) - (dmarker) - (3)
                     Re: History revisionism - beware !!! (IMHO) - (JimWeirich) - (2)
                         Another issue was the potential popularity of a lang - (dmarker) - (1)
                             Re: Another issue was the potential popularity of a lang - (JimWeirich)
             Gee...I thought it was a friendly discussion... - (jb4) - (4)
                 Re: Gee...I thought it was a friendly discussion... - (JimWeirich) - (3)
                     Manifest typing....a la Fortran. - (Simon_Jester)
                     Thanks, Jim. Nicely put. -NT - (jb4) - (1)
                         Re: Ditto - Thanks, Jim. -NT - (dmarker)
             Next experiment: try it without OO -NT - (tablizer)
         Java going in the other direction - (bluke) - (109)
             Re: Java going in the other direction - (JimWeirich) - (34)
                 Smalltalk also - (bluke)
                 Speaking of autoboxing - (ChrisR) - (32)
                     gasp -NT - (deSitter) - (2)
                         This is what happens when the foundation sucks - (bluke) - (1)
                             Oh My! - (deSitter)
                     According to Joshua Bloch it hasn't been decided yet - (bluke) - (28)
                         This is just stupid - (tuberculosis) - (27)
                             I think you missed the point - (JimWeirich) - (5)
                                 OK, maybe so - (tuberculosis) - (4)
                                     Re: OK, maybe so - (JimWeirich) - (3)
                                         Well in this case - (tuberculosis) - (2)
                                             Perhaps ... but ... - (JimWeirich) - (1)
                                                 My point was - (tuberculosis)
                             Not J-heads. - (admin) - (1)
                                 Smalltalk as usual is consistent - (bluke)
                             Set Theory - (deSitter) - (18)
                                 Re: Set Theory - (admin) - (12)
                                     Here we go - (deSitter) - (11)
                                         Re: Here we go - (admin) - (10)
                                             Amazing - (deSitter) - (9)
                                                 Re: Amazing - (admin) - (6)
                                                     Re: Amazing - (deSitter) - (5)
                                                         Wow. My first exposure to APL - (Arkadiy) - (1)
                                                             Same as in Objective C -NT - (admin)
                                                         Re: Amazing - (JimWeirich) - (2)
                                                             Heh. - (tseliot) - (1)
                                                                 ROFL -NT - (deSitter)
                                                 No - (Arkadiy)
                                                 Hey Ross, it's only a model. - (mmoffitt)
                                 Hey, watch this! - (drewk)
                                 Unlike DrooK, I'll bite: Ever heard of SQL, ya nitwit?!? -NT - (CRConrad) - (3)
                                     See comment above, applies here as well - (deSitter) - (2)
                                         Better stop talking to yourself then. - (admin)
                                         Your problem is the same you had a year (or was it two?) ago - (CRConrad)
             I remeber Pascal in the very same way - (jb4) - (72)
                 Just had this conversation - (tseliot) - (45)
                     Freep said the same thing - (tuberculosis) - (43)
                         Still waiting for ... - (jb4) - (42)
                             Depends on constraints - (tuberculosis) - (41)
                                 Platforms: - (jb4) - (40)
                                     Don't even get me started - (tuberculosis) - (30)
                                         I'll get you started, alright! - (jb4) - (29)
                                             No I'm not - (tuberculosis) - (28)
                                                 The problem is, you're trying to treat a bool as a number - (jb4) - (25)
                                                     No, I'm trying to branch on a condition - (tuberculosis) - (24)
                                                         21st Century Schitzoid Man - (jb4) - (23)
                                                             You are fighting the language - (tuberculosis) - (22)
                                                                 Tell you what... - (jb4)
                                                                 Can I put my oar in? - (static) - (20)
                                                                     Yeah sure - (tuberculosis) - (19)
                                                                         Such flowerly language toward such a misguided conclusion - (jb4) - (18)
                                                                             Yeah right - (tuberculosis) - (17)
                                                                                 (++true == false) - (ChrisR) - (1)
                                                                                     Just add a little gasoline, and stir!_____;-) - (jb4)
                                                                                 OK, Now I see wht your problem is - (jb4) - (5)
                                                                                     I thought you were going to give up on this - (tuberculosis) - (4)
                                                                                         How sensible is this?!? - (jb4) - (3)
                                                                                             Not convinced - (tuberculosis) - (2)
                                                                                                 Nor am I - (jb4) - (1)
                                                                                                     You guys should be using Modula-2. :-P (new thread) - (Another Scott)
                                                                                 And an answer to your question. - (jb4) - (8)
                                                                                     Wrong answer - (tuberculosis) - (7)
                                                                                         Wrong answer back - (jb4)
                                                                                         They've turned it into Pascal - (deSitter) - (5)
                                                                                             Circular definition. - (CRConrad) - (4)
                                                                                                 Re: Circular definition. - (deSitter) - (3)
                                                                                                     Self-contradiction, and logically inconsistent definition. - (CRConrad) - (2)
                                                                                                         Can someone start a new thread please? -NT - (drewk) - (1)
                                                                                                             What for, aren't the long ones the best? -NT - (CRConrad)
                                                 Comments on supposed idiocy - (JimWeirich) - (1)
                                                     Re: Comments on supposed idiocy - (tuberculosis)
                                     Don't even get me started - (tuberculosis)
                                     You didn't mention types of programs -NT - (tuberculosis) - (7)
                                         Sorry, thot I was clear earlier... - (jb4) - (6)
                                             Still doesn't tell me enough - (tuberculosis) - (5)
                                                 Re: Still doesn't tell me enough - (jb4) - (4)
                                                     The VM's are all written in very portable C - (tuberculosis) - (3)
                                                         Re: The VM's are all written in very portable C - (deSitter) - (2)
                                                             Funny you should mention it - (tuberculosis) - (1)
                                                                 Re: Funny you should mention it - (deSitter)
                     Minor modification - (jb4)
                 Just because *you* don't see it... - (pwhysall)
                 In fact.. - (deSitter) - (15)
                     Heh... - (jb4) - (14)
                         Re: Heh... - (deSitter) - (13)
                             BS - (admin) - (3)
                                 BS - (deSitter) - (2)
                                     When I see you spouting it, I'm going to call you on it. - (admin) - (1)
                                         Fair enough! -NT - (deSitter)
                             Do you have a clue why Linux is easily ported? - (ben_tilly) - (8)
                                 Re: Do you have a clue why Linux is easily ported? - (deSitter) - (7)
                                     No, that is not quite what you claimed - (ben_tilly) - (6)
                                         Well, to me -NT - (deSitter)
                                         Well, to me "moot" means.. - (deSitter) - (4)
                                             Why does your position appear to be shifting? - (ben_tilly) - (3)
                                                 Modus operandi - (admin) - (1)
                                                     Re: Modus operandi - (deSitter)
                                                 Re: Why does your position appear to be shifting? - (deSitter)
                 Wasn't Pascal written as a teaching tool? - (drewk) - (8)
                     Yes - (bluke)
                     Re: Wasn't Pascal written as a teaching tool? - (JimWeirich) - (6)
                         Re: Wasn't Pascal written as a teaching tool? - (Yendor) - (4)
                             Forward Declarations - (JimWeirich) - (3)
                                 Hmm, was Turbo Pascal different about that? -NT - (drewk)
                                 Been too long - (Yendor)
                                 Nope, you're right. - (jb4)
                         Not when I learned it - (drewk)
             Same bandaid as C++ templates - (tuberculosis)
         Re: The awakening begins - (systems) - (16)
             A couple answers - (tuberculosis) - (12)
                 ICLRPD - (drewk)
                 Do I C another one...? - (CRConrad) - (10)
                     Aren't they like seals? - (tuberculosis) - (9)
                         Yes they are. - (admin)
                         No - they're "almost, but not entirely, unlike" seals. - (CRConrad) - (7)
                             NFC. -NT - (admin) - (1)
                                 Does the phrase "Splitting Hairs" come to mind. :-) -NT - (ChrisR)
                             birds are feathered and hairy - (boxley) - (4)
                                 It's all feathers. - (admin) - (3)
                                     Re: It's all feathers. - (deSitter) - (2)
                                         Re, "PS": Yeah, sure - so, whatchathink HAIRS are?!? -NT - (CRConrad) - (1)
                                             Never really thought about it.. - (deSitter)
             Sometimes there aren't right answers - (ben_tilly) - (1)
                 Down with Determinants! :) -NT - (deSitter)
             Please indicate what you changed in an Edit. Thanks. :-) -NT - (Another Scott)

I made you eggs. Straight from my womb to your plate!
303 ms