From 1ac08934396253535efe0fd78c503d50f0d68d27 Mon Sep 17 00:00:00 2001 From: Syeerzy Date: Mon, 23 Apr 2018 14:33:29 +0800 Subject: [PATCH 01/11] add call/cc --- src/schemy/Builtins.cs | 1 + src/schemy/Continuation.cs | 51 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 52 insertions(+) create mode 100644 src/schemy/Continuation.cs diff --git a/src/schemy/Builtins.cs b/src/schemy/Builtins.cs index c20d59c..03e3615 100644 --- a/src/schemy/Builtins.cs +++ b/src/schemy/Builtins.cs @@ -49,6 +49,7 @@ public static IDictionary CreateBuiltins(Interpreter interpreter builtins[Symbol.FromString("null?")] = NativeProcedure.Create(x => x is List && ((List)x).Count == 0, "null?"); builtins[Symbol.FromString("assert")] = new NativeProcedure(AssertImpl, "assert"); builtins[Symbol.FromString("load")] = NativeProcedure.Create(filename => LoadImpl(interpreter, filename), "load"); + builtins[Symbol.FromString("call/cc")] = NativeProcedure.Create(Continuation.CallWithCurrentContinuation); return builtins; } diff --git a/src/schemy/Continuation.cs b/src/schemy/Continuation.cs new file mode 100644 index 0000000..6ef0509 --- /dev/null +++ b/src/schemy/Continuation.cs @@ -0,0 +1,51 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Threading; +namespace Schemy +{ + class Continuation: Exception + { + object Value { get; set; } + StackTrace Stack { get; set; } + Thread Thread { get; set; } + + public static object CallWithCurrentContinuation(ICallable fc1) + { + var ccc = new Continuation { Stack = new StackTrace(), Thread = Thread.CurrentThread }; + try + { + var exitproc = NativeProcedure.Create(v => + { + var f1 = new StackTrace().GetFrames(); + var c1 = ccc.Stack.GetFrames(); + var offset = f1.Length - c1.Length; + if (ccc.Thread == Thread.CurrentThread) + { + for (int i = c1.Length - 1; i >= 0; i--) + { + if (c1[i].GetMethod() != f1[i+offset].GetMethod()) + { + throw new NotImplementedException("not supported, continuation called outside dynamic extent"); + } + } + } + ccc.Value = v; + throw ccc; + }); + return fc1.Call(new List { exitproc }); + } + catch (Continuation c) + { + if (ccc == c) + { + return c.Value; + } + else + { + throw; + } + } + } + } +} From 6384fceaf195c6f080a0316e25cc5e59941b9dc5 Mon Sep 17 00:00:00 2001 From: Syeerzy Date: Mon, 23 Apr 2018 15:01:34 +0800 Subject: [PATCH 02/11] And add Continuation.cs And add Continuation.cs --- src/schemy/schemy.csproj | 1 + 1 file changed, 1 insertion(+) diff --git a/src/schemy/schemy.csproj b/src/schemy/schemy.csproj index 9149780..bea81e7 100644 --- a/src/schemy/schemy.csproj +++ b/src/schemy/schemy.csproj @@ -56,6 +56,7 @@ init.ss + From bad683dba191b171c2f61e4e948573cb16024473 Mon Sep 17 00:00:00 2001 From: Syeerzy Date: Mon, 23 Apr 2018 15:06:52 +0800 Subject: [PATCH 03/11] Add call/cc --- src/schemy/Builtins.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/schemy/Builtins.cs b/src/schemy/Builtins.cs index 03e3615..65c6a89 100644 --- a/src/schemy/Builtins.cs +++ b/src/schemy/Builtins.cs @@ -49,7 +49,7 @@ public static IDictionary CreateBuiltins(Interpreter interpreter builtins[Symbol.FromString("null?")] = NativeProcedure.Create(x => x is List && ((List)x).Count == 0, "null?"); builtins[Symbol.FromString("assert")] = new NativeProcedure(AssertImpl, "assert"); builtins[Symbol.FromString("load")] = NativeProcedure.Create(filename => LoadImpl(interpreter, filename), "load"); - builtins[Symbol.FromString("call/cc")] = NativeProcedure.Create(Continuation.CallWithCurrentContinuation); + builtins[Symbol.FromString("call/cc")] = NativeProcedure.Create(Continuation.CallWithCurrentContinuation, "call/cc"); return builtins; } From c70505a55b195122c874af46a0524910fa37a88f Mon Sep 17 00:00:00 2001 From: Syeerzy Date: Mon, 23 Apr 2018 15:15:32 +0800 Subject: [PATCH 04/11] Update tests.ss Add call/cc test --- src/test/tests.ss | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/src/test/tests.ss b/src/test/tests.ss index 7821c2d..bf4b36c 100644 --- a/src/test/tests.ss +++ b/src/test/tests.ss @@ -114,6 +114,25 @@ (* a b))) (assert (= 20 x))) +(define (test-call/cc) + ; test call/cc + (assert + (= 20 + (call/cc + (lambda (k) + (* 5 4))))) + (assert + (= 4 + (call/cc + (lambda (k) + (* 5 (k 4)))))) + (assert + (= 6 + (+ 2 (call/cc + (lambda (k) + (* 5 (k 4)))))))) + + ;; ========= ;; RUN TESTS @@ -132,7 +151,7 @@ (test-list) (test-syntax) (test-macro) - +(test-call/cc) ;; ======================= ;; Interpreter integration From d2a4bfe9682d5900c40aadfcee4fb902edd67100 Mon Sep 17 00:00:00 2001 From: Syeerzy Date: Mon, 23 Apr 2018 15:20:07 +0800 Subject: [PATCH 05/11] Update README.md call/cc now supported --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index 620010c..f5dfe15 100644 --- a/README.md +++ b/README.md @@ -39,7 +39,6 @@ It has most features that a language would support: Many Scheme features are not (yet) supported. Among those are: -* continuation (`call/cc`) * use square brackets `[...]` in place of parenthesis `(...)` From 6badb3b2a62b3d0a549cd1ecb14b88208e92663e Mon Sep 17 00:00:00 2001 From: Syeerzy Date: Mon, 23 Apr 2018 16:03:48 +0800 Subject: [PATCH 06/11] formatting --- src/schemy/Continuation.cs | 58 +++++++++++++++++++------------------- 1 file changed, 29 insertions(+), 29 deletions(-) diff --git a/src/schemy/Continuation.cs b/src/schemy/Continuation.cs index 6ef0509..2d63498 100644 --- a/src/schemy/Continuation.cs +++ b/src/schemy/Continuation.cs @@ -5,46 +5,46 @@ namespace Schemy { class Continuation: Exception - { - object Value { get; set; } - StackTrace Stack { get; set; } - Thread Thread { get; set; } + { + object Value { get; set; } + StackTrace Stack { get; set; } + Thread Thread { get; set; } - public static object CallWithCurrentContinuation(ICallable fc1) - { - var ccc = new Continuation { Stack = new StackTrace(), Thread = Thread.CurrentThread }; - try + public static object CallWithCurrentContinuation(ICallable fc1) + { + var ccc = new Continuation { Stack = new StackTrace(), Thread = Thread.CurrentThread }; + try { var exitproc = NativeProcedure.Create(v => - { - var f1 = new StackTrace().GetFrames(); - var c1 = ccc.Stack.GetFrames(); + { + var f1 = new StackTrace().GetFrames(); + var c1 = ccc.Stack.GetFrames(); var offset = f1.Length - c1.Length; - if (ccc.Thread == Thread.CurrentThread) - { - for (int i = c1.Length - 1; i >= 0; i--) - { - if (c1[i].GetMethod() != f1[i+offset].GetMethod()) - { - throw new NotImplementedException("not supported, continuation called outside dynamic extent"); - } - } - } - ccc.Value = v; - throw ccc; - }); + if (ccc.Thread == Thread.CurrentThread) + { + for (int i = c1.Length - 1; i >= 0; i--) + { + if (c1[i].GetMethod() != f1[i+offset].GetMethod()) + { + throw new NotImplementedException("not supported, continuation called outside dynamic extent"); + } + } + } + ccc.Value = v; + throw ccc; + }); return fc1.Call(new List { exitproc }); } - catch (Continuation c) - { - if (ccc == c) + catch (Continuation c) + { + if (ccc == c) { - return c.Value; + return c.Value; } else { throw; - } + } } } } From 1eaa7e78025134ec0e549cac41b227ee06ea44b1 Mon Sep 17 00:00:00 2001 From: Syeerzy Date: Mon, 23 Apr 2018 16:46:31 +0800 Subject: [PATCH 07/11] formatting repace space with tab --- src/schemy/Continuation.cs | 70 +++++++++++++++++++------------------- 1 file changed, 35 insertions(+), 35 deletions(-) diff --git a/src/schemy/Continuation.cs b/src/schemy/Continuation.cs index 2d63498..dc54cd5 100644 --- a/src/schemy/Continuation.cs +++ b/src/schemy/Continuation.cs @@ -1,50 +1,50 @@ -using System; +using System; using System.Collections.Generic; using System.Diagnostics; using System.Threading; namespace Schemy { - class Continuation: Exception - { - object Value { get; set; } - StackTrace Stack { get; set; } - Thread Thread { get; set; } - - public static object CallWithCurrentContinuation(ICallable fc1) - { - var ccc = new Continuation { Stack = new StackTrace(), Thread = Thread.CurrentThread }; - try + class Continuation : Exception + { + object Value { get; set; } + StackTrace Stack { get; set; } + Thread Thread { get; set; } + + public static object CallWithCurrentContinuation(ICallable fc1) + { + var ccc = new Continuation { Stack = new StackTrace(), Thread = Thread.CurrentThread }; + try { - var exitproc = NativeProcedure.Create(v => - { - var f1 = new StackTrace().GetFrames(); - var c1 = ccc.Stack.GetFrames(); - var offset = f1.Length - c1.Length; - if (ccc.Thread == Thread.CurrentThread) - { - for (int i = c1.Length - 1; i >= 0; i--) - { - if (c1[i].GetMethod() != f1[i+offset].GetMethod()) - { - throw new NotImplementedException("not supported, continuation called outside dynamic extent"); - } - } - } - ccc.Value = v; - throw ccc; - }); + var exitproc = NativeProcedure.Create(v => + { + var f1 = new StackTrace().GetFrames(); + var c1 = ccc.Stack.GetFrames(); + var offset = f1.Length - c1.Length; + if (ccc.Thread == Thread.CurrentThread) + { + for (int i = c1.Length - 1; i >= 0; i--) + { + if (c1[i].GetMethod() != f1[i + offset].GetMethod()) + { + throw new NotImplementedException("not supported, continuation called outside dynamic extent"); + } + } + } + ccc.Value = v; + throw ccc; + }); return fc1.Call(new List { exitproc }); - } - catch (Continuation c) - { - if (ccc == c) + } + catch (Continuation c) + { + if (ccc == c) { - return c.Value; + return c.Value; } else { throw; - } + } } } } From d6c4f9417b94354984e73629ad5a907df08b6499 Mon Sep 17 00:00:00 2001 From: David Shalom Date: Sat, 29 Dec 2018 12:22:46 +0200 Subject: [PATCH 08/11] Update Procedure.cs Arity of the NativeProcedure Create had extended to 10 in whole range (6-th, 7-th, 9-th and 10-th numbers of params added) --- src/schemy/Procedure.cs | 89 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 89 insertions(+) diff --git a/src/schemy/Procedure.cs b/src/schemy/Procedure.cs index f5618db..90319e4 100644 --- a/src/schemy/Procedure.cs +++ b/src/schemy/Procedure.cs @@ -102,6 +102,54 @@ public object Call(List args) return this.func(args); } + + /// + /// Convenient function method to create a native procedure and doing arity and type check for inputs. It makes the input function + /// implementation strongly typed. + /// + /// + public static NativeProcedure Create(Func func, string name = null) + { + return new NativeProcedure(args => + { + Utils.CheckArity(args, 9); + return func( + Utils.ConvertType(args[0]), + Utils.ConvertType(args[1]), + Utils.ConvertType(args[2]), + Utils.ConvertType(args[3]), + Utils.ConvertType(args[4]), + Utils.ConvertType(args[5]), + Utils.ConvertType(args[6]), + Utils.ConvertType(args[7]), + Utils.ConvertType(args[8]) + ); + }, name); + } + + /// + /// Convenient function method to create a native procedure and doing arity and type check for inputs. It makes the input function + /// implementation strongly typed. + /// + /// + public static NativeProcedure Create(Func func, string name = null) + { + return new NativeProcedure(args => + { + Utils.CheckArity(args, 8); + return func( + Utils.ConvertType(args[0]), + Utils.ConvertType(args[1]), + Utils.ConvertType(args[2]), + Utils.ConvertType(args[3]), + Utils.ConvertType(args[4]), + Utils.ConvertType(args[5]), + Utils.ConvertType(args[6]), + Utils.ConvertType(args[7]) + ); + }, name); + } + /// /// Convenient function method to create a native procedure and doing arity and type check for inputs. It makes the input function /// implementation strongly typed. @@ -124,6 +172,47 @@ public static NativeProcedure Create(Func + /// Convenient function method to create a native procedure and doing arity and type check for inputs. It makes the input function + /// implementation strongly typed. + /// + /// + public static NativeProcedure Create(Func func, string name = null) + { + return new NativeProcedure(args => + { + Utils.CheckArity(args, 6); + return func( + Utils.ConvertType(args[0]), + Utils.ConvertType(args[1]), + Utils.ConvertType(args[2]), + Utils.ConvertType(args[3]), + Utils.ConvertType(args[4]), + Utils.ConvertType(args[5]) + ); + }, name); + } + + /// + /// Convenient function method to create a native procedure and doing arity and type check for inputs. It makes the input function + /// implementation strongly typed. + /// + /// + public static NativeProcedure Create(Func func, string name = null) + { + return new NativeProcedure(args => + { + Utils.CheckArity(args, 5); + return func( + Utils.ConvertType(args[0]), + Utils.ConvertType(args[1]), + Utils.ConvertType(args[2]), + Utils.ConvertType(args[3]), + Utils.ConvertType(args[4]) + ); + }, name); + } + /// /// Convenient function method to create a native procedure and doing arity and type check for inputs. It makes the input function /// implementation strongly typed. From 33fa27ba9727d1ef4f825845d69a7655bd27832f Mon Sep 17 00:00:00 2001 From: David Shalom Date: Thu, 10 Jan 2019 12:35:14 +0200 Subject: [PATCH 09/11] Update Procedure.cs Some typo are fixed --- src/schemy/Procedure.cs | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/src/schemy/Procedure.cs b/src/schemy/Procedure.cs index 90319e4..f7584a3 100644 --- a/src/schemy/Procedure.cs +++ b/src/schemy/Procedure.cs @@ -121,8 +121,8 @@ public static NativeProcedure Create(Fu Utils.ConvertType(args[4]), Utils.ConvertType(args[5]), Utils.ConvertType(args[6]), - Utils.ConvertType(args[7]), - Utils.ConvertType(args[8]) + Utils.ConvertType(args[7]), + Utils.ConvertType(args[8]) ); }, name); } @@ -145,7 +145,7 @@ public static NativeProcedure Create(Func(args[4]), Utils.ConvertType(args[5]), Utils.ConvertType(args[6]), - Utils.ConvertType(args[7]) + Utils.ConvertType(args[7]) ); }, name); } @@ -258,7 +258,9 @@ public static NativeProcedure Create(Func func, string n return new NativeProcedure(args => { Utils.CheckArity(args, 2); - return func(Utils.ConvertType(args[0]), Utils.ConvertType(args[1])); + return func( + Utils.ConvertType(args[0]), + Utils.ConvertType(args[1])); }, name); } @@ -275,7 +277,9 @@ public static NativeProcedure Create(Func func, string name = nu return new NativeProcedure(args => { Utils.CheckArity(args, 1); - return func(Utils.ConvertType(args[0])); + return func( + Utils.ConvertType(args[0]) + ); }, name); } From 698f294cc584b9ae1aa180437c15b2f17ee275f2 Mon Sep 17 00:00:00 2001 From: David Shalom Date: Sat, 19 Jan 2019 17:55:13 +0200 Subject: [PATCH 10/11] added as a NativeProcedure --- src/schemy/Builtins.cs | 74 ++++++++++++++++++++++-------------------- 1 file changed, 39 insertions(+), 35 deletions(-) diff --git a/src/schemy/Builtins.cs b/src/schemy/Builtins.cs index 65c6a89..1c86bf6 100644 --- a/src/schemy/Builtins.cs +++ b/src/schemy/Builtins.cs @@ -15,41 +15,45 @@ public class Builtins { public static IDictionary CreateBuiltins(Interpreter interpreter) { - var builtins = new Dictionary(); - - builtins[Symbol.FromString("+")] = new NativeProcedure(Utils.MakeVariadic(Add), "+"); - builtins[Symbol.FromString("-")] = new NativeProcedure(Utils.MakeVariadic(Minus), "-"); - builtins[Symbol.FromString("*")] = new NativeProcedure(Utils.MakeVariadic(Multiply), "*"); - builtins[Symbol.FromString("/")] = new NativeProcedure(Utils.MakeVariadic(Divide), "/"); - builtins[Symbol.FromString("=")] = NativeProcedure.Create((x, y) => x == y, "="); - builtins[Symbol.FromString("<")] = NativeProcedure.Create((x, y) => x < y, "<"); - builtins[Symbol.FromString("<=")] = NativeProcedure.Create((x, y) => x <= y, "<="); - builtins[Symbol.FromString(">")] = NativeProcedure.Create((x, y) => x > y, ">"); - builtins[Symbol.FromString(">=")] = NativeProcedure.Create((x, y) => x >= y, ">="); - builtins[Symbol.FromString("eq?")] = NativeProcedure.Create((x, y) => object.ReferenceEquals(x, y), "eq?"); - builtins[Symbol.FromString("equal?")] = NativeProcedure.Create(EqualImpl, "equal?"); - builtins[Symbol.FromString("boolean?")] = NativeProcedure.Create(x => x is bool, "boolean?"); - builtins[Symbol.FromString("num?")] = NativeProcedure.Create(x => x is int || x is double, "num?"); - builtins[Symbol.FromString("string?")] = NativeProcedure.Create(x => x is string, "string?"); - builtins[Symbol.FromString("symbol?")] = NativeProcedure.Create(x => x is Symbol, "symbol?"); - builtins[Symbol.FromString("list?")] = NativeProcedure.Create(x => x is List, "list?"); - builtins[Symbol.FromString("map")] = NativeProcedure.Create, List>((func, ls) => ls.Select(x => func.Call(new List { x })).ToList()); - builtins[Symbol.FromString("reverse")] = NativeProcedure.Create, List>(ls => ls.Reverse().ToList()); - builtins[Symbol.FromString("range")] = new NativeProcedure(RangeImpl, "range"); - builtins[Symbol.FromString("apply")] = NativeProcedure.Create, object>((proc, args) => proc.Call(args), "apply"); - builtins[Symbol.FromString("list")] = new NativeProcedure(args => args, "list"); - builtins[Symbol.FromString("list-ref")] = NativeProcedure.Create, int, object>((ls, idx) => ls[idx]); - builtins[Symbol.FromString("length")] = NativeProcedure.Create, int>(list => list.Count, "length"); - builtins[Symbol.FromString("car")] = NativeProcedure.Create, object>(args => args[0], "car"); - builtins[Symbol.FromString("cdr")] = NativeProcedure.Create, List>(args => args.Skip(1).ToList(), "cdr"); - builtins[Symbol.CONS] = NativeProcedure.Create, List>((x, ys) => Enumerable.Concat(new[] { x }, ys).ToList(), "cons"); - builtins[Symbol.FromString("not")] = NativeProcedure.Create(x => !x, "not"); - builtins[Symbol.APPEND] = NativeProcedure.Create, List, List>((l1, l2) => Enumerable.Concat(l1, l2).ToList(), "append"); - builtins[Symbol.FromString("null")] = NativeProcedure.Create(() => (object)null, "null"); - builtins[Symbol.FromString("null?")] = NativeProcedure.Create(x => x is List && ((List)x).Count == 0, "null?"); - builtins[Symbol.FromString("assert")] = new NativeProcedure(AssertImpl, "assert"); - builtins[Symbol.FromString("load")] = NativeProcedure.Create(filename => LoadImpl(interpreter, filename), "load"); - builtins[Symbol.FromString("call/cc")] = NativeProcedure.Create(Continuation.CallWithCurrentContinuation, "call/cc"); + var builtins = new Dictionary() + { + + [Symbol.FromString("+")] = new NativeProcedure(Utils.MakeVariadic(Add), "+"), + [Symbol.FromString("-")] = new NativeProcedure(Utils.MakeVariadic(Minus), "-"), + [Symbol.FromString("*")] = new NativeProcedure(Utils.MakeVariadic(Multiply), "*"), + [Symbol.FromString("/")] = new NativeProcedure(Utils.MakeVariadic(Divide), "/"), + [Symbol.FromString("=")] = NativeProcedure.Create((x, y) => x == y, "="), + [Symbol.FromString("<")] = NativeProcedure.Create((x, y) => x < y, "<"), + [Symbol.FromString("<=")] = NativeProcedure.Create((x, y) => x <= y, "<="), + [Symbol.FromString(">")] = NativeProcedure.Create((x, y) => x > y, ">"), + [Symbol.FromString(">=")] = NativeProcedure.Create((x, y) => x >= y, ">="), + [Symbol.FromString("eq?")] = NativeProcedure.Create((x, y) => object.ReferenceEquals(x, y), "eq?"), + [Symbol.FromString("equal?")] = NativeProcedure.Create(EqualImpl, "equal?"), + [Symbol.FromString("boolean?")] = NativeProcedure.Create(x => x is bool, "boolean?"), + [Symbol.FromString("num?")] = NativeProcedure.Create(x => x is int || x is double, "num?"), + [Symbol.FromString("string?")] = NativeProcedure.Create(x => x is string, "string?"), + [Symbol.FromString("symbol?")] = NativeProcedure.Create(x => x is Symbol, "symbol?"), + [Symbol.FromString("procedure?")] = NativeProcedure.Create(x => x is Procedure || x is NativeProcedure, "procedure?"), + [Symbol.FromString("list?")] = NativeProcedure.Create(x => x is List, "list?"), + [Symbol.FromString("map")] = NativeProcedure.Create, List>((func, ls) => ls.Select(x => func.Call(new List { x })).ToList()), + [Symbol.FromString("reverse")] = NativeProcedure.Create, List>(ls => ls.Reverse().ToList()), + [Symbol.FromString("range")] = new NativeProcedure(RangeImpl, "range"), + [Symbol.FromString("apply")] = NativeProcedure.Create, object>((proc, args) => proc.Call(args), "apply"), + [Symbol.FromString("list")] = new NativeProcedure(args => args, "list"), + [Symbol.FromString("list-ref")] = NativeProcedure.Create, int, object>((ls, idx) => ls[idx]), + [Symbol.FromString("length")] = NativeProcedure.Create, int>(list => list.Count, "length"), + [Symbol.FromString("car")] = NativeProcedure.Create, object>(args => args[0], "car"), + [Symbol.FromString("cdr")] = NativeProcedure.Create, List>(args => args.Skip(1).ToList(), "cdr"), + [Symbol.CONS] = NativeProcedure.Create, List>((x, ys) => Enumerable.Concat(new[] { x }, ys).ToList(), "cons"), + [Symbol.FromString("not")] = NativeProcedure.Create(x => !x, "not"), + [Symbol.APPEND] = NativeProcedure.Create, List, List>((l1, l2) => Enumerable.Concat(l1, l2).ToList(), "append"), + [Symbol.FromString("null")] = NativeProcedure.Create(() => (object)null, "null"), + [Symbol.FromString("null?")] = NativeProcedure.Create(x => x is List && ((List)x).Count == 0, "null?"), + [Symbol.FromString("assert")] = new NativeProcedure(AssertImpl, "assert"), + [Symbol.FromString("load")] = NativeProcedure.Create(filename => LoadImpl(interpreter, filename), "load"), + [Symbol.FromString("call/cc")] = NativeProcedure.Create(Continuation.CallWithCurrentContinuation, "call/cc") + + }; return builtins; } From 24010250e3a20136c4faf45fddae7bc95c8cdada Mon Sep 17 00:00:00 2001 From: David Shalom Date: Mon, 21 Jan 2019 12:36:50 +0200 Subject: [PATCH 11/11] procedure? is fixed --- src/schemy/Builtins.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/schemy/Builtins.cs b/src/schemy/Builtins.cs index 1c86bf6..6a6762b 100644 --- a/src/schemy/Builtins.cs +++ b/src/schemy/Builtins.cs @@ -33,7 +33,7 @@ public static IDictionary CreateBuiltins(Interpreter interpreter [Symbol.FromString("num?")] = NativeProcedure.Create(x => x is int || x is double, "num?"), [Symbol.FromString("string?")] = NativeProcedure.Create(x => x is string, "string?"), [Symbol.FromString("symbol?")] = NativeProcedure.Create(x => x is Symbol, "symbol?"), - [Symbol.FromString("procedure?")] = NativeProcedure.Create(x => x is Procedure || x is NativeProcedure, "procedure?"), + [Symbol.FromString("procedure?")] = NativeProcedure.Create(x => x is ICallable, "procedure?"), [Symbol.FromString("list?")] = NativeProcedure.Create(x => x is List, "list?"), [Symbol.FromString("map")] = NativeProcedure.Create, List>((func, ls) => ls.Select(x => func.Call(new List { x })).ToList()), [Symbol.FromString("reverse")] = NativeProcedure.Create, List>(ls => ls.Reverse().ToList()),