@@ -476,6 +476,12 @@ static Obj *prim_quote(void *root, Obj **env, Obj **list) {
476476 return (* list )-> car ;
477477}
478478
479+ static Obj * prim_atom (void * root , Obj * * env , Obj * * list ) {
480+ if (length (* list ) != 1 )
481+ error ("atom takes ontly 1 argument" , (* list )-> line_num );
482+ return ((* list )-> car -> type != TCELL ) ? True : Nil ;
483+ }
484+
479485// (cons expr expr)
480486static Obj * prim_cons (void * root , Obj * * env , Obj * * list ) {
481487 if (length (* list ) != 2 )
@@ -681,6 +687,10 @@ static Obj *prim_println(void *root, Obj **env, Obj **list) {
681687 return Nil ;
682688}
683689
690+ static Obj * prim_progn (void * root , Obj * * env , Obj * * list ) {
691+ return progn (root , env , list );
692+ }
693+
684694// (if expr expr expr ...)
685695static Obj * prim_if (void * root , Obj * * env , Obj * * list ) {
686696 if (length (* list ) < 2 )
@@ -965,7 +975,9 @@ static void define_primitives(void *root, Obj **env) {
965975 add_primitive (root , env , "defmacro" , prim_defmacro );
966976 add_primitive (root , env , "macroexpand" , prim_macroexpand );
967977 add_primitive (root , env , "lambda" , prim_lambda );
978+ add_primitive (root , env , "atom" , prim_atom );
968979 add_primitive (root , env , "if" , prim_if );
980+ add_primitive (root , env , "progn" , prim_progn );
969981 add_primitive (root , env , "=" , prim_num_eq );
970982 add_primitive (root , env , "eq" , prim_eq );
971983 add_primitive (root , env , "print" , prim_print );
0 commit comments