Some stupid mechanical changes, such as remove trailing whitespace,

double spaces between sentences.  Also fix a few typos, add an XXX
note, and change the URL for the implementation to be the patch
detail page instead of the download page.

I hope Neil doesn't mind.
This commit is contained in:
Guido van Rossum 2000-12-12 02:00:37 +00:00
parent a2abf8d660
commit 633ca5bb61
1 changed files with 62 additions and 61 deletions

View File

@ -20,10 +20,10 @@ Abstract
indicate it by returning a new singleton object. Types which do not
set the type flag are handled in a backwards compatible manner.
Allowing operations handle different types is often simpler, more
flexible, and faster then having the interpreter do coercion.
flexible, and faster than having the interpreter do coercion.
Rational
Rationale
When implementing numeric or other related operations, it is often
desirable to provide not only operations between operands of one type
@ -32,7 +32,7 @@ Rational
A common approach to this mixed type situation is to provide a method
of "lifting" the operands to a common type (coercion) and then use
that type's operand method as execution mechanism. Yet, this strategy
that type's operand method as execution mechanism. Yet, this strategy
has a few drawbacks:
* the "lifting" process creates at least one new (temporary)
@ -50,10 +50,10 @@ Rational
A fix for this situation is obviously needed, since these drawbacks
make implementations of types needing these features very cumbersome,
if not impossible. As an example, have a look at the DateTime and
if not impossible. As an example, have a look at the DateTime and
DateTimeDelta[1] types, the first being absolute, the second
relative. You can always add a relative value to an absolute one,
giving a new absolute value. Yet, there is no common type which the
giving a new absolute value. Yet, there is no common type which the
existing coercion mechanism could use to implement that operation.
Currently, PyInstance types are treated specially by the interpreter
@ -66,7 +66,7 @@ Rational
Specification
Instead of using a central coercion method, the process of handling
different operand types is simply left to the operation. If the
different operand types is simply left to the operation. If the
operation finds that it cannot handle the given operand type
combination, it may return a special singleton as indicator.
@ -77,7 +77,7 @@ Specification
To maintain nearly 100% backward compatibility we have to be very
careful to make numbers that don't know anything about the new
strategy (old style numbers) work just as well as those that expect
the new scheme (new style numbers). Furthermore, binary compatibility
the new scheme (new style numbers). Furthermore, binary compatibility
is a must, meaning that the interpreter may only access and use new
style operations if the number indicates the availability of these.
@ -85,28 +85,28 @@ Specification
only it it sets the type flag Py_TPFLAGS_NEWSTYLENUMBER. The main
difference between an old style number and a new style one is that the
numeric slot functions can no longer assume to be passed arguments of
identical type. New style slots must check all arguments for proper
type and implement the necessary conversions themselves. This may seem
identical type. New style slots must check all arguments for proper
type and implement the necessary conversions themselves. This may seem
to cause more work on the behalf of the type implementor, but is in
fact no more difficult than writing the same kind of routines for an
old style coercion slot.
If a new style slot finds that it cannot handle the passed argument
type combination, it may return a new reference of the special
singleton Py_NotImplemented to the caller. This will cause the caller
singleton Py_NotImplemented to the caller. This will cause the caller
to try the other operands operation slots until it finds a slot that
does implement the operation for the specific type combination. If
does implement the operation for the specific type combination. If
none of the possible slots succeed, it raises a TypeError.
To make the implementation easy to understand (the whole topic is
esoteric enough), a new layer in the handling of numeric operations is
introduced. This layer takes care of all the different cases that need
introduced. This layer takes care of all the different cases that need
to be taken into account when dealing with all the possible
combinations of old and new style numbers. It is implemented by the
two functions _PyNumber_BinaryOperation() and
_PyNumber_TernaryOperation(), which both are internal functions that
only the functions in Objects/abstract.c have access to. The numeric
API (PyNumber_*) is easy to adapt to this new layer.
combinations of old and new style numbers. It is implemented by the
two static functions binary_op() and ternary_op(), which are both
internal functions that only the functions in Objects/abstract.c
have access to. The numeric API (PyNumber_*) is easy to adapt to
this new layer.
As a side-effect all numeric slots can be NULL-checked (this has to be
done anyway, so the added feature comes at no extra cost).
@ -124,8 +124,8 @@ Specification
The indicated action sequence is executed from left to right until
either the operation succeeds and a valid result (!=
Py_NotImplemented) is returned or an exception is raised. Exceptions
are returned to the calling function as-is. If a slot returns
Py_NotImplemented) is returned or an exception is raised. Exceptions
are returned to the calling function as-is. If a slot returns
Py_NotImplemented, the next item in the sequence is executed.
Note that coerce(v,w) will use the old style nb_coerce slot methods
@ -159,8 +159,8 @@ Specification
Note that the numeric protocol is also used for some other related
tasks, e.g. sequence concatenation. These can also benefit from the
new mechanism by implementing right-hand operations for type
combinations that would otherwise fail to work. As an example, take
string concatenation: currently you can only do string + string. With
combinations that would otherwise fail to work. As an example, take
string concatenation: currently you can only do string + string. With
the new mechanism, a new string-like type could implement new_type +
string and string + new_type, even though strings don't know anything
about new_type.
@ -172,26 +172,27 @@ Specification
PyObject *nb_cmp(PyObject *v, PyObject *w)
This slot should compare the two objects and return an integer object
stating the result. Currently, this result integer may only be -1, 0,
stating the result. Currently, this result integer may only be -1, 0,
1. If the slot cannot handle the type combination, it may return a
reference to Py_NotImplemented. Note that this slot is still in flux
since it should take into account rich comparisons (ie. PEP 207).
reference to Py_NotImplemented. [XXX Note that this slot is still
in flux since it should take into account rich comparisons
(i.e. PEP 207).]
Numeric comparisons are handled by a new numeric protocol API:
PyObject *PyNumber_Compare(PyObject *v, PyObject *w)
This function compare the two objects as "numbers" and return an
integer object stating the result. Currently, this result integer may
only be -1, 0, 1. In case the operation cannot be handled by the given
integer object stating the result. Currently, this result integer may
only be -1, 0, 1. In case the operation cannot be handled by the given
objects, a TypeError is raised.
The PyObject_Compare() API needs to adjusted accordingly to make use
of this new API.
Other changes include adapting some of the built-in functions (e.g.
cmp()) to use this API as well. Also, PyNumber_CoerceEx() will need to
check for new style numbers before calling the nb_coerce slot. New
cmp()) to use this API as well. Also, PyNumber_CoerceEx() will need to
check for new style numbers before calling the nb_coerce slot. New
style numbers don't provide a coercion slot and thus cannot be
explicitly coerced.
@ -216,7 +217,7 @@ Copyright
References
[1] http://www.lemburg.com/files/python/mxDateTime.html
[2] http://sourceforge.net/patch/download.php?id=102652
[2] http://sourceforge.net/patch/?func=detailpatch&patch_id=102652&group_id=5470
[3] http://www.lemburg.com/files/python/CoercionProposal.html