Bruce.です。
あえて脱線してみます。
Rubyの場合、
static VALUE
rb_file_readable_p(VALUE obj, VALUE fname)
{
のように VALUE という型(構造体(へのポインタ))がRubyにおけるオブジェクトの
表現に使われるものですが、
Pythonだと
PyObject *
PyLong_FromLong(long ival)
に出てくるようなPyObjectがそれにあたるようです。
とはいうものの、今回初めて比較してみたのですが(Rubyは結構読んだけど
Pythonは必要なところの操作ルーチンだけでこの辺の定義はスルーしてました)
んで、Rubyが
#if SIZEOF_LONG == SIZEOF_VOIDP
typedef unsigned long VALUE;
typedef unsigned long ID;
といういたって単純なもの(ただし↓のようなものが陰に隠れている)
struct RObject {
struct RBasic basic;
union {
struct {
long numiv;
VALUE *ivptr;
struct st_table *iv_index_tbl; /* shortcut for RCLASS_IV_INDEX_TBL(rb_obj_class(obj)) */
} heap;
VALUE ary[ROBJECT_EMBED_LEN_MAX];
} as;
};
それに対してPythonでは
typedef struct _object {
PyObject_HEAD
} PyObject;
/* PyObject_HEAD defines the initial segment of every PyObject. */
#define PyObject_HEAD \
_PyObject_HEAD_EXTRA \
Py_ssize_t ob_refcnt; \
struct _typeobject *ob_type;
typedef struct _typeobject {
PyObject_VAR_HEAD
const char *tp_name; /* For printing, in format "<module>.<name>" */
Py_ssize_t tp_basicsize, tp_itemsize; /* For allocation */
/* Methods to implement standard operations */
(略)
/* Method suites for standard classes */
(略)
/* More standard operations (here for binary compatibility) */
(略)
/* Functions to access object as input/output buffer */
PyBufferProcs *tp_as_buffer;
/* Flags to define presence of optional/expanded features */
long tp_flags;
const char *tp_doc; /* Documentation string */
/* Assigned meaning in release 2.0 */
/* call function for all accessible objects */
traverseproc tp_traverse;
/* delete references to contained objects */
inquiry tp_clear;
/* Assigned meaning in release 2.1 */
/* rich comparisons */
richcmpfunc tp_richcompare;
/* weak reference enabler */
Py_ssize_t tp_weaklistoffset;
/* Added in release 2.2 */
/* Iterators */
getiterfunc tp_iter;
iternextfunc tp_iternext;
/* Attribute descriptor and subclassing stuff */
(略)
} PyTypeObject;
とだいぶ趣が違いますね。
#いやーこんなに違うとは思いませんでした。
どっちがいいとか悪いとか云う話ではありませんので念のため。
しまった、短整数をどう扱っているかを確かめてない(笑)