@@ -87,6 +87,7 @@ Adafruit_ST7789 tft = Adafruit_ST7789(TFT_CS, TFT_DC, MOSI, SCK, TFT_RST);
87
87
#define integerp (x ) ((x) != NULL && (x)->type == NUMBER)
88
88
#define floatp (x ) ((x) != NULL && (x)->type == FLOAT)
89
89
#define symbolp (x ) ((x) != NULL && (x)->type == SYMBOL)
90
+ #define bfunctionp (x ) ((x) != NULL && (x)->type == BFUNCTION)
90
91
#define stringp (x ) ((x) != NULL && (x)->type == STRING)
91
92
#define characterp (x ) ((x) != NULL && (x)->type == CHARACTER)
92
93
#define arrayp (x ) ((x) != NULL && (x)->type == ARRAY)
@@ -124,7 +125,7 @@ Adafruit_ST7789 tft = Adafruit_ST7789(TFT_CS, TFT_DC, MOSI, SCK, TFT_RST);
124
125
// Constants
125
126
126
127
#define TRACEMAX 3 // Number of traced functions
127
- enum type { ZZERO=0 , SYMBOL=2 , CODE=4 , NUMBER=6 , STREAM =8 , CHARACTER =10 , FLOAT =12 , ARRAY =14 , STRING =16 , PAIR =18 }; // ARRAY STRING and PAIR must be last
128
+ enum type { ZZERO=0 , SYMBOL=2 , CODE=4 , NUMBER=6 , BFUNCTION =8 , STREAM =10 , CHARACTER =12 , FLOAT =14 , ARRAY =16 , STRING =18 , PAIR= 20 }; // ARRAY, STRING, and PAIR must be last
128
129
enum token { UNUSED, OPEN_PAREN, CLOSE_PAREN, SINGLE_QUOTE, PERIOD, BACKTICK, COMMA, COMMA_AT };
129
130
enum fntypes_t { OTHER_FORMS, SPECIAL_FORMS, FUNCTIONS, SPECIAL_SYMBOLS };
130
131
@@ -223,6 +224,7 @@ volatile flags_t Flags = 1; // PRINTREADABLY set by default
223
224
224
225
// Forward references
225
226
bool builtin_keywordp (object*);
227
+ inline bool builtinp (symbol_t name);
226
228
bool keywordp (object*);
227
229
void pfstring (const char *, pfun_t );
228
230
char nthchar (object*, int );
@@ -505,6 +507,19 @@ object* symbol (symbol_t name) {
505
507
return ptr;
506
508
}
507
509
510
+ object* bfunction_from_symbol (object* symbol) {
511
+ if (!(symbolp (symbol) && builtinp (symbol->name ))) return nil;
512
+ symbol_t nm = symbol->name ;
513
+ for (int i=0 ; i<WORKSPACESIZE; i++) {
514
+ object* obj = &Workspace[i];
515
+ if (obj->type == BFUNCTION && obj->name == nm) return obj;
516
+ }
517
+ object* ptr = myalloc ();
518
+ ptr->type = BFUNCTION;
519
+ ptr->name = nm;
520
+ return ptr;
521
+ }
522
+
508
523
/*
509
524
bsymbol - make a built-in symbol
510
525
*/
@@ -7279,6 +7294,7 @@ object* eval (object* form, object* env) {
7279
7294
if (form->type >= NUMBER && form->type <= STRING) return form; // Literal
7280
7295
7281
7296
if (symbolp (form)) {
7297
+ if (form == tee) return form;
7282
7298
if (keywordp (form)) return form; // Keyword
7283
7299
symbol_t name = form->name ;
7284
7300
object* pair = value (name, env);
@@ -7289,7 +7305,7 @@ object* eval (object* form, object* env) {
7289
7305
else if (builtinp (name)) {
7290
7306
builtin_t bname = builtin (name);
7291
7307
if (fntype (getminmax (bname)) == SPECIAL_SYMBOLS) return ((fn_ptr_type)lookupfn (bname))(NULL , env);
7292
- return form;
7308
+ return bfunction_from_symbol ( form) ;
7293
7309
}
7294
7310
Context = NIL;
7295
7311
error (" undefined" , form);
@@ -7304,7 +7320,7 @@ object* eval (object* form, object* env) {
7304
7320
if (function == NULL ) error2 (" can't call nil" );
7305
7321
if (!listp (args)) error (" can't evaluate a dotted pair" , args);
7306
7322
7307
- // List starts with a builtin symbol ?
7323
+ // List starts with a builtin special form ?
7308
7324
if (symbolp (function) && builtinp (function->name )) {
7309
7325
builtin_t name = builtin (function->name );
7310
7326
@@ -7381,10 +7397,15 @@ object* eval (object* form, object* env) {
7381
7397
7382
7398
function = car (head);
7383
7399
args = cdr (head);
7384
-
7400
+
7401
+ // fail early on calling a symbol
7385
7402
if (symbolp (function)) {
7403
+ Context = NIL;
7404
+ error (" can't call a symbol" , function);
7405
+ }
7406
+ if (bfunctionp (function)) {
7386
7407
builtin_t bname = builtin (function->name );
7387
- if (!builtinp (function->name )) error (" can't call a symbol" , fname );
7408
+ if (!builtinp (function->name )) error (" can't call a symbol" , function );
7388
7409
Context = bname;
7389
7410
checkminmax (bname, nargs);
7390
7411
object* result = ((fn_ptr_type)lookupfn (bname))(args, env);
@@ -7688,6 +7709,15 @@ void printobject (object* form, pfun_t pfun) {
7688
7709
else if (integerp (form)) pint (form->integer , pfun);
7689
7710
else if (floatp (form)) pfloat (form->single_float , pfun);
7690
7711
else if (symbolp (form)) { if (form->name != sym (NOTHING)) printsymbol (form, pfun); }
7712
+ else if (bfunctionp (form)) {
7713
+ pfstring (" <built-in " , pfun);
7714
+ switch (fntype (getminmax (builtin (form->name )))) {
7715
+ case FUNCTIONS: pfstring (" function " , pfun); break ;
7716
+ case SPECIAL_FORMS: pfstring (" special form " , pfun); break ;
7717
+ }
7718
+ printsymbol (form, pfun);
7719
+ pfun (' >' );
7720
+ }
7691
7721
else if (characterp (form)) pcharacter (form->chars , pfun);
7692
7722
else if (stringp (form)) printstring (form, pfun);
7693
7723
else if (arrayp (form)) printarray (form, pfun);
0 commit comments