diff --git a/bootstrap.php b/bootstrap.php index 237f3cc..e8aec54 100644 --- a/bootstrap.php +++ b/bootstrap.php @@ -16,6 +16,7 @@ function ml_get_lisp(): array (new MadLisp\Lib\Math())->register($env); (new MadLisp\Lib\Compare())->register($env); + (new MadLisp\Lib\Types())->register($env); /* $env->set('eval', function (...$args) use ($eval, $env) { diff --git a/src/Lib/Core.php b/src/Lib/Core.php deleted file mode 100644 index 906773b..0000000 --- a/src/Lib/Core.php +++ /dev/null @@ -1,53 +0,0 @@ -set('type?', function ($a) { - if ($a instanceof Func) { - return 'function'; - } elseif ($a instanceof MList) { - return 'list'; - } elseif ($a instanceof Hash) { - return 'hash'; - } elseif ($a instanceof Symbol) { - return 'symbol'; - } elseif ($a === true || $a === false) { - return 'bool'; - } elseif ($a === null) { - return 'null'; - } elseif (is_int($a)) { - return 'int'; - } elseif (is_float($a)) { - return 'float'; - } else { - return 'string'; - } - }); - - $env->set('fn?', fn ($a) => $a instanceof Func); - $env->set('list?', fn ($a) => $a instanceof MList); - $env->set('hash?', fn ($a) => $a instanceof Hash); - $env->set('sym?', fn ($a) => $a instanceof Symbol); - $env->set('bool?', fn ($a) => $a === true || $a === false); - $env->set('true?', fn ($a) => $a == true); // not strict - $env->set('false?', fn ($a) => $a == false); // not strict - $env->set('null?', fn ($a) => $a === null); - $env->set('int?', fn ($a) => is_int($a)); - $env->set('float?', fn ($a) => is_float($a)); - $env->set('str?', fn ($a) => is_string($a)); - - } -} diff --git a/src/Lib/Types.php b/src/Lib/Types.php new file mode 100644 index 0000000..d723c48 --- /dev/null +++ b/src/Lib/Types.php @@ -0,0 +1,97 @@ +set('type?', new CoreFunc('type?', 'Return the type of argument as a string.', 1, 1, + function ($a) { + if ($a instanceof Func) { + return 'function'; + } elseif ($a instanceof MList) { + return 'list'; + } elseif ($a instanceof Vector) { + return 'vector'; + } elseif ($a instanceof Hash) { + return 'hash'; + } elseif ($a instanceof Symbol) { + return 'symbol'; + } elseif ($a === true || $a === false) { + return 'bool'; + } elseif ($a === null) { + return 'null'; + } elseif (is_int($a)) { + return 'int'; + } elseif (is_float($a)) { + return 'float'; + } else { + return 'string'; + } + } + )); + + $env->set('fn?', new CoreFunc('fn?', 'Return true if argument is a function.', 1, 1, + fn ($a) => $a instanceof Func + )); + + $env->set('list?', new CoreFunc('list?', 'Return true if argument is a list.', 1, 1, + fn ($a) => $a instanceof MList + )); + + $env->set('vector?', new CoreFunc('vector?', 'Return true if argument is a vector.', 1, 1, + fn ($a) => $a instanceof Vector + )); + + $env->set('seq?', new CoreFunc('seq?', 'Return true if argument is a list or a vector.', 1, 1, + fn ($a) => $a instanceof Seq + )); + + $env->set('hash?', new CoreFunc('hash?', 'Return true if argument is a hash map.', 1, 1, + fn ($a) => $a instanceof Hash + )); + + $env->set('symbol?', new CoreFunc('symbol?', 'Return true if argument is a symbol.', 1, 1, + fn ($a) => $a instanceof Symbol + )); + + $env->set('bool?', new CoreFunc('bool?', 'Return true if argument is a boolean.', 1, 1, + fn ($a) => $a === true || $a === false + )); + + $env->set('true?', new CoreFunc('true?', 'Return true if argument evaluates to true.', 1, 1, + fn ($a) => $a == true // not strict + )); + + $env->set('false?', new CoreFunc('false?', 'Return true if argument evaluates to false.', 1, 1, + fn ($a) => $a == false // not strict + )); + + $env->set('null?', new CoreFunc('null?', 'Return true if argument is null.', 1, 1, + fn ($a) => $a === null + )); + + $env->set('int?', new CoreFunc('int?', 'Return true if argument is an integer.', 1, 1, + fn ($a) => is_int($a) + )); + + $env->set('float?', new CoreFunc('float?', 'Return true if argument is a float.', 1, 1, + fn ($a) => is_float($a) + )); + + $env->set('str?', new CoreFunc('str?', 'Return true if argument is a string.', 1, 1, + fn ($a) => is_string($a) + )); + } +}