From ded2940768463382f865524791755f7780a086a1 Mon Sep 17 00:00:00 2001 From: Hojun Choi Date: Mon, 2 Sep 2024 17:41:19 +0900 Subject: [PATCH] (+ "123" "456") --- eval.c | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/eval.c b/eval.c index 874242e..b6ee19b 100644 --- a/eval.c +++ b/eval.c @@ -120,10 +120,10 @@ fncons(Object *env, Object *list) } Object* -fnplus(Object *env, Object *list) +plusint(Object *env, Object *p) { long sum = 0; - for(Object *p=evallist(env, list); p!=&Nil; p=p->cdr){ + for(;p!=&Nil; p=p->cdr){ if(p->car->type != OINT) error("+ take only number"); sum += p->car->num; @@ -131,6 +131,29 @@ fnplus(Object *env, Object *list) return newint(gc, sum); } +Object* +plusstr(Object *env, Object *p) +{ + Object *str = newstr(gc, 16); + for(;p!=&Nil; p=p->cdr){ + if(p->car->type != OSTRING) + error("+ take only number"); + strputs(str, p->car->beg); + } + return str; +} + +Object* +fnplus(Object *env, Object *list) +{ + Object *p=evallist(env, list); + switch(p->car->type){ + default: error("+ take only [STRING, INT]"); + case OSTRING: return plusstr(env ,p); + case OINT: return plusint(env, p); + } +} + static Object* evallist(Object *env, Object *list) {