elisp, chuck, pil, gst, scheme: Add number?, fn?, macro?
authorVasilij Schneidermann <mail@vasilij.de>
Tue, 10 Oct 2017 16:29:36 +0000 (18:29 +0200)
committerVasilij Schneidermann <mail@vasilij.de>
Tue, 10 Oct 2017 16:29:36 +0000 (18:29 +0200)
16 files changed:
chuck/core.ck
chuck/step2_eval.ck
chuck/step3_env.ck
chuck/step4_if_fn_do.ck
chuck/step5_tco.ck
chuck/step6_file.ck
chuck/step7_quote.ck
chuck/step8_macros.ck
chuck/step9_try.ck
chuck/types/subr/MalIsFn.ck [new file with mode: 0644]
chuck/types/subr/MalIsMacro.ck [new file with mode: 0644]
chuck/types/subr/MalIsNumber.ck [new file with mode: 0644]
elisp/core.el
gst/core.st
pil/core.l
scheme/lib/core.sld

index 7c1eb63..7f3f21f 100644 (file)
@@ -14,10 +14,10 @@ public class Core
  "nth", "first", "rest",
  "throw",
  "apply", "map",
- "nil?", "true?", "false?", "symbol?", "keyword?", "vector?", "map?",
+ "nil?", "true?", "false?", "number?", "symbol?", "keyword?", "vector?", "map?",
  "symbol", "keyword", "vector", "hash-map",
  "assoc", "dissoc", "get", "contains?", "keys", "vals",
- "sequential?",
+ "sequential?", "fn?", "macro?",
  "readline", "meta", "with-meta",
  "time-ms", "conj", "string?", "seq"] @=> Core.names;
 MalSubr ns[0] @=> Core.ns;
@@ -67,6 +67,7 @@ new MalMap @=> Core.ns["map"];
 new MalIsNil @=> Core.ns["nil?"];
 new MalIsTrue @=> Core.ns["true?"];
 new MalIsFalse @=> Core.ns["false?"];
+new MalIsNumber @=> Core.ns["number?"];
 new MalIsSymbol @=> Core.ns["symbol?"];
 new MalIsKeyword @=> Core.ns["keyword?"];
 new MalIsVector @=> Core.ns["vector?"];
@@ -85,6 +86,8 @@ new MalKeys @=> Core.ns["keys"];
 new MalVals @=> Core.ns["vals"];
 
 new MalSequential @=> Core.ns["sequential?"];
+new MalIsFn @=> Core.ns["fn?"];
+new MalIsMacro @=> Core.ns["macro?"];
 
 new MalReadline @=> Core.ns["readline"];
 new MalMeta @=> Core.ns["meta"];
index 6795783..d3753ae 100644 (file)
@@ -17,6 +17,7 @@
 // @import reader.ck
 // @import printer.ck
 // @import env.ck
+// @import func.ck
 // @import types/MalSubr.ck
 // @import types/subr/*.ck
 
index 2d2b1ba..7c0bb7c 100644 (file)
@@ -17,6 +17,7 @@
 // @import reader.ck
 // @import printer.ck
 // @import env.ck
+// @import func.ck
 // @import types/MalSubr.ck
 // @import types/subr/*.ck
 
index 09c0ae5..16a4cd9 100644 (file)
 // @import reader.ck
 // @import printer.ck
 // @import env.ck
+// @import func.ck
 // @import types/MalSubr.ck
 // @import types/subr/*.ck
 // @import core.ck
-// @import func.ck
 
 fun MalObject READ(string input)
 {
index da2a230..cc07f5f 100644 (file)
 // @import reader.ck
 // @import printer.ck
 // @import env.ck
+// @import func.ck
 // @import types/MalSubr.ck
 // @import types/subr/*.ck
 // @import core.ck
-// @import func.ck
 
 fun MalObject READ(string input)
 {
index 0102daa..f9c5a4b 100644 (file)
 // @import reader.ck
 // @import printer.ck
 // @import env.ck
+// @import func.ck
 // @import types/MalSubr.ck
 // @import types/subr/*.ck
 // @import core.ck
-// @import func.ck
 
 fun MalObject READ(string input)
 {
index c89d91d..d1aef64 100644 (file)
 // @import reader.ck
 // @import printer.ck
 // @import env.ck
+// @import func.ck
 // @import types/MalSubr.ck
 // @import types/subr/*.ck
 // @import core.ck
-// @import func.ck
 
 fun MalObject READ(string input)
 {
index a9020ea..09b3a54 100644 (file)
 // @import reader.ck
 // @import printer.ck
 // @import env.ck
+// @import func.ck
 // @import types/MalSubr.ck
 // @import types/subr/*.ck
 // @import core.ck
-// @import func.ck
 
 fun MalObject READ(string input)
 {
index a95cb5a..c040462 100644 (file)
 // @import reader.ck
 // @import printer.ck
 // @import env.ck
+// @import func.ck
 // @import types/MalSubr.ck
 // @import types/subr/*.ck
 // @import core.ck
-// @import func.ck
 
 fun MalObject READ(string input)
 {
diff --git a/chuck/types/subr/MalIsFn.ck b/chuck/types/subr/MalIsFn.ck
new file mode 100644 (file)
index 0000000..a3df613
--- /dev/null
@@ -0,0 +1,15 @@
+public class MalIsFn extends MalSubr
+{
+    fun MalObject call(MalObject args[])
+    {
+        if( args[0].type == "subr" || ( args[0].type == "func" &&
+                                        !(args[0]$Func).isMacro ) )
+        {
+            return Constants.TRUE;
+        }
+        else
+        {
+            return Constants.FALSE;
+        }
+    }
+}
diff --git a/chuck/types/subr/MalIsMacro.ck b/chuck/types/subr/MalIsMacro.ck
new file mode 100644 (file)
index 0000000..1ed2fc7
--- /dev/null
@@ -0,0 +1,14 @@
+public class MalIsMacro extends MalSubr
+{
+    fun MalObject call(MalObject args[])
+    {
+        if( args[0].type == "func" && (args[0]$Func).isMacro )
+        {
+            return Constants.TRUE;
+        }
+        else
+        {
+            return Constants.FALSE;
+        }
+    }
+}
diff --git a/chuck/types/subr/MalIsNumber.ck b/chuck/types/subr/MalIsNumber.ck
new file mode 100644 (file)
index 0000000..09231ce
--- /dev/null
@@ -0,0 +1,14 @@
+public class MalIsNumber extends MalSubr
+{
+    fun MalObject call(MalObject args[])
+    {
+        if( args[0].type == "int" )
+        {
+            return Constants.TRUE;
+        }
+        else
+        {
+            return Constants.FALSE;
+        }
+    }
+}
index 28b8e85..a9ecbd4 100644 (file)
     (true? . ,(mal-fn (lambda (arg) (if (mal-true-p arg) mal-true mal-false))))
     (false? . ,(mal-fn (lambda (arg) (if (mal-false-p arg) mal-true mal-false))))
 
+    (number? . ,(mal-fn (lambda (arg) (if (mal-number-p arg) mal-true mal-false))))
     (symbol? . ,(mal-fn (lambda (arg) (if (mal-symbol-p arg) mal-true mal-false))))
     (keyword? . ,(mal-fn (lambda (arg) (if (mal-keyword-p arg) mal-true mal-false))))
     (string? . ,(mal-fn (lambda (arg) (if (mal-string-p arg) mal-true mal-false))))
                              (mal-map map)))))
 
     (sequential? . ,(mal-fn 'mal-seq-p))
+    (fn? . ,(mal-fn (lambda (arg) (if (or (mal-fn-p arg)
+                                          (and (mal-func-p arg)
+                                               (not (mal-func-macro-p arg))))
+                                      mal-true
+                                    mal-false))))
+    (macro? . ,(mal-fn (lambda (arg) (if (and (mal-func-p arg)
+                                              (mal-func-macro-p arg))
+                                         mal-true
+                                       mal-false))))
 
     (get . ,(mal-fn (lambda (map key) (if (mal-map-p map) (or (gethash key (mal-value map)) mal-nil) mal-nil))))
     (contains? . ,(mal-fn (lambda (map key) (if (gethash key (mal-value map)) mal-true mal-false))))
index d1c52de..bb85438 100644 (file)
@@ -195,6 +195,8 @@ Core Ns at: #'true?' put:
     (Fn new: [ :args | Core coerce: [ args first type = #true ] ]).
 Core Ns at: #'false?' put:
     (Fn new: [ :args | Core coerce: [ args first type = #false ] ]).
+Core Ns at: #'number?' put:
+    (Fn new: [ :args | Core coerce: [ args first type = #number ] ]).
 Core Ns at: #'symbol?' put:
     (Fn new: [ :args | Core coerce: [ args first type = #symbol ] ]).
 Core Ns at: #'keyword?' put:
@@ -208,6 +210,13 @@ Core Ns at: #'map?' put:
 Core Ns at: #'sequential?' put:
     (Fn new: [ :args | Core coerce: [ args first type = #list or:
                                      [ args first type = #vector ] ] ]).
+Core Ns at: #'fn?' put:
+    (Fn new: [ :args | Core coerce: [ args first type = #fn or:
+                                     [ args first type = #func and:
+                                      [ args first isMacro not ] ] ] ]).
+Core Ns at: #'macro?' put:
+    (Fn new: [ :args | Core coerce: [ args first type = #func and:
+                                     [ args first isMacro ] ] ]).
 
 Core Ns at: #symbol put:
     (Fn new: [ :args | MALSymbol new: args first value asSymbol ]).
index 5a22963..0ef572c 100644 (file)
      (nil? . `(MAL-fn '((X) (if (= (MAL-type X) 'nil) *MAL-true *MAL-false))))
      (true? . `(MAL-fn '((X) (if (= (MAL-type X) 'true) *MAL-true *MAL-false))))
      (false? . `(MAL-fn '((X) (if (= (MAL-type X) 'false) *MAL-true *MAL-false))))
+     (number? . `(MAL-fn '((X) (if (= (MAL-type X) 'number) *MAL-true *MAL-false))))
      (symbol? . `(MAL-fn '((X) (if (= (MAL-type X) 'symbol) *MAL-true *MAL-false))))
      (keyword? . `(MAL-fn '((X) (if (= (MAL-type X) 'keyword) *MAL-true *MAL-false))))
      (string? . `(MAL-fn '((X) (if (= (MAL-type X) 'string) *MAL-true *MAL-false))))
      (vector? . `(MAL-fn '((X) (if (= (MAL-type X) 'vector) *MAL-true *MAL-false))))
      (map? . `(MAL-fn '((X) (if (= (MAL-type X) 'map) *MAL-true *MAL-false))))
      (sequential? . `(MAL-fn '((X) (if (MAL-seq? X) *MAL-true *MAL-false))))
+     (fn? . `(MAL-fn '((X) (if (or (= (MAL-type X) 'fn) (and (= (MAL-type X) 'func) (not (get X 'is-macro)))) *MAL-true *MAL-false))))
+     (macro? . `(MAL-fn '((X) (if (and (= (MAL-type X) 'func) (get X 'is-macro)) *MAL-true *MAL-false))))
 
      (symbol . `(MAL-fn '((Name) (MAL-symbol (MAL-value Name)))))
      (keyword . `(MAL-fn '((X) (if (= (MAL-type X) 'keyword) X (MAL-keyword (MAL-value X))))))
index b6cfbe3..4d615b8 100644 (file)
     (nil? . ,(lambda (x) (coerce (eq? x mal-nil))))
     (true? . ,(lambda (x) (coerce (eq? x mal-true))))
     (false? . ,(lambda (x) (coerce (eq? x mal-false))))
+    (number? . ,(lambda (x) (coerce (mal-instance-of? x 'number))))
     (string? . ,(lambda (x) (coerce (mal-instance-of? x 'string))))
     (symbol? . ,(lambda (x) (coerce (mal-instance-of? x 'symbol))))
     (symbol . ,(lambda (x) (mal-symbol (string->symbol (mal-value x)))))
     (sequential? . ,(lambda (x) (coerce (and (mal-object? x)
                                              (memq (mal-type x)
                                                    '(list vector))))))
+    (fn? . ,(lambda (x) (coerce (or (procedure? x)
+                                    (and (func? x) (not (func-macro? x)))))))
+    (macro? . ,(lambda (x) (coerce (and (func? x) (func-macro? x)))))
 
     (assoc . ,(lambda (m . kvs) (mal-map (mal-map-assoc (mal-value m) kvs))))
     (dissoc . ,(lambda (m . keys) (mal-map (mal-map-dissoc (mal-value m) keys))))