3 WORD* word(FIXNUM primitive, CELL parameter, CELL plist)
5 WORD* word = (WORD*)allot_object(WORD_TYPE,sizeof(WORD));
6 word->xt = primitive_to_xt(primitive);
7 word->primitive = primitive;
8 word->parameter = parameter;
14 /* When a word is executed we jump to the value of the xt field. However this
15 value is an unportable function pointer, so in the image we store a primitive
16 number that indexes a list of xts. */
17 void update_xt(WORD* word)
19 word->xt = primitive_to_xt(word->primitive);
22 void primitive_wordp(void)
24 check_non_empty(env.dt);
25 env.dt = tag_boolean(TAG(env.dt) == WORD_TYPE);
28 /* <word> ( primitive parameter plist -- word ) */
29 void primitive_word(void)
33 CELL parameter = dpop();
34 check_non_empty(plist);
35 check_non_empty(parameter);
36 primitive = to_fixnum(dpop());
37 env.dt = tag_word(word(primitive,parameter,plist));
40 void primitive_word_primitive(void)
42 env.dt = tag_fixnum(untag_word(env.dt)->primitive);
45 void primitive_set_word_primitive(void)
47 WORD* word = untag_word(env.dt);
48 word->primitive = to_fixnum(dpop());
53 void primitive_word_parameter(void)
55 env.dt = untag_word(env.dt)->parameter;
58 void primitive_set_word_parameter(void)
60 check_non_empty(dpeek());
61 untag_word(env.dt)->parameter = dpop();
65 void primitive_word_plist(void)
67 env.dt = untag_word(env.dt)->plist;
70 void primitive_set_word_plist(void)
72 check_non_empty(dpeek());
73 untag_word(env.dt)->plist = dpop();
77 void fixup_word(WORD* word)
79 word->xt = primitive_to_xt(word->primitive);
80 fixup(&word->parameter);
84 void collect_word(WORD* word)
86 copy_object(&word->parameter);
87 copy_object(&word->plist);