PEP 3107 and stronger typing (note: probably a newbie question)

B

Bruno Desthuilliers

Bjoern Schliessmann a écrit :
Did he say that static typing detects all errors?

Nope, he just asserted something wrong. Static typing is for compiler
optimization. Type checking is at most a side effect, and in some
languages (at least C, C++ and Java) can be totally defeated (usually
using typecasting).
 
P

Paul Rubin

Bruno Desthuilliers said:
Nope, he just asserted something wrong. Static typing is for compiler
optimization. Type checking is at most a side effect, and in some
languages (at least C, C++ and Java) can be totally defeated (usually
using typecasting).

"Definitions of type system vary, but the following one due to
Benjamin C. Pierce roughly corresponds to the current consensus in
the programming language theory community:

[A type system is a] tractable syntactic method for proving the
absence of certain program behaviors by classifying phrases
according to the kinds of values they compute. (Pierce 2002)."

-- http://en.wikipedia.org/wiki/Type_theory#Type_system

C and C++ are basically untyped languages. Java casts can only
partially defeat its type system, so it's not untyped.
 
B

Bruno Desthuilliers

Paul Rubin a écrit :
Bruno Desthuilliers said:
Nope, he just asserted something wrong. Static typing is for compiler
optimization. Type checking is at most a side effect, and in some
languages (at least C, C++ and Java) can be totally defeated (usually
using typecasting).


"Definitions of type system vary, but the following one due to
Benjamin C. Pierce roughly corresponds to the current consensus in
the programming language theory community:

[A type system is a] tractable syntactic method for proving the
absence of certain program behaviors by classifying phrases
according to the kinds of values they compute. (Pierce 2002)."

Is this supposed to contradict my assertion that *static* typing is for
compilers ?

C (and C++) are statically typed. It's usually agreed that C is weakly
typed, and that C++ is somewhat more strongly typed. In both cases, you
can totally defeat compile-time type-checking, with possibly some very
unpredictable results. Python is dynamically typed, but doesn't allow
the kind of results you can get from a C typecast.
-- http://en.wikipedia.org/wiki/Type_theory#Type_system


C and C++ are basically untyped languages.

Hem... This assertion is at least debatable. Care to post this on c.l.c
or c.l.c++, so we get some feedback ?
Java casts can only
partially defeat its type system,

In Java, an erroneous typecast will result in a runtime error. Where's
the benefit of static typechecking if you can get type errors at runtime?
 
B

Bruno Desthuilliers

John Nagle a écrit :
(snip)
It looks like
a compromise between the "no declarations" position and the "make
the language strongly typed" position. (snip)
The main advantage of strongly typed systems is that more errors
are detected at compile time.
(snip)

s/strongly/statically/

1/ strong typing is not necessarily static typing,
2/ static typing is not necessarily strong typing
3/ dynamic typing is not necessarily weak typing
4/ static typing is not necessarily declarative (ever heard of
type-inference based systems ?)
 
P

Paul Rubin

Bruno Desthuilliers said:
[A type system is a] tractable syntactic method for proving the
absence of certain program behaviors by classifying phrases
according to the kinds of values they compute. (Pierce 2002)."

Is this supposed to contradict my assertion that *static* typing is
for compilers ?

Yes, the main benefit these days is to prove the absence of certain
types of bugs in the program.

The article "What To Know Before Debating Type Systems" is pretty
informative (though it doesn't go as far as to call C/C++ untyped):

http://cdsmith.twu.net/types.html
Hem... This assertion is at least debatable. Care to post this on
c.l.c or c.l.c++, so we get some feedback ?

I wouldn't consider the aficionados of those dinosaur languages to be
authorities on such a question.
 
E

Eduardo \EdCrypt\ O. Padoan

Eduardo "EdCrypt" O. Padoan a écrit :

Oh yes ? So what's the compiler doing, and what are those .pyc files ?
(hint: read the doc)

Sorry, I surely know that Python has a compile time, I wanted to say
somthing like "compile time checks except from syntax". My intention
was to show that a *huge* change in the Python interpretation model
would be needed to allow what he wanted, but I finished my email too
early :p
And yes, I readed the docs :)
 
A

Alex Martelli

Bruno Desthuilliers said:
I still maintain that the primary *practical* reason behind static
typing is to provide optimization clues for the compiler. You can (or at

It's definitely a helpful aspect, yes -- given that compilers able to
infer types are still not very common for widely used languages; also,
complete type checking or inference requires analysis of the whole
program, which may be quite impractical -- and stops what Van Roy and
Haridi, in their masterpiece "Concepts, Techniques and Models of
Computer Programming", call "totally open programming". Quoting a post
of mine from 2004:
"""
I love the explanations of Van Roy and Haridi, p. 104-106 of their book,
though I may or may not agree with their conclusions (which are
basically that the intrinsic difference is tiny -- they point to Oz and
Alice as interoperable languages without and with static typing,
respectively), all the points they make are good. Most importantly, I
believe, the way dynamic typing allows real modularity (harder with
static typing, since type discipline must be enforced across module
boundaries), and "exploratory computing in a computation model that
integrates several programming paradigms".

"Dynamic typing is recommended", they conclude, "when programs must be
as flexible as possible". I recommend reading the Agile Manifesto to
understand why maximal flexibility is crucial in most real-world
application programming -- and therefore why, in said real world rather
than in the more academic circles Dr. Van Roy and Dr. Hadidi move in,
dynamic typing is generally preferable, and not such a tiny issue as
they make the difference to be. Still, they at least show more
awareness of the issues, in devoting 3 excellent pages of discussion
about it, pros and cons, than almost any other book I've seen -- most
books have clearly delineated and preformed precedence one way or the
other, so the discussion is rarely as balanced as that;).
"""
least could) have declarative static typing with very few type
*checking* - I may be wrong here but I think one could even write a C
compiler without *any* type checking. Heck, the programmer said it's a
char*, so it must be one, right ?-)

That compiler, I believe, would violate the ISO standard for C (so
calling it a "C compiler" would be about as correct as calling it a
banana, in my view:).
wrt/ proofs of correctness, I'll just point to the spectacular failure
of Ariane, which was caused by a *runtime* type error in a system

I like a quote by Knuth -- "beware this program may have bugs as I have
only proven it and not tested it":)
Hmmm... For a dinausor, C seems well alive. Can you remind me which

So do chickens.


Alex
 
D

Diez B. Roggisch

wrt/ proofs of correctness, I'll just point to the spectacular failure
of Ariane, which was caused by a *runtime* type error in a system
programmed in ADA - one of the languages with the most psychorigid
declarative static type systems.

That's simply not true. The problem hadn't to do with typing - it was a
overflow due to larger input quantities. It had been shown for the
Ariane 4 that this overrun could never happen - by whatever thechnique,
operational or denotational semanticse, I don't know.

For the ariane 5, these input constraints didn't hold, which caused the
unexpected runtime error to occur.

But there is _no_ type-error here! The programmers might have chosen a
different type with larger range, sure. But to say that's a type error
is as saying "using a string where a tuple of int and string were better
is a type error." It's another path of implementation.

Or from a testing angle: if the unit tests did only produce input values
to a certain quantity, the results were ok. Nobody thought about writing
new tests with larger quantities - the same way nobody thought about
proving the program with those same quantities.

Diez
 
B

Bruno Desthuilliers

Paul Rubin a écrit :
Bruno Desthuilliers said:
[A type system is a] tractable syntactic method for proving the
absence of certain program behaviors by classifying phrases
according to the kinds of values they compute. (Pierce 2002)."

Is this supposed to contradict my assertion that *static* typing is
for compilers ?

Yes, the main benefit these days is to prove the absence of certain
types of bugs in the program.

As someone said, if declaring types thrices was enough to ensure
correctness, I'd happily do so.

I still maintain that the primary *practical* reason behind static
typing is to provide optimization clues for the compiler. You can (or at
least could) have declarative static typing with very few type
*checking* - I may be wrong here but I think one could even write a C
compiler without *any* type checking. Heck, the programmer said it's a
char*, so it must be one, right ?-) Of course, no one in it's own mind
would use such a compiler (if you have to suffer from the restrictions
imposed by static typing, you want to also profit from it's benefices -
or at least avoid the possibly dramatic effects of a type error in these
systems). Also, some (mostly) dynamically typed languages have grown
type-annotations for the very same reason : hinting the compiler about
possible optimizations.

wrt/ proofs of correctness, I'll just point to the spectacular failure
of Ariane, which was caused by a *runtime* type error in a system
programmed in ADA - one of the languages with the most psychorigid
declarative static type systems. Not to say these proofs are inexistant,
just that they are IMHO a bit overvalued - at least wrt/ to my daily
concerns. Most of the errors I have to deal with are logical errors, not
type errors, and given the kind of "logic" (err...) you can find in
business applications (to make a long story short : it has very few to
do with mathematics), I have some doubt about what a static type system
- even a _very_ smart one - could prove here, at least if we hope to
deliver the application within time and budget constraints (sorry for
being soo practical here).
The article "What To Know Before Debating Type Systems" is pretty
informative (though it doesn't go as far as to call C/C++ untyped):

http://cdsmith.twu.net/types.html

Quote :
"""
Therefore: I give the following general definitions for strong and weak
typing, at least when used as absolutes:

* Strong typing: A type system that I like and feel comfortable with
* Weak typing: A type system that worries me, or makes me feel
uncomfortable
"""

According to this definition, I herefore declare that Python is strongly
typed and Java weakly typed !-)

(sorry, couldn't resist).

More seriously, it's indeed an interesting article - even if I do not
necessarily share all the views of the author - for those not knowing
anything about type systems. But it's clearly a bit oriented and IMHO
fails to present the pros of dynamic typing.

BTW, if I may insert another quote, that I think is relevant here as
well as in another recent thread about 'typed' containers in Python:
"""
I find it amusing when novice programmers believe their main job is
preventing programs from crashing. I imagine this spectacular failure
argument wouldn't be so appealing to such a programmer. More
experienced programmers realize that correct code is great, code that
crashes could use improvement, but incorrect code that doesn't crash is
a horrible nightmare.
"""
I wouldn't consider the aficionados of those dinosaur languages

Hmmm... For a dinausor, C seems well alive. Can you remind me which
language is used to implement CPython and most of actual operating
systems and low-level libraries ?
to be
authorities on such a question.

If you mean that most them aren't necessarily great CS theorists, then
you may be right. OTHO, they do have some practical experience with
these languages, so they might have something to say...
 
P

Paddy

Paul Rubin a écrit :
[A type system is a] tractable syntactic method for proving the
absence of certain program behaviors by classifying phrases
according to the kinds of values they compute. (Pierce 2002)."
Is this supposed to contradict my assertion that *static* typing is
for compilers ?
Yes, the main benefit these days is to prove the absence of certain
types of bugs in the program.

As someone said, if declaring types thrices was enough to ensure
correctness, I'd happily do so.

I still maintain that the primary *practical* reason behind static
typing is to provide optimization clues for the compiler.

The primary *practical* reason for static typing is that it allows
large software companies to convince customers that they have *the*
method to allow them to apply divide & conquer techniques to solve
their problems with a large team of programmers and justifying
large fees.

How many of those cancelled UK government software projects that
cost me hundreds of millions of pounds were programmed by people
espousing the greater safety of their static typing?

- Paddy.
 
A

Alex Martelli

Bruno Desthuilliers said:
I'm afraid I didn't get the joke... Are you saying that C is a rather,
well, primitive language ?

The joke's just based on the fact that (based on DNA analysis) birds are
said to be dinosaurs, and are definitely "well alive":).


Alex
 
B

Bruno Desthuilliers

Alex Martelli a écrit :
It's definitely a helpful aspect, yes -- given that compilers able to
infer types are still not very common for widely used languages;

or given that languages using a type-inferenced based system are not
very widely used...

(snip)
That compiler, I believe, would violate the ISO standard for C (so
calling it a "C compiler" would be about as correct as calling it a
banana, in my view:).

Lol. That being said, there were bananas - oops, I meant C compilers -
before the standard existed !-)
I like a quote by Knuth -- "beware this program may have bugs as I have
only proven it and not tested it":)
Yeps.


So do chickens.
I'm afraid I didn't get the joke... Are you saying that C is a rather,
well, primitive language ?
 
B

Bruno Desthuilliers

Diez B. Roggisch a écrit :
That's simply not true. The problem hadn't to do with typing - it was a
overflow due to larger input quantities.

cf below.
It had been shown for the
Ariane 4 that this overrun could never happen - by whatever thechnique,
operational or denotational semanticse, I don't know.

IIRC it was in the specs.
For the ariane 5, these input constraints didn't hold, which caused the
unexpected runtime error to occur.

"""
Because of the different flight path, a data conversion from a 64-bit
floating point to 16-bit signed integer value caused a hardware
exception (more specifically, an arithmetic overflow, as the floating
point number had a value too large to be represented by a 16-bit signed
integer).
"""

As far as I'm concerned, it surely qualifies as a runtime type error -
"data conversion from a floating point to a 16-bit signed int" should
not be allowed when unsafe, isn't it ?

"""
Efficiency considerations had led to the disabling of the software
handler (in Ada code) for this error trap.
"""

Which implies that even in ADA, runtime type errors are in fact expected
- else there would be no handler for such a case.

The root of the problem is - of course - not technical but human. As you
said, no one cared to write the appropriate unit tests to ensure this
module - specified for Ariane 4 - could be reused 'as is' for Ariane 5.
But what, how could an ADA module not be correct if it compiles - the
ADA type system is here to "prove the absence of certain bugs", isn't it ?-)
 
D

Diez B. Roggisch

"""
Because of the different flight path, a data conversion from a 64-bit
floating point to 16-bit signed integer value caused a hardware
exception (more specifically, an arithmetic overflow, as the floating
point number had a value too large to be represented by a 16-bit signed
integer).
"""

As far as I'm concerned, it surely qualifies as a runtime type error -
"data conversion from a floating point to a 16-bit signed int" should
not be allowed when unsafe, isn't it ?

I wouldn't say so. The conversion is a partial function. It _has_ to be
a partial function, as you can't cram 64 bit into 16 without losses. If
you could, infinite compression would be possible.

So - you _have_ to allow such a conversion. That has nothing to do with
types, the types were proper. The values weren't.

"""
Efficiency considerations had led to the disabling of the software
handler (in Ada code) for this error trap.
"""

Which implies that even in ADA, runtime type errors are in fact expected
- else there would be no handler for such a case.

Well, yes, runtime errors occur - in statically typed languages as well.
That's essentially the halting-problem.

> But what, how could an ADA module not be correct if it compiles - the
> ADA type system is here to "prove the absence of certain bugs", isn't
> it ?-)


Yes, certain bugs. Not those though. In the same sense as the python
compiler pukes statically on me if I write

def f():
n = x * 2
x = n


The whole point of the Ariane failure was that nobody believed in the
code because the type analyzer had woven it through - but because the
specs and a mathematical analysis of the code had shown it was to be
trusted. For the old rocket, that was.

The question is not if static typing that prevents certain errors is a
bad thing. It's not. But it comes with a pricetag - the lack of
flexibility. And usually, I'm not willing to pay that price, because it
makes my whole design much more cumbersome and thus often error-prone -
as line numbers increase.

But in a constrained environment like the ariane, where you have limited
resources, you want as much certainity as you can get, together with
operations that run on the native types of your processor in an
efficient way.


Diez
 
D

Donn Cave

"Dynamic typing is recommended", they conclude, "when programs must be
as flexible as possible". I recommend reading the Agile Manifesto to
understand why maximal flexibility is crucial in most real-world
application programming -- and therefore why, in said real world rather
than in the more academic circles Dr. Van Roy and Dr. Hadidi move in,
dynamic typing is generally preferable, and not such a tiny issue as
they make the difference to be.

I guess there may be more than one kind of flexibility. The language
I fool around with sometimes that has strong static typing is Haskell.
Though a relatively elementary Haskell programmer (the learning curve
with this language is something you would have to experience to believe),
I feel that the type checking actually helps me program faster.
The compiler's check for structural correctness is after all for my
benefit, and expedites development and maintenance of code, in my
limited experience. The more extensive my changes, the more useful
the type checking is - I'm much more casual about significant code
revision when writing in Haskell, somewhat more casual when writing
in C, and worried when writing Python.

This is the kind of flexibility where you make significant changes
to something, but the result is as structurally consistent as it
would have been if written that way from the start. I have also
seen the kind of flexibility where you use expedient hacks to make
changes with relatively small amounts of code, and I've seen it in
Python applications. It's flexibility when you're doing it, but
it paradoxically causes rigidity as the hacks create more points
of articulation and more things that aren't obvious to the person
making the changes. If that's flexibility, you can have it.

Donn Cave, (e-mail address removed)
 
S

Steve Holden

Donn said:
I guess there may be more than one kind of flexibility. The language
I fool around with sometimes that has strong static typing is Haskell.
Though a relatively elementary Haskell programmer (the learning curve
with this language is something you would have to experience to believe),
I feel that the type checking actually helps me program faster.
The compiler's check for structural correctness is after all for my
benefit, and expedites development and maintenance of code, in my
limited experience. The more extensive my changes, the more useful
the type checking is - I'm much more casual about significant code
revision when writing in Haskell, somewhat more casual when writing
in C, and worried when writing Python.

This is the kind of flexibility where you make significant changes
to something, but the result is as structurally consistent as it
would have been if written that way from the start. I have also
seen the kind of flexibility where you use expedient hacks to make
changes with relatively small amounts of code, and I've seen it in
Python applications. It's flexibility when you're doing it, but
it paradoxically causes rigidity as the hacks create more points
of articulation and more things that aren't obvious to the person
making the changes. If that's flexibility, you can have it.
Indeed you describe an arthritic design quite well, but I don't think
it's fair to single Python out as a potential problem. As we have known
for a long time you can write unstructured code in almost any language,
and you can do structured programming in almost any language given
discipline.

I certainly agree that if the programmer shows insufficient discipline
the results will likely be bad, but in that light Haskell is really the
ultimate bondage language. Some of us don't like to be tied that tightly.

I don't feel the same trepidation you appear to do when refactoring
Python code. I suppose I might say that in my experience Python allows
you to appreciate a better-engineered solution more easily, and so it
tends to encourage better engineering.

In some ways C# is quite Python-like, and I am beginning to enjoy
writing it from time to time, but when you are dealing with amorphous
collections the casting and conversions can drive you almost insane. And
since the collections are ultimately collections of Object, none of it
actually gets you any nearer your programming goal.

regards
Steve
--
Steve Holden +1 571 484 6266 +1 800 494 3119
Holden Web LLC/Ltd http://www.holdenweb.com
Skype: holdenweb http://del.icio.us/steve.holden
--------------- Asciimercial ------------------
Get on the web: Blog, lens and tag the Internet
Many services currently offer free registration
----------- Thank You for Reading -------------
 
A

Alex Martelli

Donn Cave said:
I guess there may be more than one kind of flexibility. The language
I fool around with sometimes that has strong static typing is Haskell.
Though a relatively elementary Haskell programmer (the learning curve
with this language is something you would have to experience to believe),

I do have (some of:) that experience, and am reasonably at ease in
Haskell (except when it comes to coding monads, which I confess I still
have trouble wrapping my head around).
I feel that the type checking actually helps me program faster.
The compiler's check for structural correctness is after all for my
benefit, and expedites development and maintenance of code, in my
limited experience. The more extensive my changes, the more useful
the type checking is - I'm much more casual about significant code
revision when writing in Haskell, somewhat more casual when writing
in C, and worried when writing Python.

Eckel's and Martin's well-known essays on why good testing can replace
strict static type checking:
<http://www.mindview.net/WebLog/log-0025>
<http://www.artima.com/weblogs/viewpost.jsp?thread=4639>

Me, I'm always worried about significant code revision _unless I have
good tests in place_. Strict static typechecks catch only a small
subset of frequent mistakes -- good tests catch a far higher quota.
Typechecks do catch some mistakes "faster", but, in my experience on
today's machines, that tiny difference is becoming insignificant,
particularly when you consider that typechecks typically require
whole-program analysis while, as Van Roy and Haridi point out, dynamic
typing affords "totally open coding".


Alex
 
J

John Nagle

Alex said:
I do have (some of:) that experience, and am reasonably at ease in
Haskell (except when it comes to coding monads, which I confess I still
have trouble wrapping my head around).




Eckel's and Martin's well-known essays on why good testing can replace
strict static type checking:
<http://www.mindview.net/WebLog/log-0025>
<http://www.artima.com/weblogs/viewpost.jsp?thread=4639>

He's all over the place in that article. He really isn't talking
about strong typing at all. What he does make a case
for is dispatch by name without inheritance, or "duck typing".
But that, in fact, is a form of strong type checking. The effect is
as if "object" had an abstract function for every member function
in the whole program. (And, in fact, in Python you pay exactly the
dispatch cost that would take.)

The problem is that in both C++ and Java, the first round
of the type system was botched. C++ originally had neither
generics nor checked downcasting (a la "dynamic_cast").
Java originally lacked generics. Both languages added those
as bolt-ons, and it shows.

But, again, this really isn't a Python issue.

John Nagle
 
P

Paul Rubin

I do have (some of:) that experience, and am reasonably at ease in
Haskell (except when it comes to coding monads, which I confess I still
have trouble wrapping my head around).

I recently found the article

http://en.wikibooks.org/wiki/Haskell/Category_theory

which had (for me anyway) a far more comprehensible explanation of
monads than anything I ever saw about Haskell programming. Don't be
scared by the title--the article is very readable. It's much clearer
than many Haskell tutorials I've seen, whose monad explanations simply
wouldn't fit in my mind, with weird analogies about robots handling
nuclear waste in containers moving around on conveyor belts, etc. I
think right now I could write an explanation of monads understandable
by any well-versed Python programmer (it would be based on showing the
parallels between Python's list type and Haskell's List monad, then
moving onto sequencing with the Maybe monad, instead of trying to
start by explaining Haskell I/O), so maybe I'll try to do that
sometime.
Eckel's and Martin's well-known essays on why good testing can replace
strict static type checking:
<http://www.mindview.net/WebLog/log-0025>
<http://www.artima.com/weblogs/viewpost.jsp?thread=4639>

Those are pretty unpersuasive since they're based on Java and C++.
Eckel's example would have been much easier in Haskell, I think.

Did you look at Tim Sweeney's presentation "The Next Mainstream
Programming Language: A Game Developer's Perspective"? I wonder what
you thought of it. It's here:

Powerpoint version:
http://www.cs.princeton.edu/~dpw/popl/06/Tim-POPL.ppt

PDF version:
http://www.st.cs.uni-sb.de/edu/seminare/2005/advanced-fp/docs/sweeny.pdf

He advocates a mixed functional/procedural language with even fancier
static types than Haskell.
Me, I'm always worried about significant code revision _unless I have
good tests in place_. Strict static typechecks catch only a small
subset of frequent mistakes -- good tests catch a far higher quota.

It seems to me that the typecheck is sort of like a test that the
compiler provides for you automatically. You still have to write
tests of your own, but not as many. Also, Python-style unit tests
usually are written for fairly small pieces of code. They usually
don't manage to cover every way that data can flow through a program.
E.g. your program might pass its test and run properly for years
before some weird piece of input data causes some regexp to not quite
work. It then hands None to some function that expects a string, and
the program crashes with a runtime type error. Static typechecking
makes sure that a function expecting a string can never ever receive
None.

I also sometimes have trouble figuring out how to write useful tests,
though maybe there's some understanding that I haven't yet grokked.
However, a lot of my programs crawl the filesystem, retrieve things
over the web, etc. It's hard to make any meaningful tests
self-contained. Last week I needed to write a 20-line Python function
that used os.walk to find all filenames of a certain format in a
certain directory tree and bundle them up in a particular way. The
main debugging hassle was properly understanding the output format of
os.walk. A static type signature for os.walk, checked against my
program, would have taken care of that immediately. Once I got the
function to work, I deployed it without writing permanent tests for
it. An actual self-contained test would have required making some
subdirectories with the right layout before running the function.
Writing a test script that really did that would have taken 10x as
long as writing the function took, and such a complex test would have
needed its own tests (I'd have probably used something like dejagnu).

For functions that simply transform data, I've been enjoying using
doctest, but for functions like the above os.walk thing, I'm not sure
what to do. I'd be happy to receive advice, of course.
Typechecks do catch some mistakes "faster", but, in my experience on
today's machines, that tiny difference is becoming insignificant,
particularly when you consider that typechecks typically require
whole-program analysis while, as Van Roy and Haridi point out, dynamic
typing affords "totally open coding".

I don't know if this holds in Haskell, but at least in C, the compiler
could usually find several errors in one pass, while dynamic types
often mean running the program, seeing some function crash from
getting None instead of a string, figuring out and fixing the error,
running again, getting a similar crash in a different place, and
repeating all the above several times.

Lately I've been looking at a somewhat highbrow book on programming
language theory:

http://www.cs.cmu.edu/~rwh/plbook/book.pdf

I don't understand that much of it, but the parts I can make any sense
of are giving me a better picture of what PL designers these days
think about. It's really nothing like how it was in the 1970's.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,778
Messages
2,569,605
Members
45,238
Latest member
Top CryptoPodcasts

Latest Threads

Top