iris

small scheme interpreter
git clone git://git.2f30.org/iris
Log | Files | Refs | LICENSE

commit 6e55bf1456269d50a3ee669414efaf367a8b737d
parent ae5cf706da3138ad4c93b5d264e47d8165ab1dcb
Author: sin <sin@2f30.org>
Date:   Wed, 14 May 2014 14:50:06 +0100

Add the quote identifier as well

Diffstat:
Mparser.c | 36+++++++++++++++++++++---------------
Mparser.h | 1+
Mrepl.c | 1+
3 files changed, 23 insertions(+), 15 deletions(-)

diff --git a/parser.c b/parser.c @@ -18,7 +18,6 @@ enum objtype { OString, OEmptylist, OPair, - OQuote, }; struct object { @@ -60,6 +59,9 @@ struct object { } d; }; +/* builtin symbols */ +struct object *quotesym; + static struct object * newobject(void) { @@ -189,23 +191,12 @@ pair(FILE *in) return cons(car, cdr); } -static struct object * -quote(void) -{ - struct object *o; - - o = newobject(); - o->type = OQuote; - return o; -} - struct object * sexpression(FILE *in) { struct tok t; char *l; - initenv(); t = gettok(in); l = lexeme(&t); switch (t.type) { @@ -228,7 +219,7 @@ sexpression(FILE *in) case TLparen: return pair(in); case TQuote: - return cons(quote(), cons(sexpression(in), emptylist())); + return cons(quotesym, cons(sexpression(in), emptylist())); default: return error("unhandled token"); } @@ -243,7 +234,8 @@ quoted(struct object *o) if (o->type == OPair) { car = o->d.p.car; - return car->type == OQuote; + return car->type == OIdentifier && + strcmp(car->d.i.s, "quote") == 0; } return 0; } @@ -254,7 +246,7 @@ eval(struct object *o) struct object *otmp; switch (o->type) { - /* self-evaluating objects */ + /* self-evaluating objects */ case OError: case OEof: case OBoolean: @@ -327,3 +319,17 @@ print(struct object *o) break; } } + +int +init(void) +{ + struct object *o; + + initenv(); + o = newobject(); + o->type = OIdentifier; + o->d.i.s = "quote"; + quotesym = o; + addsym("quote", quotesym); + return 0; +} diff --git a/parser.h b/parser.h @@ -2,3 +2,4 @@ struct object *sexpression(FILE *); struct object *eval(struct object *); void print(struct object *); +int init(void); diff --git a/repl.c b/repl.c @@ -7,6 +7,7 @@ int main(void) { puts("Welcome to iris - use ^C to quit"); + init(); do { printf("> "); fflush(stdout);