add functions: loop, coinflip, rand

This commit is contained in:
Pekka Laiho 2020-10-18 10:24:18 +07:00
parent 80a72b616b
commit a38ef23e17
3 changed files with 22 additions and 0 deletions

View File

@ -141,6 +141,7 @@ quote | `(quote (1 2 3))` | `(1 2 3)` | Return the argument without evaluation.
Name | Example | Example result | Description
----- | ------- | -------------- | -----------
doc | `(doc +)` | `"Return the sum of all arguments."` | Show description of a built-in function.
loop | `(loop (fn (a) (do (print a) (coinflip))) "hello ")` | `hello hello hello false` | Call the given function repeatedly in a loop until it returns false.
read | `(read "(+ 1 2 3)")` | `(+ 1 2 3)` | Read a string as code and return the expression.
print | `(print "hello world")` | `"hello world"null` | Print expression on the screen. Print returns null (which is shown due to the extra print in repl). Give optional second argument as `true` to show strings in readable format.
error | `(error "invalid value")` | `error: invalid value` | Throw an exception with message as argument.
@ -266,6 +267,8 @@ floor | `(floor 2.5)` | `2` | Get the next lowest integer.
ceil | `(ceil 2.5)` | `3` | Get the next highest integer.
pow | `(pow 2 4)` | `16` | Raise the first argument to the power of the second argument.
sqrt | `(sqrt 2)` | `1.41` | Calculate the square root.
coinflip | `(coinflip)` | `true` | Return true or false with equal probability.
rand | `(rand 5 10)` | `8` | Return a random integer between given min and max values.
### String functions

View File

@ -99,5 +99,15 @@ class Math implements ILib
$env->set('sqrt', new CoreFunc('sqrt', 'Return the square root of the arguemnt.', 1, 1,
fn ($a) => sqrt($a)
));
// Random number generator
$env->set('coinflip', new CoreFunc('coinflip', 'Return true or false with equal probability.', 0, 0,
fn () => boolval(mt_rand(0, 1))
));
$env->set('rand', new CoreFunc('rand', 'Return a random integer between given min and max values.', 2, 2,
fn ($min, $max) => mt_rand($min, $max)
));
}
}

View File

@ -24,6 +24,15 @@ class LispFactory
}
));
$env->set('loop', new CoreFunc('loop', 'Call the given function repeatedly in a loop until it returns false.', 1, -1,
function (Func $f, ...$args) {
do {
$result = $f->call($args);
} while ($result);
return $result;
}
));
$env->set('read', new CoreFunc('read', 'Read string as code.', 1, 1,
fn (string $a) => $reader->read($tokenizer->tokenize($a))
));