From 32b3a2007c66a476108ff73751199dc227c4cb5a Mon Sep 17 00:00:00 2001 From: hugodecasta Date: Fri, 21 Feb 2020 17:25:42 +0100 Subject: [PATCH] added "let" --- index.js | 18 ++++++++++++++++++ test.js | 7 +++++++ 2 files changed, 25 insertions(+) diff --git a/index.js b/index.js index fa49032..e83cf64 100644 --- a/index.js +++ b/index.js @@ -63,6 +63,9 @@ let methods = { }, '-':function(args) { let end_args = args.map(arg=>handle(arg)) + if(end_args.length == 1) { + return -end_args[0] + } return end_args.reduce(function(acc,cur) { return acc - cur }) @@ -75,6 +78,9 @@ let methods = { }, '/':function(args) { let end_args = args.map(arg=>handle(arg)) + if(end_args.length == 1) { + return 1/end_args[0] + } return end_args.reduce(function(acc,cur) { return acc / cur }) @@ -186,6 +192,18 @@ let methods = { return ret } }, + 'let':function(args) { + let params = args[0] + let prog = args[1] + let old_base = JSON.stringify(base) + for(let param of params) { + handle(['define',param[0],param[1]]) + } + let ret = handle(prog) + base = JSON.parse(old_base) + return ret + + }, 'exit':function(args) { process.exit(0) } diff --git a/test.js b/test.js index 6859c02..3cb2c4b 100644 --- a/test.js +++ b/test.js @@ -81,4 +81,11 @@ test('negate', t => { t.is(scheme("a"), true) t.is(scheme("b"), false) t.is(scheme("(not b)"), true) +}) + +test('let', t => { + scheme('(clear)') + scheme("(define func (lambda (n) (let ((a 5)) (- a n))))") + t.is(scheme("(func 5)"), 0) + t.is(scheme("(func (- 5))"), 10) }) \ No newline at end of file