*/ REBFLG MT_Typeset(REBVAL *out, REBVAL *data, REBCNT type) /* ***********************************************************************/ { if (!IS_BLOCK(data)) return FALSE; if (!Make_Typeset(VAL_BLK(data), out, TRUE)) return FALSE; VAL_SET(out, REB_TYPESET); return TRUE; }
*/ REBSER *Check_Func_Spec(REBSER *block) /* ** Check function spec of the form: ** ** ["description" arg "notes" [type! type2! ...] /ref ...] ** ** Throw an error for invalid values. ** ***********************************************************************/ { REBVAL *blk; REBSER *words; REBINT n = 0; REBVAL *value; blk = BLK_HEAD(block); words = Collect_Frame(BIND_ALL | BIND_NO_DUP | BIND_NO_SELF, 0, blk); // !!! needs more checks for (; NOT_END(blk); blk++) { switch (VAL_TYPE(blk)) { case REB_BLOCK: // Skip the SPEC block as an arg. Use other blocks as datatypes: if (n > 0) Make_Typeset(VAL_BLK(blk), BLK_SKIP(words, n), 0); break; case REB_STRING: case REB_INTEGER: // special case used by datatype test actions break; case REB_WORD: case REB_GET_WORD: case REB_LIT_WORD: n++; break; case REB_REFINEMENT: // Refinement only allows logic! and none! for its datatype: n++; value = BLK_SKIP(words, n); VAL_TYPESET(value) = (TYPESET(REB_LOGIC) | TYPESET(REB_NONE)); break; case REB_SET_WORD: default: Trap1_DEAD_END(RE_BAD_FUNC_DEF, blk); } } return words; //Create_Frame(words, 0); }
*/ REBINT Find_Typeset(REBVAL *block) /* ***********************************************************************/ { REBVAL value; REBVAL *val; REBINT n; VAL_SET(&value, REB_TYPESET); Make_Typeset(block, &value, 0); val = VAL_BLK_SKIP(ROOT_TYPESETS, 1); for (n = 1; NOT_END(val); val++, n++) { if (EQUAL_TYPESET(&value, val)){ //Print("FTS: %d", n); return n; } } // Print("Size Typesets: %d", VAL_TAIL(ROOT_TYPESETS)); Append_Value(VAL_SERIES(ROOT_TYPESETS), &value); return n; }