"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;
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?"];
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"];
// @import reader.ck
// @import printer.ck
// @import env.ck
+// @import func.ck
// @import types/MalSubr.ck
// @import types/subr/*.ck
// @import reader.ck
// @import printer.ck
// @import env.ck
+// @import func.ck
// @import types/MalSubr.ck
// @import types/subr/*.ck
// @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)
{
// @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)
{
// @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)
{
// @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)
{
// @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)
{
// @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)
{
--- /dev/null
+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;
+ }
+ }
+}
--- /dev/null
+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;
+ }
+ }
+}
--- /dev/null
+public class MalIsNumber extends MalSubr
+{
+ fun MalObject call(MalObject args[])
+ {
+ if( args[0].type == "int" )
+ {
+ return Constants.TRUE;
+ }
+ else
+ {
+ return Constants.FALSE;
+ }
+ }
+}
(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))))
(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:
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 ]).
(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))))))
(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))))