newtRef NcFullLookupFrame(newtRefArg start, newtRefArg name) { newtRefVar current; newtRefVar left = start; if (! NewtRefIsFrame(start)) return kNewtRefUnbind; while (NewtRefIsNotNIL(left)) { current = left; while (NewtRefIsNotNIL(current)) { current = NcResolveMagicPointer(current); if (NewtRefIsMagicPointer(current)) return kNewtRefUnbind; if (NewtHasSlot(current, name)) return current; current = NcGetSlot(current, NSSYM0(_proto)); } left = NcGetSlot(left, NSSYM0(_parent)); } return kNewtRefUnbind; }
newtRef NcResolveNamedMP(newtRefArg r) { newtRefVar sym; if (! NewtRefIsNamedMP(r)) return r; sym = NewtMPToSymbol(r); if (NewtHasSlot(NAMED_MPS, sym)) return NcGetSlot(NAMED_MPS, sym); else return r; }
newtRef NcLexicalLookup(newtRefArg start, newtRef name) { newtRefVar current = start; while (NewtRefIsNotNIL(current)) { current = NcResolveMagicPointer(current); if (NewtRefIsMagicPointer(current)) return kNewtRefUnbind; if (NewtHasSlot(current, name)) return NcGetSlot(current, name); current = NcGetSlot(current, NSSYM0(_nextArgFrame)); } return kNewtRefUnbind; }
newtRef NsHasSlot(newtRefArg rcvr, newtRefArg frame, newtRefArg slot) { return NewtMakeBoolean(NewtHasSlot(frame, slot)); }
bool NewtHasGlobalVar(newtRefArg r) { return NewtHasSlot(GLOBALS, r); }
bool NewtHasGlobalFn(newtRefArg r) { return NewtHasSlot(GLOBAL_FNS, r); }