Skip to content

Instantly share code, notes, and snippets.

@sbp
Created December 20, 2013 00:17
Show Gist options
  • Save sbp/8048558 to your computer and use it in GitHub Desktop.
Save sbp/8048558 to your computer and use it in GitHub Desktop.
Adds apply and lt (<) to sl3.c
--- sl3.c 2008-02-07 02:29:40.000000000 +0000
+++ sl3-apply.c 2013-10-18 21:01:20.000000000 +0100
@@ -33,7 +33,7 @@
} obj;
typedef obj * (*primop)(obj *);
obj *all_symbols, *top_env, *nil, *tee, *quote,
- *s_if, *s_lambda, *s_define, *s_setb;
+ *s_if, *s_lambda, *s_define, *s_apply, *s_setb;
#define cons(X, Y) omake(CONS, 2, (X), (Y))
#define car(X) ((X)->p[0])
@@ -224,6 +224,11 @@
setcdr(pair, newval);
return newval;
}
+ if(car(exp) == s_apply) {
+ obj *proc = eval(car(cdr(exp)), env);
+ obj *args = eval(car(cdr(cdr(exp))), env);
+ return apply(proc, args, env);
+ }
return apply(eval(car(exp), env), evlis(cdr(exp), env), env);
case PRIMOP: return exp;
case PROC: return exp;
@@ -286,6 +291,10 @@
return intval(car(args)) == intval(car(cdr(args))) ? tee : nil;
}
+obj *prim_lt(obj *args) {
+ return intval(car(args)) < intval(car(cdr(args))) ? tee : nil;
+}
+
obj *prim_cons(obj *args) { return cons(car(args), car(cdr(args))); }
obj *prim_car(obj *args) { return car(car(args)); }
obj *prim_cdr(obj *args) { return cdr(car(args)); }
@@ -301,11 +310,13 @@
s_if = intern("if");
s_lambda = intern("lambda");
s_define = intern("define");
+ s_apply = intern("apply");
s_setb = intern("set!");
extend_top(intern("+"), mkprimop(prim_sum));
extend_top(intern("-"), mkprimop(prim_sub));
extend_top(intern("*"), mkprimop(prim_prod));
extend_top(intern("="), mkprimop(prim_numeq));
+ extend_top(intern("<"), mkprimop(prim_lt));
extend_top(intern("cons"), mkprimop(prim_cons));
extend_top(intern("car"), mkprimop(prim_car));
extend_top(intern("cdr"), mkprimop(prim_cdr));
@sbp
Copy link
Author

sbp commented Dec 20, 2013

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment