From 361e2a3c1c7d51d12c9eab86bb4a72bd2ef080bf Mon Sep 17 00:00:00 2001 From: Nat Quayle Nelson Date: Wed, 25 Nov 2020 13:59:28 -0700 Subject: [PATCH] lambda --- src/kiss/Reader.hx | 3 +++ src/kiss/SpecialForms.hx | 4 +++- src/test/cases/BasicTestCase.hx | 4 ++++ src/test/cases/BasicTestCase.kiss | 6 +++++- 4 files changed, 15 insertions(+), 2 deletions(-) diff --git a/src/kiss/Reader.hx b/src/kiss/Reader.hx index e14fbb73..7c828dba 100644 --- a/src/kiss/Reader.hx +++ b/src/kiss/Reader.hx @@ -50,6 +50,9 @@ class Reader { readTable["!"] = (stream:Stream) -> CallExp(Symbol("not").withPos(stream.position()), [assertRead(stream, readTable)]); + // Helpful for defining predicates to pass to Haxe functions: + readTable["?"] = (stream:Stream) -> CallExp(Symbol("Prelude.truthy").withPos(stream.position()), [assertRead(stream, readTable)]); + // Because macro keys are sorted by length and peekChars(0) returns "", this will be used as the default reader macro: readTable[""] = (stream) -> Symbol(nextToken(stream, "a symbol name")); diff --git a/src/kiss/SpecialForms.hx b/src/kiss/SpecialForms.hx index ecf226db..bcc62d9b 100644 --- a/src/kiss/SpecialForms.hx +++ b/src/kiss/SpecialForms.hx @@ -110,7 +110,9 @@ class SpecialForms { EBlock([EVars(varDefs).withContextPos(), EBlock(body.map(convert)).withContextPos()]).withContextPos(); }; - // TODO special form for lambda + map["lambda"] = (args:Array, convert:ExprConversion) -> { + EFunction(FArrow, Helpers.makeFunction(null, args[0], args.slice(1), convert)).withContextPos(); + }; // TODO special form for for loop // TODO special form for list comprehension diff --git a/src/test/cases/BasicTestCase.hx b/src/test/cases/BasicTestCase.hx index 2d260ed1..3824e408 100644 --- a/src/test/cases/BasicTestCase.hx +++ b/src/test/cases/BasicTestCase.hx @@ -184,4 +184,8 @@ class BasicTestCase extends Test { Assert.equals(false, BasicTestCase.myNot1); Assert.equals(false, BasicTestCase.myNot2); } + + function testLambda() { + Assert.equals([5, 6].toString(), BasicTestCase.myFilteredList.toString()); + } } diff --git a/src/test/cases/BasicTestCase.kiss b/src/test/cases/BasicTestCase.kiss index 4794c3f1..310adfb4 100644 --- a/src/test/cases/BasicTestCase.kiss +++ b/src/test/cases/BasicTestCase.kiss @@ -140,4 +140,8 @@ loc) (defvar myNot1 (not 5)) -(defvar myNot2 !5) \ No newline at end of file +(defvar myNot2 !5) + +(defvar myFilteredList (begin + (deflocal l [-1 -2 5 -3 6]) + (l.filter (lambda [v] (< 0 v))))) \ No newline at end of file