2 * FML interpreter. Europagate, 1995
5 * Revision 1.1 1995/02/09 14:33:37 adam
6 * Split source fml.c and define relevant build-in functions in separate
7 * files. New operators mult, div, not, llen implemented.
17 static struct fml_node *fml_exec_indx (Fml fml, struct fml_node *l,
20 struct fml_node *list = l;
24 if (!l || !r || !r->is_atom)
26 fml_node_delete (fml, l);
27 fml_node_delete (fml, r);
30 indx = fml_atom_val (r->p[0]);
31 fml_node_delete (fml, r);
32 while (--indx >= 1 && list)
36 else if (list->is_atom)
38 fn = fml_node_alloc (fml);
40 fn->p[0] = list->p[0];
49 fml_node_delete (fml, l);
53 static struct fml_node *fml_exec_len (Fml fml, struct fml_node **lp,
63 for (fn = tp->sub; fn; fn = fn->p[1])
66 else if (tp->kind == 'e')
68 struct fml_sym_info *info;
70 info = fml_sym_lookup (fml->sym_tab, tp->tokenbuf);
72 for (fn = info->body; fn; fn = fn->p[1])
78 sprintf (arg, "%d", len);
79 fn = fml_node_alloc (fml);
81 fn->p[0] = fml_atom_alloc (fml, arg);
86 void fml_list_init (Fml fml)
88 struct fml_sym_info *sym_info;
90 sym_info = fml_sym_add (fml->sym_tab, "index");
91 sym_info->kind = FML_CBINARY;
92 sym_info->binary = fml_exec_indx;
94 sym_info = fml_sym_add (fml->sym_tab, "llen");
95 sym_info->kind = FML_CPREFIX;
96 sym_info->prefix = fml_exec_len;