From 9acb895955469bedb2cb58f8a801cf0a6a5978f0 Mon Sep 17 00:00:00 2001 From: Akshay Date: Sat, 8 Dec 2018 08:54:00 -0800 Subject: [PATCH] =?utf8?q?Added=20support=20for=20creating=20lambdas=20usi?= =?utf8?q?gn=20=CE=BB=20symbol?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- src/ebisp/builtins.c | 7 ++++++- src/ebisp/builtins.h | 1 + src/ebisp/interpreter.c | 3 ++- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/ebisp/builtins.c b/src/ebisp/builtins.c index 73a90963..d75cb734 100644 --- a/src/ebisp/builtins.c +++ b/src/ebisp/builtins.c @@ -130,7 +130,7 @@ bool lambda_p(struct Expr obj) return false; } - if (strcmp("lambda", obj.cons->car.atom->sym) != 0) { + if (!is_lambda(obj.cons)) { return false; } @@ -184,3 +184,8 @@ struct Expr list(Gc *gc, size_t n, ...) va_end(args); return obj; } + +bool is_lambda(struct Cons *cons) { + return (strcmp(cons->car.atom->sym, "lambda") == 0) || + (strcmp(cons->car.atom->sym, "λ") == 0); +} diff --git a/src/ebisp/builtins.h b/src/ebisp/builtins.h index 2fe8a32d..a8b0786e 100644 --- a/src/ebisp/builtins.h +++ b/src/ebisp/builtins.h @@ -13,6 +13,7 @@ bool cons_p(struct Expr obj); bool list_p(struct Expr obj); bool list_of_symbols_p(struct Expr obj); bool lambda_p(struct Expr obj); +bool is_lambda(struct Cons *cons); long int length_of_list(struct Expr obj); diff --git a/src/ebisp/interpreter.c b/src/ebisp/interpreter.c index a0f4ace5..e8e1db1e 100644 --- a/src/ebisp/interpreter.c +++ b/src/ebisp/interpreter.c @@ -2,6 +2,7 @@ #include #include #include +#include #include "./builtins.h" #include "./expr.h" @@ -271,7 +272,7 @@ static struct EvalResult eval_funcall(Gc *gc, struct Scope *scope, struct Cons * return eval_success(cons->cdr.cons->car); } else if (strcmp(cons->car.atom->sym, "begin") == 0) { return eval_block(gc, scope, CDR(cons_as_expr(cons))); - } else if (strcmp(cons->car.atom->sym, "lambda") == 0) { + } else if (is_lambda(cons)) { /* TODO(#335): lambda special form doesn't check if it forms a callable object */ return eval_success(cons_as_expr(cons)); } else if (strcmp(cons->car.atom->sym, "when") == 0) { -- 2.44.0