@ -0,0 +1,3 @@ | |||||
enum foo { Closed = 0, ReadOnly = 1, WriteOnly = 2 }; | |||||
static char *stateNames[] = { "Closed", "ReadOnly", "WriteOnly"}; |
@ -0,0 +1,19 @@ | |||||
@{ | |||||
mapast(f, seq) | |||||
{ | |||||
out = {}; | |||||
for (i in seq) { | |||||
e = seq[i]; | |||||
out[length(out)] = e.__proto__ != Token ? f(e) : e ; | |||||
} | |||||
out; | |||||
} | |||||
idToString(x) { { __proto__: C_string, value: "\"" + string(x.name.identifier) + "\"" } } | |||||
nil; | |||||
} | |||||
enum foo { Closed = 0, ReadOnly = 1, WriteOnly = 2 }; | |||||
static char *stateNames[] = { @(mapast(idToString, program.last.enumList)) }; |
@ -0,0 +1,149 @@ | |||||
// This example serves to illustrate the possibility | |||||
// of adding the object aspect to C | |||||
// using the everyExternalDeclaration function. | |||||
#include <stdio.h> | |||||
#include <stdlib.h> | |||||
#include <string.h> | |||||
struct Symbol { | |||||
char *name; | |||||
int class, selector; | |||||
}; | |||||
struct Symbol *newSymbol(char *name) | |||||
{ | |||||
struct Symbol *symbol = malloc(sizeof(*symbol)); | |||||
symbol->name = strdup(name); | |||||
symbol->class = 0; | |||||
symbol->selector = 0; | |||||
return symbol; | |||||
} | |||||
struct Symbol **symbols = 0; | |||||
int nSymbols = 0; | |||||
struct Symbol *intern(char *name) | |||||
{ | |||||
int lo = 0; | |||||
int hi = nSymbols - 1; | |||||
while (lo <= hi ) { | |||||
int mid = (lo+hi)/2; | |||||
int cmp = strcmp(name, symbols[mid]->name); | |||||
if (cmp > 0) lo = mid + 1; | |||||
else if (cmp < 0) hi = mid - 1; | |||||
else return symbols[mid]; | |||||
} | |||||
symbols = realloc(symbols, sizeof(*symbols) * ++nSymbols); | |||||
memmove(symbols + lo + 1, symbols + lo, sizeof(*symbols)*(nSymbols - lo - 1)); | |||||
return symbols[lo] = newSymbol(name); | |||||
} | |||||
typedef void *(*method_t)(); | |||||
void *method_dnu() | |||||
{ | |||||
printf("method not found\n"); | |||||
exit(1); | |||||
return 0; | |||||
} | |||||
method_t **methods = 0; | |||||
int nClasses = 0; | |||||
int nSelectors = 0; | |||||
int ensureClass(struct Symbol *symbol) | |||||
{ | |||||
if (symbol->class == 0) { | |||||
if (nClasses == 0) nClasses++; | |||||
symbol->class = nClasses++; | |||||
methods = realloc(methods, sizeof(*methods)*nClasses); | |||||
methods[symbol->class] = malloc(sizeof(*methods)*nSelectors); | |||||
for (int i = 0; i<nSelectors; ++i) | |||||
methods[symbol->class][i] = method_dnu; | |||||
} | |||||
return symbol->class; | |||||
} | |||||
int ensureSelector(struct Symbol *symbol) | |||||
{ | |||||
if (symbol->selector == 0) { | |||||
if (nSelectors == 0) nSelectors++; | |||||
symbol->selector = nSelectors++; | |||||
for (int i = 0; i<nClasses; ++i) { | |||||
methods[i] = realloc(methods[i], sizeof(**methods)*nSelectors); | |||||
methods[i][nSelectors-1] = method_dnu; | |||||
} | |||||
} | |||||
return symbol->selector; | |||||
} | |||||
int findClass(char *class) | |||||
{ | |||||
return ensureClass(intern(class)); | |||||
} | |||||
int findSelector(char *selector) | |||||
{ | |||||
return ensureSelector(intern(selector)); | |||||
} | |||||
void addMethod(int class, int selector, method_t method) | |||||
{ | |||||
methods[class][selector] = method; | |||||
} | |||||
#define lookup(C, S) (methods[C][S]) | |||||
struct Object { | |||||
int class; | |||||
}; | |||||
#define send(R, M, ...) ({ struct Object *__ = (struct Object *)(R); lookup(__->class, _selector_##M)(__, ##__VA_ARGS__); }) | |||||
struct __oop { int class; }; | |||||
typedef struct __oop *oop; | |||||
#include <math.h> | |||||
struct Point { int class; double x, y; }; | |||||
oop newPoint(double x, double y) | |||||
{ | |||||
struct Point *self = calloc(1, sizeof *self); | |||||
self->x = x; | |||||
self->y = y; | |||||
self->class = findClass("Point"); | |||||
return (struct __oop *) self; | |||||
} | |||||
double Point_magnitude(struct __oop *__self) | |||||
{ | |||||
struct Point *self = (struct Point *) __self; | |||||
printf("point method : %f\n", sqrt(self->x * self->x * self->y * self->y)); | |||||
return sqrt(self->x * self->x * self->y * self->y); | |||||
} | |||||
double Point_getX(struct __oop *__self) | |||||
{ | |||||
struct Point *self = (struct Point *) __self; | |||||
printf("point method : %f\n", self->x); | |||||
return self->x; | |||||
} | |||||
int main() | |||||
{ | |||||
int _selector_getX= findSelector("getX"); | |||||
int _selector_magnitude= findSelector("magnitude"); | |||||
int _class_Point= findClass("Point"); | |||||
addMethod(_class_Point, _selector_getX, (method_t) Point_getX); | |||||
addMethod(_class_Point, _selector_magnitude, (method_t) Point_magnitude); | |||||
oop p = newPoint(3, 4); | |||||
send(p, magnitude); | |||||
send(p, getX); | |||||
return 0; | |||||
} |
@ -0,0 +1,34 @@ | |||||
@import("parsimonyLibrary/dynamicObjectExtDecl.mc") | |||||
#include <math.h> | |||||
@class struct Point { double x, y; }; | |||||
@constructor("Point") oop newPoint(double x, double y) | |||||
{ | |||||
self->x = x; | |||||
self->y = y; | |||||
} | |||||
@method("Point") double magnitude() | |||||
{ | |||||
printf("point method : %f\n", sqrt(self->x * self->x * self->y * self->y)); | |||||
return sqrt(self->x * self->x * self->y * self->y); | |||||
} | |||||
@method("Point") double getX() | |||||
{ | |||||
printf("point method : %f\n", self->x); | |||||
return self->x; | |||||
} | |||||
int main() | |||||
{ | |||||
oop p = newPoint(3, 4); | |||||
@send("p", "magnitude"); | |||||
@send("p", "getX"); | |||||
return 0; | |||||
} |
@ -0,0 +1,149 @@ | |||||
// This example serves to illustrate the possibility | |||||
// of adding the object aspect to C | |||||
// using the parseFrom primitive. | |||||
#include <stdio.h> | |||||
#include <stdlib.h> | |||||
#include <string.h> | |||||
struct Symbol { | |||||
char *name; | |||||
int class, selector; | |||||
}; | |||||
struct Symbol *newSymbol(char *name) | |||||
{ | |||||
struct Symbol *symbol = malloc(sizeof(*symbol)); | |||||
symbol->name = strdup(name); | |||||
symbol->class = 0; | |||||
symbol->selector = 0; | |||||
return symbol; | |||||
} | |||||
struct Symbol **symbols = 0; | |||||
int nSymbols = 0; | |||||
struct Symbol *intern(char *name) | |||||
{ | |||||
int lo = 0; | |||||
int hi = nSymbols - 1; | |||||
while (lo <= hi ) { | |||||
int mid = (lo+hi)/2; | |||||
int cmp = strcmp(name, symbols[mid]->name); | |||||
if (cmp > 0) lo = mid + 1; | |||||
else if (cmp < 0) hi = mid - 1; | |||||
else return symbols[mid]; | |||||
} | |||||
symbols = realloc(symbols, sizeof(*symbols) * ++nSymbols); | |||||
memmove(symbols + lo + 1, symbols + lo, sizeof(*symbols)*(nSymbols - lo - 1)); | |||||
return symbols[lo] = newSymbol(name); | |||||
} | |||||
typedef void *(*method_t)(); | |||||
void *method_dnu() | |||||
{ | |||||
printf("method not found\n"); | |||||
exit(1); | |||||
return 0; | |||||
} | |||||
method_t **methods = 0; | |||||
int nClasses = 0; | |||||
int nSelectors = 0; | |||||
int ensureClass(struct Symbol *symbol) | |||||
{ | |||||
if (symbol->class == 0) { | |||||
if (nClasses == 0) nClasses++; | |||||
symbol->class = nClasses++; | |||||
methods = realloc(methods, sizeof(*methods)*nClasses); | |||||
methods[symbol->class] = malloc(sizeof(*methods)*nSelectors); | |||||
for (int i = 0; i<nSelectors; ++i) | |||||
methods[symbol->class][i] = method_dnu; | |||||
} | |||||
return symbol->class; | |||||
} | |||||
int ensureSelector(struct Symbol *symbol) | |||||
{ | |||||
if (symbol->selector == 0) { | |||||
if (nSelectors == 0) nSelectors++; | |||||
symbol->selector = nSelectors++; | |||||
for (int i = 0; i<nClasses; ++i) { | |||||
methods[i] = realloc(methods[i], sizeof(**methods)*nSelectors); | |||||
methods[i][nSelectors-1] = method_dnu; | |||||
} | |||||
} | |||||
return symbol->selector; | |||||
} | |||||
int findClass(char *class) | |||||
{ | |||||
return ensureClass(intern(class)); | |||||
} | |||||
int findSelector(char *selector) | |||||
{ | |||||
return ensureSelector(intern(selector)); | |||||
} | |||||
void addMethod(int class, int selector, method_t method) | |||||
{ | |||||
methods[class][selector] = method; | |||||
} | |||||
#define lookup(C, S) (methods[C][S]) | |||||
struct Object { | |||||
int class; | |||||
}; | |||||
#define send(R, M, ...) ({ struct Object *__ = (struct Object *)(R); lookup(__->class, _selector_##M)(__, ##__VA_ARGS__); }) | |||||
struct __oop { int class; }; | |||||
typedef struct __oop *oop; | |||||
#include <math.h> | |||||
struct Point { int class; double x, y; }; | |||||
oop newPoint(double x, double y) | |||||
{ | |||||
struct Point *self = calloc(1, sizeof *self); | |||||
self->x = x; | |||||
self->y = y; | |||||
self->class = findClass("Point"); | |||||
return (struct __oop *) self; | |||||
} | |||||
double Point_magnitude(struct __oop *__self) | |||||
{ | |||||
struct Point *self = (struct Point *) __self; | |||||
printf("point method : %f\n", sqrt(self->x * self->x * self->y * self->y)); | |||||
return sqrt(self->x * self->x * self->y * self->y); | |||||
} | |||||
double Point_getX(struct __oop *__self) | |||||
{ | |||||
struct Point *self = (struct Point *) __self; | |||||
printf("point method : %f\n", self->x); | |||||
return self->x; | |||||
} | |||||
int main() | |||||
{ | |||||
int _selector_getX= findSelector("getX"); | |||||
int _selector_magnitude= findSelector("magnitude"); | |||||
int _class_Point= findClass("Point"); | |||||
addMethod(_class_Point, _selector_getX, (method_t) Point_getX); | |||||
addMethod(_class_Point, _selector_magnitude, (method_t) Point_magnitude); | |||||
oop p = newPoint(3, 4); | |||||
// @send p magnitude(); | |||||
// @send p getX(); | |||||
return 0; | |||||
} |
@ -0,0 +1,34 @@ | |||||
@import("parsimonyLibrary/dynamicObjectParsFrom.mc") | |||||
#include <math.h> | |||||
@class struct Point { double x, y; }; | |||||
@constructor Point oop newPoint(double x, double y) | |||||
{ | |||||
self->x = x; | |||||
self->y = y; | |||||
} | |||||
@method Point double magnitude() | |||||
{ | |||||
printf("point method : %f\n", sqrt(self->x * self->x * self->y * self->y)); | |||||
return sqrt(self->x * self->x * self->y * self->y); | |||||
} | |||||
@method Point double getX() | |||||
{ | |||||
printf("point method : %f\n", self->x); | |||||
return self->x; | |||||
} | |||||
int main() | |||||
{ | |||||
oop p = newPoint(3, 4); | |||||
// @send p magnitude(); | |||||
// @send p getX(); | |||||
return 0; | |||||
} |