altos/lisp: add length, pack, unpack and flush
[fw/altos] / src / lisp / ao_lisp_make_const.c
index 6f852f9d9a1f15d6c1f148f53c10334c189595de..0b3e25a6df079787182787abecf0dc120d1b07ae 100644 (file)
@@ -33,6 +33,8 @@ struct builtin_func {
 };
 
 struct builtin_func funcs[] = {
+       "eval",         AO_LISP_FUNC_LAMBDA,    builtin_eval,
+       "read",         AO_LISP_FUNC_LAMBDA,    builtin_read,
        "lambda",       AO_LISP_FUNC_NLAMBDA,   builtin_lambda,
        "lexpr",        AO_LISP_FUNC_NLAMBDA,   builtin_lexpr,
        "nlambda",      AO_LISP_FUNC_NLAMBDA,   builtin_nlambda,
@@ -41,10 +43,13 @@ struct builtin_func funcs[] = {
        "cdr",          AO_LISP_FUNC_LAMBDA,    builtin_cdr,
        "cons",         AO_LISP_FUNC_LAMBDA,    builtin_cons,
        "last",         AO_LISP_FUNC_LAMBDA,    builtin_last,
+       "length",       AO_LISP_FUNC_LAMBDA,    builtin_length,
        "quote",        AO_LISP_FUNC_NLAMBDA,   builtin_quote,
        "set",          AO_LISP_FUNC_LAMBDA,    builtin_set,
        "setq",         AO_LISP_FUNC_MACRO,     builtin_setq,
        "cond",         AO_LISP_FUNC_NLAMBDA,   builtin_cond,
+       "progn",        AO_LISP_FUNC_NLAMBDA,   builtin_progn,
+       "while",        AO_LISP_FUNC_NLAMBDA,   builtin_while,
        "print",        AO_LISP_FUNC_LEXPR,     builtin_print,
        "patom",        AO_LISP_FUNC_LEXPR,     builtin_patom,
        "+",            AO_LISP_FUNC_LEXPR,     builtin_plus,
@@ -57,6 +62,9 @@ struct builtin_func funcs[] = {
        ">",            AO_LISP_FUNC_LEXPR,     builtin_greater,
        "<=",           AO_LISP_FUNC_LEXPR,     builtin_less_equal,
        ">=",           AO_LISP_FUNC_LEXPR,     builtin_greater_equal,
+       "pack",         AO_LISP_FUNC_LAMBDA,    builtin_pack,
+       "unpack",       AO_LISP_FUNC_LAMBDA,    builtin_unpack,
+       "flush",        AO_LISP_FUNC_LAMBDA,    builtin_flush,
        "delay",        AO_LISP_FUNC_LAMBDA,    builtin_delay,
        "led",          AO_LISP_FUNC_LEXPR,     builtin_led,
 };
@@ -101,20 +109,12 @@ main(int argc, char **argv)
        ao_lisp_atom_set(ao_lisp_atom_poly(a),
                         ao_lisp_atom_poly(a));
 
-       for (;;) {
-               sexpr = ao_lisp_read();
-               if (!sexpr)
-                       break;
-               printf ("sexpr: ");
-               ao_lisp_poly_print(sexpr);
-               printf("\n");
-               val = ao_lisp_eval(sexpr);
-               if (ao_lisp_exception)
-                       exit(1);
-               printf("\t");
-               ao_lisp_poly_print(val);
-               printf("\n");
-       }
+       /* end of file value */
+       a = ao_lisp_atom_intern("eof");
+       ao_lisp_atom_set(ao_lisp_atom_poly(a),
+                        ao_lisp_atom_poly(a));
+
+       ao_lisp_read_eval_print();
 
        /* Reduce to referenced values */
        ao_lisp_collect();