8 void naFree(void* m) { free(m); }
9 void* naAlloc(int n) { return malloc(n); }
10 void naBZero(void* m, int n) { memset(m, 0, n); }
12 naRef naObj(int type, struct naObj* o)
15 r.ref.reftag = NASAL_REFTAG;
23 if(IS_NIL(r)) return 0;
24 if(IS_NUM(r)) return r.num != 0;
25 if(IS_STR(r)) return 1;
29 naRef naNumValue(naRef n)
32 if(IS_NUM(n)) return n;
33 if(IS_NIL(n)) return naNil();
34 if(IS_STR(n) && naStr_tonum(n, &d))
39 naRef naStringValue(naContext c, naRef r)
41 if(IS_NIL(r) || IS_STR(r)) return r;
43 naRef s = naNewString(c);
44 naStr_fromnum(s, r.num);
50 naRef naNew(struct Context* c, int type)
52 naRef result = naObj(type, naGC_get(&(c->pools[type])));
53 naVec_append(c->temps, result);
57 naRef naNewString(struct Context* c)
59 naRef s = naNew(c, T_STR);
60 s.ref.ptr.str->len = 0;
61 s.ref.ptr.str->data = 0;
65 naRef naNewVector(struct Context* c)
67 naRef r = naNew(c, T_VEC);
72 naRef naNewHash(struct Context* c)
74 naRef r = naNew(c, T_HASH);
79 naRef naNewCode(struct Context* c)
81 return naNew(c, T_CODE);
84 naRef naNewCCode(struct Context* c, naCFunction fptr)
86 naRef r = naNew(c, T_CCODE);
87 r.ref.ptr.ccode->fptr = fptr;
91 naRef naNewFunc(struct Context* c, naRef code)
93 naRef func = naNew(c, T_FUNC);
94 func.ref.ptr.func->code = code;
95 func.ref.ptr.func->closure = naNil();
99 naRef naNewClosure(struct Context* c, naRef namespace, naRef next)
101 naRef closure = naNew(c, T_CLOSURE);
102 closure.ref.ptr.closure->namespace = namespace;
103 closure.ref.ptr.closure->next = next;
110 r.ref.reftag = NASAL_REFTAG;
115 naRef naNum(double num)
122 int naEqual(naRef a, naRef b)
125 if(IS_REF(a) && IS_REF(b) && a.ref.ptr.obj == b.ref.ptr.obj)
126 return 1; // Object identity (and nil == nil)
127 if(IS_NIL(a) || IS_NIL(b))
129 if(IS_NUM(a) && IS_NUM(b) && a.num == b.num)
130 return 1; // Numeric equality
131 if(IS_STR(a) && IS_STR(b) && naStr_equal(a, b))
132 return 1; // String equality
134 // Numeric equality after conversion
135 if(IS_NUM(a)) { na = a.num; }
136 else if(!(IS_STR(a) && naStr_tonum(a, &na))) { return 0; }
138 if(IS_NUM(b)) { nb = b.num; }
139 else if(!(IS_STR(b) && naStr_tonum(b, &nb))) { return 0; }
141 return na == nb ? 1 : 0;
144 int naTypeSize(int type)
147 case T_STR: return sizeof(struct naStr);
148 case T_VEC: return sizeof(struct naVec);
149 case T_HASH: return sizeof(struct naHash);
150 case T_CODE: return sizeof(struct naCode);
151 case T_FUNC: return sizeof(struct naFunc);
152 case T_CLOSURE: return sizeof(struct naClosure);
153 case T_CCODE: return sizeof(struct naCCode);
155 return 0x7fffffff; // Make sure the answer is nonsense :)
168 int naIsString(naRef r)
170 return (!IS_NIL(r))&&IS_STR(r);
173 int naIsScalar(naRef r)
178 int naIsVector(naRef r)
180 return (!IS_NIL(r))&&IS_VEC(r);
183 int naIsHash(naRef r)
185 return (!IS_NIL(r))&&IS_HASH(r);
188 int naIsFunc(naRef r)
190 return (!IS_NIL(r))&&IS_FUNC(r);
193 int naIsCode(naRef r)
198 int naIsCCode(naRef r)