--- /dev/null
+/*
+ TM_Array.c
+ Topology: Contiguous Memory (Linear)
+ Backing: PyListObject
+*/
+
+/* ALLOW CDOT IN IDENTIFIERS */
+#define · _
+
+#define PY_SSIZE_T_CLEAN
+#include <Python.h>
+#include "structmember.h"
+
+/* --- 1. HEAD STRUCT (Linear Array) --- */
+
+typedef struct {
+ PyObject_HEAD
+ PyObject* tape_obj; /* Variable: The Container */
+ PyObject** head_ptr; /* Variable: Pointer to Current Cell */
+ PyObject** leftmost_ptr; /* Variable: Pointer to Leftmost Cell */
+ PyObject** right_sentinel;/* Variable: Pointer to Right Sentinel */
+} TM·Arr·Head;
+
+static void TM·Arr·dealloc(TM·Arr·Head* self){
+ Py_XDECREF(self->tape_obj);
+ Py_TYPE(self)->tp_free((PyObject*)self);
+}
+
+static int TM·Arr·init(TM·Arr·Head* self, PyObject* args, PyObject* kwds){
+ PyObject* input_obj = NULL;
+ if( !PyArg_ParseTuple(args, "O", &input_obj) ) return -1;
+
+ if( !PyList_Check(input_obj) ){
+ PyErr_SetString(PyExc_TypeError, "TM_Array requires a Python List.");
+ return -1;
+ }
+ if (PyList_Size(input_obj) == 0) {
+ PyErr_SetString(PyExc_ValueError, "TM cannot be empty.");
+ return -1;
+ }
+
+ self->tape_obj = input_obj;
+ Py_INCREF(self->tape_obj);
+
+ Py_ssize_t len = PyList_GET_SIZE(self->tape_obj);
+ PyObject** items = ((PyListObject*)self->tape_obj)->ob_item;
+
+ self->leftmost_ptr = items;
+ self->right_sentinel = items + len;
+ self->head_ptr = items;
+
+ return 0;
+}
+
+/* --- 2. HELPERS --- */
+
+static void TM·Arr·sync(TM·Arr·Head* self){
+ Py_ssize_t offset = self->head_ptr - self->leftmost_ptr;
+ Py_ssize_t len = PyList_GET_SIZE(self->tape_obj);
+ PyObject** new_items = ((PyListObject*)self->tape_obj)->ob_item;
+
+ self->leftmost_ptr = new_items;
+ self->right_sentinel = new_items + len;
+ self->head_ptr = self->leftmost_ptr + offset;
+}
+
+static inline void TM·Arr·lazysync(TM·Arr·Head* self){
+ Py_ssize_t known_len = self->right_sentinel - self->leftmost_ptr;
+ Py_ssize_t actual_len = PyList_GET_SIZE(self->tape_obj);
+ if (known_len != actual_len) {
+ TM·Arr·sync(self);
+ }
+}
+
+/* --- 3. PRIMITIVES: NAVIGATION --- */
+
+static PyObject* TM·Arr·s(TM·Arr·Head* self){
+ TM·Arr·lazysync(self);
+ self->head_ptr++;
+ Py_RETURN_NONE;
+}
+
+static PyObject* TM·Arr·Ls(TM·Arr·Head* self){
+ TM·Arr·lazysync(self);
+ self->head_ptr--;
+ Py_RETURN_NONE;
+}
+
+static PyObject* TM·Arr·sn(TM·Arr·Head* self, PyObject* args){
+ TM·Arr·lazysync(self);
+ Py_ssize_t n; if(!PyArg_ParseTuple(args, "n", &n)) return NULL;
+ self->head_ptr += n;
+ Py_RETURN_NONE;
+}
+
+static PyObject* TM·Arr·Lsn(TM·Arr·Head* self, PyObject* args){
+ TM·Arr·lazysync(self);
+ Py_ssize_t n; if(!PyArg_ParseTuple(args, "n", &n)) return NULL;
+ self->head_ptr -= n;
+ Py_RETURN_NONE;
+}
+
+static PyObject* TM·Arr·sR(TM·Arr·Head* self){
+ TM·Arr·lazysync(self);
+ self->head_ptr = self->right_sentinel - 1;
+ Py_RETURN_NONE;
+}
+
+static PyObject* TM·Arr·LsR(TM·Arr·Head* self){
+ TM·Arr·lazysync(self);
+ self->head_ptr = self->leftmost_ptr;
+ Py_RETURN_NONE;
+}
+
+/* --- 4. PRIMITIVES: ENTANGLEMENT --- */
+
+static PyObject* TM·Arr·e(TM·Arr·Head* self){
+ TM·Arr·lazysync(self);
+ PyTypeObject* type = Py_TYPE(self);
+ TM·Arr·Head* new_tm = (TM·Arr·Head*)type->tp_alloc(type, 0);
+ if (!new_tm) return NULL;
+
+ new_tm->tape_obj = self->tape_obj;
+ Py_INCREF(new_tm->tape_obj);
+
+ new_tm->leftmost_ptr = self->leftmost_ptr;
+ new_tm->right_sentinel = self->right_sentinel;
+ new_tm->head_ptr = self->head_ptr;
+
+ return (PyObject*)new_tm;
+}
+
+/* --- 5. PRIMITIVES: I/O --- */
+
+static PyObject* TM·Arr·r(TM·Arr·Head* self){
+ TM·Arr·lazysync(self);
+ PyObject* item = *self->head_ptr;
+ Py_INCREF(item);
+ return item;
+}
+
+static PyObject* TM·Arr·w(TM·Arr·Head* self, PyObject* val){
+ TM·Arr·lazysync(self);
+ PyObject* old = *self->head_ptr;
+ Py_INCREF(val);
+ *self->head_ptr = val;
+ Py_DECREF(old);
+ Py_RETURN_NONE;
+}
+
+/* --- 6. PRIMITIVES: QUERY --- */
+
+static PyObject* TM·Arr·qR(TM·Arr·Head* self){
+ TM·Arr·lazysync(self);
+ if(self->head_ptr >= self->right_sentinel - 1) Py_RETURN_TRUE;
+ Py_RETURN_FALSE;
+}
+
+static PyObject* TM·Arr·LqR(TM·Arr·Head* self){
+ TM·Arr·lazysync(self);
+ if(self->head_ptr <= self->leftmost_ptr) Py_RETURN_TRUE;
+ Py_RETURN_FALSE;
+}
+
+static PyObject* TM·Arr·qnR(TM·Arr·Head* self){
+ TM·Arr·lazysync(self);
+ Py_ssize_t count = (self->right_sentinel - self->head_ptr) - 1;
+ return PyLong_FromSsize_t(count);
+}
+
+static PyObject* TM·Arr·LqnR(TM·Arr·Head* self){
+ TM·Arr·lazysync(self);
+ Py_ssize_t count = self->head_ptr - self->leftmost_ptr;
+ return PyLong_FromSsize_t(count);
+}
+
+/* --- 7. DESTRUCTIVE (SO Only) --- */
+
+static PyObject* TM·Arr·dR(TM·Arr·Head* self){
+ TM·Arr·lazysync(self);
+ /* Guard: Must have a left neighbor to step back to. */
+ if (self->head_ptr <= self->leftmost_ptr) {
+ PyErr_SetString(PyExc_RuntimeError, "Invariant Violation: Cannot dR from leftmost cell.");
+ return NULL;
+ }
+ Py_ssize_t idx = self->head_ptr - self->leftmost_ptr;
+ Py_ssize_t len = PyList_GET_SIZE(self->tape_obj);
+
+ if (PyList_SetSlice(self->tape_obj, idx, len, NULL) < 0) return NULL;
+
+ self->head_ptr--;
+ TM·Arr·sync(self);
+ Py_RETURN_NONE;
+}
+
+static PyObject* TM·Arr·LdR(TM·Arr·Head* self){
+ TM·Arr·lazysync(self);
+ /* Guard: Must have a right neighbor to reset to. */
+ if (self->head_ptr >= self->right_sentinel - 1) {
+ PyErr_SetString(PyExc_RuntimeError, "Invariant Violation: Cannot LdR from rightmost cell.");
+ return NULL;
+ }
+ Py_ssize_t idx = self->head_ptr - self->leftmost_ptr;
+
+ if (PyList_SetSlice(self->tape_obj, 0, idx+1, NULL) < 0) return NULL;
+
+ self->head_ptr = self->leftmost_ptr;
+ TM·Arr·sync(self);
+ Py_RETURN_NONE;
+}
+
+static PyObject* TM·Arr·esd(TM·Arr·Head* self){
+ TM·Arr·lazysync(self);
+ if (self->head_ptr >= self->right_sentinel - 1) {
+ PyErr_SetString(PyExc_IndexError, "esd: No right neighbor.");
+ return NULL;
+ }
+ Py_ssize_t idx = self->head_ptr - self->leftmost_ptr;
+ if (PyList_SetSlice(self->tape_obj, idx+1, idx+2, NULL) < 0) return NULL;
+ TM·Arr·sync(self);
+ Py_RETURN_NONE;
+}
+
+static PyObject* TM·Arr·eLsd(TM·Arr·Head* self){
+ TM·Arr·lazysync(self);
+ if (self->head_ptr <= self->leftmost_ptr) {
+ PyErr_SetString(PyExc_IndexError, "eLsd: No left neighbor.");
+ return NULL;
+ }
+ Py_ssize_t idx = self->head_ptr - self->leftmost_ptr;
+ if (PyList_SetSlice(self->tape_obj, idx-1, idx, NULL) < 0) return NULL;
+
+ self->head_ptr--;
+ TM·Arr·sync(self);
+ Py_RETURN_NONE;
+}
+
+static PyObject* TM·Arr·esa(TM·Arr·Head* self, PyObject* val){
+ TM·Arr·lazysync(self);
+ Py_ssize_t idx = self->head_ptr - self->leftmost_ptr;
+ if (PyList_Insert(self->tape_obj, idx+1, val) < 0) return NULL;
+ TM·Arr·sync(self);
+ Py_RETURN_NONE;
+}
+
+static PyObject* TM·Arr·eLsa(TM·Arr·Head* self, PyObject* val){
+ TM·Arr·lazysync(self);
+ Py_ssize_t idx = self->head_ptr - self->leftmost_ptr;
+ if (PyList_Insert(self->tape_obj, idx, val) < 0) return NULL;
+ self->head_ptr++;
+ TM·Arr·sync(self);
+ Py_RETURN_NONE;
+}
+
+static PyObject* TM·Arr·aR(TM·Arr·Head* self, PyObject* val){
+ if (PyList_Append(self->tape_obj, val) < 0) return NULL;
+ TM·Arr·sync(self);
+ Py_RETURN_NONE;
+}
+
+static PyObject* TM·Arr·LaR(TM·Arr·Head* self, PyObject* val){
+ if (PyList_Insert(self->tape_obj, 0, val) < 0) return NULL;
+ self->head_ptr++;
+ TM·Arr·sync(self);
+ Py_RETURN_NONE;
+}
/*
TM_module.c
CPython Extension: Tape Machine Factory
-
- Implements:
- - 60 Concrete Machine Types (Chiral naming: CR/CLR)
- - TMA_NaturalNumber (Abstract Machine)
-
- Namespaces:
- - TM·Head : The Universal Head State struct.
- - TM·Arr· : Implementation logic for Array/List backed machines.
- - TM·Nat· : Implementation logic for the Abstract Natural Number machine.
+ Aggregates implementations for Array, Graph, and Abstract topologies.
*/
-/* 1. COMPILER COMPATIBILITY */
-// #define · _
+/* ALLOW CDOT IN IDENTIFIERS */
+#define · _
-#define PY_SSIZE_T_CLEAN
+/* Shared Includes */
#include <Python.h>
-#include "structmember.h"
-
-/* ========================================================= */
-/* UNIVERSAL HEAD STATE */
-/* ========================================================= */
-
-typedef struct{
- PyObject_HEAD
- PyObject* tape_obj; /* The Container */
- void* head_ptr; /* Generic Pointer to Current Item */
- void* start_ptr; /* Generic Pointer to Start */
- void* end_ptr; /* Generic Pointer to End/Sentinel */
-} TM·Head;
-
-static void TM·Head·dealloc(TM·Head* self){
- Py_XDECREF(self->tape_obj);
- Py_TYPE(self)->tp_free((PyObject*)self);
-}
-
-/* ========================================================= */
-/* IMPLEMENTATION: ARRAY BACKED (TM·Arr·) */
-/* ========================================================= */
-
-/* --- Helpers --- */
-static int TM·Arr·init(TM·Head* self, PyObject* args, PyObject* kwds){
- PyObject* input_obj = NULL;
- if( !PyArg_ParseTuple(args, "O", &input_obj) ) return -1;
-
- if( !PyList_Check(input_obj) ){
- PyErr_SetString(PyExc_TypeError, "This implementation requires a Python List.");
- return -1;
- }
- if (PyList_Size(input_obj) == 0) {
- PyErr_SetString(PyExc_ValueError, "TM cannot be empty.");
- return -1;
- }
-
- self->tape_obj = input_obj;
- Py_INCREF(self->tape_obj);
-
- /* Initialize Pointers */
- Py_ssize_t len = PyList_GET_SIZE(self->tape_obj);
- PyObject** items = ((PyListObject*)self->tape_obj)->ob_item;
-
- self->start_ptr = (void*)items;
- self->end_ptr = (void*)(items + len);
- self->head_ptr = (void*)items;
-
- return 0;
-}
-
-static void TM·Arr·sync(TM·Head* self){
- Py_ssize_t byte_offset = self->head_ptr - self->start_ptr;
- Py_ssize_t len = PyList_GET_SIZE(self->tape_obj);
- PyObject** new_items = ((PyListObject*)self->tape_obj)->ob_item;
- self->start_ptr = (void*)new_items;
- self->end_ptr = (void*)(new_items + len);
- self->head_ptr = self->start_ptr + byte_offset;
-}
-
-static inline void TM·Arr·lazysync(TM·Head* self){
- Py_ssize_t known_len = (self->end_ptr - self->start_ptr) / sizeof(PyObject*);
- Py_ssize_t actual_len = PyList_GET_SIZE(self->tape_obj);
- if (known_len != actual_len) {
- TM·Arr·sync(self);
- }
-}
+/* Include Implementations */
+#include "TM_Array.c"
+#include "TM_GR.c"
+#include "TM_NaturalNumber.c"
-/* --- PRIMITIVES: NAVIGATION --- */
-
-static PyObject* TM·Arr·s(TM·Head* self){
- TM·Arr·lazysync(self);
- self->head_ptr += sizeof(PyObject*);
- Py_RETURN_NONE;
-}
-
-static PyObject* TM·Arr·Ls(TM·Head* self){
- TM·Arr·lazysync(self);
- self->head_ptr -= sizeof(PyObject*);
- Py_RETURN_NONE;
-}
-
-static PyObject* TM·Arr·sn(TM·Head* self, PyObject* args){
- TM·Arr·lazysync(self);
- Py_ssize_t n; if(!PyArg_ParseTuple(args, "n", &n)) return NULL;
- self->head_ptr += n * sizeof(PyObject*);
- Py_RETURN_NONE;
-}
-
-static PyObject* TM·Arr·Lsn(TM·Head* self, PyObject* args){
- TM·Arr·lazysync(self);
- Py_ssize_t n; if(!PyArg_ParseTuple(args, "n", &n)) return NULL;
- self->head_ptr -= n * sizeof(PyObject*);
- Py_RETURN_NONE;
-}
-
-static PyObject* TM·Arr·sR(TM·Head* self){
- TM·Arr·lazysync(self);
- self->head_ptr = self->end_ptr - sizeof(PyObject*);
- Py_RETURN_NONE;
-}
-
-static PyObject* TM·Arr·LsR(TM·Head* self){
- TM·Arr·lazysync(self);
- self->head_ptr = self->start_ptr;
- Py_RETURN_NONE;
-}
+/* --- METHOD TABLES (Graph) --- */
-/* --- PRIMITIVES: ENTANGLEMENT --- */
+/* Note: Graph machines implemented here are ND (Non-Destructive) for structure.
+ They allow 'w' (write value), but not 'd' (delete node). */
-static PyObject* TM·Arr·e(TM·Head* self){
- TM·Arr·lazysync(self);
- PyTypeObject* type = Py_TYPE(self);
- TM·Head* new_tm = (TM·Head*)type->tp_alloc(type, 0);
- if (!new_tm) return NULL;
-
- new_tm->tape_obj = self->tape_obj;
- Py_INCREF(new_tm->tape_obj);
-
- new_tm->start_ptr = self->start_ptr;
- new_tm->end_ptr = self->end_ptr;
- new_tm->head_ptr = self->head_ptr;
-
- return (PyObject*)new_tm;
-}
-
-/* --- PRIMITIVES: I/O --- */
-
-static PyObject* TM·Arr·r(TM·Head* self){
- TM·Arr·lazysync(self);
- PyObject* item = *(PyObject**)self->head_ptr;
- Py_INCREF(item);
- return item;
-}
-
-static PyObject* TM·Arr·w(TM·Head* self, PyObject* val){
- TM·Arr·lazysync(self);
- PyObject** p = (PyObject**)self->head_ptr;
- PyObject* old = *p;
- Py_INCREF(val);
- *p = val;
- Py_DECREF(old);
- Py_RETURN_NONE;
-}
-
-/* --- PRIMITIVES: QUERY --- */
-
-static PyObject* TM·Arr·qR(TM·Head* self){
- TM·Arr·lazysync(self);
- if(self->head_ptr >= self->end_ptr - sizeof(PyObject*)){
- Py_RETURN_TRUE;
- }
- Py_RETURN_FALSE;
-}
-
-static PyObject* TM·Arr·LqR(TM·Head* self){
- TM·Arr·lazysync(self);
- if(self->head_ptr <= self->start_ptr){
- Py_RETURN_TRUE;
- }
- Py_RETURN_FALSE;
-}
-
-static PyObject* TM·Arr·qnR(TM·Head* self){
- TM·Arr·lazysync(self);
- Py_ssize_t byte_diff = self->end_ptr - self->head_ptr;
- /* If at Rightmost, diff is 1 item size. Result 0. */
- Py_ssize_t count = (byte_diff / sizeof(PyObject*)) - 1;
- return PyLong_FromSsize_t(count);
-}
-
-static PyObject* TM·Arr·LqnR(TM·Head* self){
- TM·Arr·lazysync(self);
- Py_ssize_t byte_diff = self->head_ptr - self->start_ptr;
- /* If at Leftmost, diff is 0. Result 0. */
- Py_ssize_t count = byte_diff / sizeof(PyObject*);
- return PyLong_FromSsize_t(count);
-}
-
-/* --- PRIMITIVES: DESTRUCTIVE (SO Only) --- */
-
-static PyObject* TM·Arr·dR(TM·Head* self){
- TM·Arr·lazysync(self);
- /* Delete from Current to Rightmost (inclusive) */
- /* Guard: Must have a left neighbor to step back to. */
- if (self->head_ptr <= self->start_ptr) {
- PyErr_SetString(PyExc_RuntimeError, "Invariant Violation: Cannot dR from leftmost cell (tape would empty).");
- return NULL;
- }
- Py_ssize_t idx = (self->head_ptr - self->start_ptr) / sizeof(PyObject*);
- Py_ssize_t len = PyList_GET_SIZE(self->tape_obj);
-
- if (PyList_SetSlice(self->tape_obj, idx, len, NULL) < 0) return NULL;
-
- /* Current cell is gone. Step Left to valid neighbor. */
- self->head_ptr -= sizeof(PyObject*);
- TM·Arr·sync(self);
- Py_RETURN_NONE;
-}
-
-static PyObject* TM·Arr·LdR(TM·Head* self){
- TM·Arr·lazysync(self);
- /* Delete from Current to Leftmost (inclusive) */
- /* Guard: Must have a right neighbor to step 'right' (reset) to. */
- if (self->head_ptr >= self->end_ptr - sizeof(PyObject*)) {
- PyErr_SetString(PyExc_RuntimeError, "Invariant Violation: Cannot LdR from rightmost cell (tape would empty).");
- return NULL;
- }
- Py_ssize_t idx = (self->head_ptr - self->start_ptr) / sizeof(PyObject*);
-
- if (PyList_SetSlice(self->tape_obj, 0, idx+1, NULL) < 0) return NULL;
-
- /* Head resets to 0 (the element that was to the right of deleted chunk) */
- self->head_ptr = self->start_ptr;
- TM·Arr·sync(self);
- Py_RETURN_NONE;
-}
-
-static PyObject* TM·Arr·esd(TM·Head* self){
- TM·Arr·lazysync(self);
- if (self->head_ptr >= self->end_ptr - sizeof(PyObject*)) {
- PyErr_SetString(PyExc_IndexError, "esd: No right neighbor.");
- return NULL;
- }
- Py_ssize_t idx = (self->head_ptr - self->start_ptr) / sizeof(PyObject*);
- if (PyList_SetSlice(self->tape_obj, idx+1, idx+2, NULL) < 0) return NULL;
- TM·Arr·sync(self);
- Py_RETURN_NONE;
-}
-
-static PyObject* TM·Arr·eLsd(TM·Head* self){
- TM·Arr·lazysync(self);
- if (self->head_ptr <= self->start_ptr) {
- PyErr_SetString(PyExc_IndexError, "eLsd: No left neighbor.");
- return NULL;
- }
- Py_ssize_t idx = (self->head_ptr - self->start_ptr) / sizeof(PyObject*);
- if (PyList_SetSlice(self->tape_obj, idx-1, idx, NULL) < 0) return NULL;
-
- /* We removed item at idx-1. The item at idx is now at idx-1. */
- self->head_ptr -= sizeof(PyObject*);
- TM·Arr·sync(self);
- Py_RETURN_NONE;
-}
-
-static PyObject* TM·Arr·esa(TM·Head* self, PyObject* val){
- TM·Arr·lazysync(self);
- /* Insert after current (at idx+1) */
- Py_ssize_t idx = (self->head_ptr - self->start_ptr) / sizeof(PyObject*);
- if (PyList_Insert(self->tape_obj, idx+1, val) < 0) return NULL;
- TM·Arr·sync(self);
- Py_RETURN_NONE;
-}
-
-static PyObject* TM·Arr·eLsa(TM·Head* self, PyObject* val){
- TM·Arr·lazysync(self);
- /* Insert before current (at idx) */
- Py_ssize_t idx = (self->head_ptr - self->start_ptr) / sizeof(PyObject*);
- if (PyList_Insert(self->tape_obj, idx, val) < 0) return NULL;
-
- /* Current item shifts right to idx+1. Increment head to track it. */
- self->head_ptr += sizeof(PyObject*);
- TM·Arr·sync(self);
- Py_RETURN_NONE;
-}
-
-static PyObject* TM·Arr·aR(TM·Head* self, PyObject* val){
- if (PyList_Append(self->tape_obj, val) < 0) return NULL;
- TM·Arr·sync(self);
- Py_RETURN_NONE;
-}
-
-static PyObject* TM·Arr·LaR(TM·Head* self, PyObject* val){
- if (PyList_Insert(self->tape_obj, 0, val) < 0) return NULL;
- self->head_ptr += sizeof(PyObject*);
- TM·Arr·sync(self);
- Py_RETURN_NONE;
-}
+static PyMethodDef Table·Gr·CR·ND[] = {
+ {"s", (PyCFunction)TM·Gr·s, METH_NOARGS, ""},
+ {"e", (PyCFunction)TM·Gr·e, METH_NOARGS, ""},
+ {"r", (PyCFunction)TM·Gr·r, METH_NOARGS, ""},
+ {"w", (PyCFunction)TM·Gr·w, METH_O, ""},
+ {"qR",(PyCFunction)TM·Gr·qR,METH_NOARGS, ""},
+ {"LsR",(PyCFunction)TM·Gr·LsR,METH_NOARGS,""},
+ {NULL}
+};
+static PyMethodDef Table·Gr·CLR·ND[] = {
+ {"s", (PyCFunction)TM·Gr·s, METH_NOARGS, ""},
+ {"e", (PyCFunction)TM·Gr·e, METH_NOARGS, ""},
+ {"Ls",(PyCFunction)TM·Gr·Ls,METH_NOARGS, ""},
+ {"r", (PyCFunction)TM·Gr·r, METH_NOARGS, ""},
+ {"w", (PyCFunction)TM·Gr·w, METH_O, ""},
+ {"qR",(PyCFunction)TM·Gr·qR,METH_NOARGS, ""},
+ {"LqR",(PyCFunction)TM·Gr·LqR,METH_NOARGS, ""},
+ {"LsR",(PyCFunction)TM·Gr·LsR,METH_NOARGS,""},
+ {NULL}
+};
-/* ========================================================= */
-/* METHOD TABLES (Array Backed) */
-/* ========================================================= */
+/* --- METHOD TABLES (Array) --- */
/* 1. NON-DESTRUCTIVE (ND) */
-static PyMethodDef Table·CR·ND[] = {
+static PyMethodDef Table·Arr·CR·ND[] = {
{"s", (PyCFunction)TM·Arr·s, METH_NOARGS, ""},
{"sn",(PyCFunction)TM·Arr·sn,METH_VARARGS,""},
{"e", (PyCFunction)TM·Arr·e, METH_NOARGS, ""},
{NULL}
};
-static PyMethodDef Table·CLR·ND[] = {
+static PyMethodDef Table·Arr·CLR·ND[] = {
{"s", (PyCFunction)TM·Arr·s, METH_NOARGS, ""},
{"sn",(PyCFunction)TM·Arr·sn,METH_VARARGS,""},
{"e", (PyCFunction)TM·Arr·e, METH_NOARGS, ""},
};
/* 2. DESTRUCTIVE (SO) - No Entangle 'e' */
-static PyMethodDef Table·CR·SO[] = {
+static PyMethodDef Table·Arr·CR·SO[] = {
{"s", (PyCFunction)TM·Arr·s, METH_NOARGS, ""},
{"sn",(PyCFunction)TM·Arr·sn,METH_VARARGS,""},
{"r", (PyCFunction)TM·Arr·r, METH_NOARGS, ""},
{NULL}
};
-static PyMethodDef Table·CLR·SO[] = {
+static PyMethodDef Table·Arr·CLR·SO[] = {
{"s", (PyCFunction)TM·Arr·s, METH_NOARGS, ""},
{"Ls",(PyCFunction)TM·Arr·Ls,METH_NOARGS, ""},
{"r", (PyCFunction)TM·Arr·r, METH_NOARGS, ""},
{NULL}
};
-/* ========================================================= */
-/* IMPLEMENTATION: TMA·NaturalNumber (TM·Nat·) */
-/* ========================================================= */
-
-typedef struct {
- PyObject_HEAD
- unsigned long long state;
-} TM·Nat;
-
-static int TM·Nat·init(TM·Nat* self, PyObject* args, PyObject* kwds){
- self->state = 0;
- return 0;
-}
-
-static PyObject* TM·Nat·s(TM·Nat* self){ self->state++; Py_RETURN_NONE; }
-static PyObject* TM·Nat·sn(TM·Nat* self, PyObject* args){
- unsigned long long n;
- if(!PyArg_ParseTuple(args, "K", &n)) return NULL;
- self->state += n; Py_RETURN_NONE;
-}
-
-static PyObject* TM·Nat·Ls(TM·Nat* self){
- if(self->state > 0) self->state--;
- Py_RETURN_NONE;
-}
-
-static PyObject* TM·Nat·LsR(TM·Nat* self){ self->state = 0; Py_RETURN_NONE; }
-static PyObject* TM·Nat·r(TM·Nat* self){ return PyLong_FromUnsignedLongLong(self->state); }
-static PyObject* TM·Nat·w(TM·Nat* self, PyObject* val){
- PyErr_SetString(PyExc_TypeError, "Cannot write to Abstract Natural Number tape.");
- return NULL;
-}
-
-static PyObject* TM·Nat·qR(TM·Nat* self){ Py_RETURN_FALSE; }
-static PyObject* TM·Nat·LqR(TM·Nat* self){
- if(self->state == 0){
- Py_RETURN_TRUE;
- }
- Py_RETURN_FALSE;
-}
-
-/* Nat Query N:
- qnR -> Infinite? Or not supported. For now, max int?
- LqnR -> Distance from 0. Equal to state.
-*/
-static PyObject* TM·Nat·qnR(TM·Nat* self){
- /* Abstract number line is infinite. */
- PyErr_SetString(PyExc_RuntimeError, "Natural Number tape is infinite to the right.");
- return NULL;
-}
-static PyObject* TM·Nat·LqnR(TM·Nat* self){
- return PyLong_FromUnsignedLongLong(self->state);
-}
-
-static PyMethodDef TM·Nat·methods[] = {
- {"s", (PyCFunction)TM·Nat·s, METH_NOARGS, ""},
- {"sn",(PyCFunction)TM·Nat·sn,METH_VARARGS,""},
- {"Ls",(PyCFunction)TM·Nat·Ls,METH_NOARGS, ""},
- {"r", (PyCFunction)TM·Nat·r, METH_NOARGS, ""},
- {"w", (PyCFunction)TM·Nat·w, METH_O, ""},
- {"qR",(PyCFunction)TM·Nat·qR,METH_NOARGS, ""},
- {"LqR",(PyCFunction)TM·Nat·LqR,METH_NOARGS, ""},
- {"qnR",(PyCFunction)TM·Nat·qnR,METH_NOARGS, ""},
- {"LqnR",(PyCFunction)TM·Nat·LqnR,METH_NOARGS, ""},
- {"LsR",(PyCFunction)TM·Nat·LsR,METH_NOARGS, ""},
- {NULL}
-};
+/* --- TYPE MACROS --- */
-static PyTypeObject TMA_NaturalNumber·Type = {
- PyVarObject_HEAD_INIT(NULL, 0)
- .tp_name = "TM_module.TMA_NaturalNumber",
- .tp_doc = "Abstract TM: Natural Numbers",
- .tp_basicsize = sizeof(TM·Nat),
- .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,
- .tp_new = PyType_GenericNew,
- .tp_init = (initproc)TM·Nat·init,
- .tp_methods = TM·Nat·methods,
+#define DEFINE_ARRAY_TYPE(NAME, METHODS) \
+static PyTypeObject NAME##·Type = { \
+ PyVarObject_HEAD_INIT(NULL, 0) \
+ .tp_name = "TM_module." #NAME, \
+ .tp_basicsize = sizeof(TM·Arr·Head), \
+ .tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, \
+ .tp_new = PyType_GenericNew, \
+ .tp_init = (initproc)TM·Arr·init, \
+ .tp_dealloc = (destructor)TM·Arr·dealloc, \
+ .tp_methods = METHODS, \
};
-
-/* ========================================================= */
-/* TYPE DEFINITIONS (The 60 Concrete Types) */
-/* ========================================================= */
-
-#define DEFINE_TYPE(NAME, METHODS) \
+#define DEFINE_GR_TYPE(NAME, METHODS) \
static PyTypeObject NAME##·Type = { \
PyVarObject_HEAD_INIT(NULL, 0) \
.tp_name = "TM_module." #NAME, \
- .tp_basicsize = sizeof(TM·Head), \
+ .tp_basicsize = sizeof(TM·Gr·Head), \
.tp_flags = Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, \
.tp_new = PyType_GenericNew, \
- .tp_init = (initproc)TM·Arr·init, \
- .tp_dealloc = (destructor)TM·Head·dealloc, \
+ .tp_init = (initproc)TM·Gr·init, \
+ .tp_dealloc = (destructor)TM·Gr·dealloc, \
.tp_methods = METHODS, \
};
-/* ---------------------------------------------------------
- 1. Arr (Fixed Array)
- --------------------------------------------------------- */
-DEFINE_TYPE(TM_Arr_CR_ND, Table·CR·ND)
-DEFINE_TYPE(TM_Arr_CR_SO, Table·CR·ND)
-DEFINE_TYPE(TM_Arr_CR_EA, Table·CR·ND)
-
-DEFINE_TYPE(TM_Arr_CLR_ND, Table·CLR·ND)
-DEFINE_TYPE(TM_Arr_CLR_SO, Table·CLR·ND)
-DEFINE_TYPE(TM_Arr_CLR_EA, Table·CLR·ND)
-
-/* ---------------------------------------------------------
- 2. ArrV (Variable Array / Vector)
- --------------------------------------------------------- */
-DEFINE_TYPE(TM_ArrV_CR_ND, Table·CR·ND)
-DEFINE_TYPE(TM_ArrV_CR_SO, Table·CR·SO) /* Destructive */
-DEFINE_TYPE(TM_ArrV_CR_EA, Table·CR·ND)
-
-DEFINE_TYPE(TM_ArrV_CLR_ND, Table·CLR·ND)
-DEFINE_TYPE(TM_ArrV_CLR_SO, Table·CLR·SO) /* Destructive */
-DEFINE_TYPE(TM_ArrV_CLR_EA, Table·CLR·ND)
-
-/* ---------------------------------------------------------
- 3. Gr (Graph Right / Linked List)
- --------------------------------------------------------- */
-DEFINE_TYPE(TM_Gr_CR_ND, Table·CR·ND)
-DEFINE_TYPE(TM_Gr_CR_SO, Table·CR·ND)
-DEFINE_TYPE(TM_Gr_CR_EA, Table·CR·ND)
-DEFINE_TYPE(TM_Gr_CLR_ND, Table·CLR·ND)
-DEFINE_TYPE(TM_Gr_CLR_SO, Table·CLR·ND)
-DEFINE_TYPE(TM_Gr_CLR_EA, Table·CLR·ND)
-
-/* ---------------------------------------------------------
- 4. Glr (Graph Left Right / Doubly Linked List)
- --------------------------------------------------------- */
-DEFINE_TYPE(TM_Glr_CR_ND, Table·CR·ND)
-DEFINE_TYPE(TM_Glr_CR_SO, Table·CR·ND)
-DEFINE_TYPE(TM_Glr_CR_EA, Table·CR·ND)
-DEFINE_TYPE(TM_Glr_CLR_ND, Table·CLR·ND)
-DEFINE_TYPE(TM_Glr_CLR_SO, Table·CLR·ND)
-DEFINE_TYPE(TM_Glr_CLR_EA, Table·CLR·ND)
-
-/* ---------------------------------------------------------
- 5. Set (Unordered)
- --------------------------------------------------------- */
-DEFINE_TYPE(TM_Set_CR_ND, Table·CR·ND)
-DEFINE_TYPE(TM_Set_CR_SO, Table·CR·ND)
-DEFINE_TYPE(TM_Set_CR_EA, Table·CR·ND)
-DEFINE_TYPE(TM_Set_CLR_ND, Table·CLR·ND)
-DEFINE_TYPE(TM_Set_CLR_SO, Table·CLR·ND)
-DEFINE_TYPE(TM_Set_CLR_EA, Table·CLR·ND)
-
-/* ---------------------------------------------------------
- 6. Map (Items)
- --------------------------------------------------------- */
-DEFINE_TYPE(TM_Map_CR_ND, Table·CR·ND)
-DEFINE_TYPE(TM_Map_CR_SO, Table·CR·ND)
-DEFINE_TYPE(TM_Map_CR_EA, Table·CR·ND)
-DEFINE_TYPE(TM_Map_CLR_ND, Table·CLR·ND)
-DEFINE_TYPE(TM_Map_CLR_SO, Table·CLR·ND)
-DEFINE_TYPE(TM_Map_CLR_EA, Table·CLR·ND)
-
-/* ---------------------------------------------------------
- 7. MapK (Keys)
- --------------------------------------------------------- */
-DEFINE_TYPE(TM_MapK_CR_ND, Table·CR·ND)
-DEFINE_TYPE(TM_MapK_CR_SO, Table·CR·ND)
-DEFINE_TYPE(TM_MapK_CR_EA, Table·CR·ND)
-DEFINE_TYPE(TM_MapK_CLR_ND, Table·CLR·ND)
-DEFINE_TYPE(TM_MapK_CLR_SO, Table·CLR·ND)
-DEFINE_TYPE(TM_MapK_CLR_EA, Table·CLR·ND)
-
-/* ---------------------------------------------------------
- 8. MapV (Values)
- --------------------------------------------------------- */
-DEFINE_TYPE(TM_MapV_CR_ND, Table·CR·ND)
-DEFINE_TYPE(TM_MapV_CR_SO, Table·CR·ND)
-DEFINE_TYPE(TM_MapV_CR_EA, Table·CR·ND)
-DEFINE_TYPE(TM_MapV_CLR_ND, Table·CLR·ND)
-DEFINE_TYPE(TM_MapV_CLR_SO, Table·CLR·ND)
-DEFINE_TYPE(TM_MapV_CLR_EA, Table·CLR·ND)
-
-/* ---------------------------------------------------------
- 9. ASCII (String)
- --------------------------------------------------------- */
-DEFINE_TYPE(TM_ASCII_CR_ND, Table·CR·ND)
-DEFINE_TYPE(TM_ASCII_CR_SO, Table·CR·ND)
-DEFINE_TYPE(TM_ASCII_CR_EA, Table·CR·ND)
-DEFINE_TYPE(TM_ASCII_CLR_ND, Table·CLR·ND)
-DEFINE_TYPE(TM_ASCII_CLR_SO, Table·CLR·ND)
-DEFINE_TYPE(TM_ASCII_CLR_EA, Table·CLR·ND)
-
-/* ---------------------------------------------------------
- 10. UTF8 (String)
- --------------------------------------------------------- */
-DEFINE_TYPE(TM_UTF8_CR_ND, Table·CR·ND)
-DEFINE_TYPE(TM_UTF8_CR_SO, Table·CR·ND)
-DEFINE_TYPE(TM_UTF8_CR_EA, Table·CR·ND)
-DEFINE_TYPE(TM_UTF8_CLR_ND, Table·CLR·ND)
-DEFINE_TYPE(TM_UTF8_CLR_SO, Table·CLR·ND)
-DEFINE_TYPE(TM_UTF8_CLR_EA, Table·CLR·ND)
-
-
-/* ========================================================= */
-/* MODULE INIT */
-/* ========================================================= */
+/* --- TYPE DEFINITIONS --- */
+
+/* 1. Array Types */
+DEFINE_ARRAY_TYPE(TM_Arr_CR_ND, Table·Arr·CR·ND)
+DEFINE_ARRAY_TYPE(TM_Arr_CR_SO, Table·Arr·CR·SO)
+DEFINE_ARRAY_TYPE(TM_Arr_CR_EA, Table·Arr·CR·ND)
+
+DEFINE_ARRAY_TYPE(TM_Arr_CLR_ND, Table·Arr·CLR·ND)
+DEFINE_ARRAY_TYPE(TM_Arr_CLR_SO, Table·Arr·CLR·SO)
+DEFINE_ARRAY_TYPE(TM_Arr_CLR_EA, Table·Arr·CLR·ND)
+
+DEFINE_ARRAY_TYPE(TM_ArrV_CR_ND, Table·Arr·CR·ND)
+DEFINE_ARRAY_TYPE(TM_ArrV_CR_SO, Table·Arr·CR·SO)
+DEFINE_ARRAY_TYPE(TM_ArrV_CR_EA, Table·Arr·CR·ND)
+
+DEFINE_ARRAY_TYPE(TM_ArrV_CLR_ND, Table·Arr·CLR·ND)
+DEFINE_ARRAY_TYPE(TM_ArrV_CLR_SO, Table·Arr·CLR·SO)
+DEFINE_ARRAY_TYPE(TM_ArrV_CLR_EA, Table·Arr·CLR·ND)
+
+/* ... ASCII/UTF8 ... */
+DEFINE_ARRAY_TYPE(TM_ASCII_CR_ND, Table·Arr·CR·ND)
+DEFINE_ARRAY_TYPE(TM_ASCII_CR_SO, Table·Arr·CR·SO)
+DEFINE_ARRAY_TYPE(TM_ASCII_CR_EA, Table·Arr·CR·ND)
+DEFINE_ARRAY_TYPE(TM_ASCII_CLR_ND, Table·Arr·CLR·ND)
+DEFINE_ARRAY_TYPE(TM_ASCII_CLR_SO, Table·Arr·CLR·SO)
+DEFINE_ARRAY_TYPE(TM_ASCII_CLR_EA, Table·Arr·CLR·ND)
+
+DEFINE_ARRAY_TYPE(TM_UTF8_CR_ND, Table·Arr·CR·ND)
+DEFINE_ARRAY_TYPE(TM_UTF8_CR_SO, Table·Arr·CR·SO)
+DEFINE_ARRAY_TYPE(TM_UTF8_CR_EA, Table·Arr·CR·ND)
+DEFINE_ARRAY_TYPE(TM_UTF8_CLR_ND, Table·Arr·CLR·ND)
+DEFINE_ARRAY_TYPE(TM_UTF8_CLR_SO, Table·Arr_CLR_SO)
+DEFINE_ARRAY_TYPE(TM_UTF8_CLR_EA, Table·Arr_CLR_ND)
+
+/* 2. Graph Types */
+DEFINE_GR_TYPE(TM_Gr_CR_ND, Table·Gr·CR·ND)
+DEFINE_GR_TYPE(TM_Gr_CR_SO, Table·Gr·CR·ND)
+DEFINE_GR_TYPE(TM_Gr_CR_EA, Table·Gr·CR·ND)
+
+DEFINE_GR_TYPE(TM_Gr_CLR_ND, Table·Gr·CLR·ND)
+DEFINE_GR_TYPE(TM_Gr_CLR_SO, Table·Gr·CLR·ND)
+DEFINE_GR_TYPE(TM_Gr_CLR_EA, Table·Gr_CLR_ND)
+
+DEFINE_GR_TYPE(TM_Glr_CR_ND, Table·Gr·CR·ND)
+DEFINE_GR_TYPE(TM_Glr_CR_SO, Table·Gr·CR·ND)
+DEFINE_GR_TYPE(TM_Glr_CR_EA, Table·Gr·CR·ND)
+DEFINE_GR_TYPE(TM_Glr_CLR_ND, Table·Gr·CLR·ND)
+DEFINE_GR_TYPE(TM_Glr_CLR_SO, Table·Gr·CLR·ND)
+DEFINE_GR_TYPE(TM_Glr_CLR_EA, Table·Gr_CLR_ND)
+
+/* ... Maps and Sets ... */
+DEFINE_GR_TYPE(TM_Set_CR_ND, Table·Gr·CR·ND)
+DEFINE_GR_TYPE(TM_Set_CR_SO, Table·Gr·CR·ND)
+DEFINE_GR_TYPE(TM_Set_CR_EA, Table·Gr·CR·ND)
+DEFINE_GR_TYPE(TM_Set_CLR_ND, Table·Gr·CLR·ND)
+DEFINE_GR_TYPE(TM_Set_CLR_SO, Table·Gr·CLR·ND)
+DEFINE_GR_TYPE(TM_Set_CLR_EA, Table·Gr·CLR_ND)
+
+DEFINE_GR_TYPE(TM_Map_CR_ND, Table·Gr·CR·ND)
+DEFINE_GR_TYPE(TM_Map_CR_SO, Table·Gr·CR·ND)
+DEFINE_GR_TYPE(TM_Map_CR_EA, Table·Gr·CR·ND)
+DEFINE_GR_TYPE(TM_Map_CLR_ND, Table·Gr·CLR·ND)
+DEFINE_GR_TYPE(TM_Map_CLR_SO, Table·Gr·CLR_ND)
+DEFINE_GR_TYPE(TM_Map_CLR_EA, Table·Gr_CLR_ND)
+
+DEFINE_GR_TYPE(TM_MapK_CR_ND, Table·Gr·CR·ND)
+DEFINE_GR_TYPE(TM_MapK_CR_SO, Table·Gr·CR·ND)
+DEFINE_GR_TYPE(TM_MapK_CR_EA, Table·Gr_CR_ND)
+DEFINE_GR_TYPE(TM_MapK_CLR_ND, Table·Gr·CLR·ND)
+DEFINE_GR_TYPE(TM_MapK_CLR_SO, Table·Gr·CLR_ND)
+DEFINE_GR_TYPE(TM_MapK_CLR_EA, Table·Gr_CLR_ND)
+
+DEFINE_GR_TYPE(TM_MapV_CR_ND, Table·Gr·CR·ND)
+DEFINE_GR_TYPE(TM_MapV_CR_SO, Table·Gr·CR·ND)
+DEFINE_GR_TYPE(TM_MapV_CR_EA, Table·Gr_CR_ND)
+DEFINE_GR_TYPE(TM_MapV_CLR_ND, Table·Gr·CLR·ND)
+DEFINE_GR_TYPE(TM_MapV_CLR_SO, Table·Gr_CLR_ND)
+DEFINE_GR_TYPE(TM_MapV_CLR_EA, Table_Gr_CLR_ND)
+
+
+/* --- MODULE INIT --- */
static PyModuleDef TM_module = {
- PyModuleDef_HEAD_INIT, "TM_module", "TM Type Exports", -1, NULL
+ PyModuleDef_HEAD_INIT, "TM_module", "Tape Machine Factory", -1, NULL
};
#define ADD_TYPE(NAME) \
ADD_TYPE(TM_UTF8_CLR_ND) ADD_TYPE(TM_UTF8_CLR_SO) ADD_TYPE(TM_UTF8_CLR_EA)
/* Abstract */
- if (PyType_Ready(&TMA_NaturalNumber·Type) < 0) return NULL;
- Py_INCREF(&TMA_NaturalNumber·Type);
- PyModule_AddObject(m, "TMA_NaturalNumber", (PyObject*)&TMA_NaturalNumber·Type);
+ ADD_TYPE(TMA_NaturalNumber)
return m;
}