From 35ebe02e0a5a606ecc7f873f3cdb56beb9eb5b49 Mon Sep 17 00:00:00 2001 From: Pekka Laiho Date: Sat, 5 Dec 2020 11:32:25 +0700 Subject: [PATCH] move functions 'sleep' and 'timer' to Core --- README.md | 12 +++++------ src/Lib/Core.php | 52 +++++++++++++++++++++++++++++++++--------------- src/Lib/Time.php | 16 --------------- 3 files changed, 42 insertions(+), 38 deletions(-) diff --git a/README.md b/README.md index 2507c0f..f122cbf 100644 --- a/README.md +++ b/README.md @@ -165,12 +165,14 @@ Name | Example | Example result | Description debug | `(debug)` | `true` | Toggle debug output. doc | `(doc +)` | `"Return the sum of all arguments."` | Show the documentation string for a function. doc | `(doc myfn "Documentation string.")` | `"Documentation string."` | Set the documentation string for a 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. -meta | `(meta (env) "name")` | `"root/user"` | Read meta information of an entity. -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. exit | `(exit 1)` | | Terminate the script with given exit code using [exit](https://www.php.net/manual/en/function.exit.php). +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. +meta | `(meta (env) "name")` | `"root/user"` | Read meta information of an entity. +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. +read | `(read "(+ 1 2 3)")` | `(+ 1 2 3)` | Read a string as code and return the expression. +sleep | `(sleep 2000)` | `null` | Sleep for the given period given in milliseconds using [usleep](https://www.php.net/manual/en/function.usleep). +timer | `(timer (fn (d) (sleep d)) 200)` | `0.20010209` | Measure the execution time of a function and return it in seconds. ### Collection functions @@ -331,8 +333,6 @@ Name | Example | Example result | Description time | `(time)` | `1592011969` | Return the current unix timestamp using [time](https://www.php.net/manual/en/function.time). date | `(date "Y-m-d H:i:s")` | `"2020-06-13 08:33:29"` | Format the current time and date using [date](https://www.php.net/manual/en/function.date.php). strtotime | `(strtotime "2020-06-13 08:34:47")` | `1592012087` | Parse datetime string into unix timestamp using [strtotime](https://www.php.net/manual/en/function.strtotime.php). -sleep | `(sleep 2000)` | `null` | Sleep for the given period given in milliseconds using [usleep](https://www.php.net/manual/en/function.usleep). -timer | `(timer (fn (d) (sleep d)) 200)` | `0.20010209` | Measure the execution time of a function and return it in seconds. ### Type functions diff --git a/src/Lib/Core.php b/src/Lib/Core.php index ae402b1..848ef7b 100644 --- a/src/Lib/Core.php +++ b/src/Lib/Core.php @@ -60,6 +60,22 @@ class Core implements ILib } )); + // This is allowed in safe-mode, because the evaluation should be wrapped in a try-catch in embedded use. + $env->set('error', new CoreFunc('error', 'Throw an exception using argument (string) as message.', 1, 1, + function (string $error) { + // We should probably use another exception type to distinguish user-thrown errors from built-in errors. + throw new MadLispException($error); + } + )); + + if (!$this->safemode) { + $env->set('exit', new CoreFunc('exit', 'Terminate the script with given exit code.', 0, 1, + function (int $status = 0) { + exit($status); + } + )); + } + $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 { @@ -97,12 +113,6 @@ class Core implements ILib )); } - if (!$this->safemode) { - $env->set('read', new CoreFunc('read', 'Read string as code.', 1, 1, - fn (string $a) => $this->reader->read($this->tokenizer->tokenize($a)) - )); - } - if (!$this->safemode) { $env->set('print', new CoreFunc('print', 'Print argument. Give second argument as true to show strings in readable format.', 1, 2, function ($a, bool $readable = false) { @@ -112,18 +122,28 @@ class Core implements ILib )); } - // This is allowed in safe-mode, because the evaluation should be wrapped in a try-catch in embedded use. - $env->set('error', new CoreFunc('error', 'Throw an exception using argument (string) as message.', 1, 1, - function (string $error) { - // We should probably use another exception type to distinguish user-thrown errors from built-in errors. - throw new MadLispException($error); - } - )); + if (!$this->safemode) { + $env->set('read', new CoreFunc('read', 'Read string as code.', 1, 1, + fn (string $a) => $this->reader->read($this->tokenizer->tokenize($a)) + )); + } if (!$this->safemode) { - $env->set('exit', new CoreFunc('exit', 'Terminate the script with given exit code.', 0, 1, - function (int $status = 0) { - exit($status); + $env->set('sleep', new CoreFunc('sleep', 'Sleep (wait) for the specified time in milliseconds.', 1, 1, + function (int $time) { + usleep($time * 1000); + return null; + } + )); + } + + if (!$this->safemode) { + $env->set('timer', new CoreFunc('timer', 'Measure the execution time of a function and return it in seconds.', 1, -1, + function (Func $f, ...$args) { + $start = microtime(true); + $f->call($args); + $end = microtime(true); + return $end - $start; } )); } diff --git a/src/Lib/Time.php b/src/Lib/Time.php index 6a7c2ca..746c707 100644 --- a/src/Lib/Time.php +++ b/src/Lib/Time.php @@ -20,21 +20,5 @@ class Time implements ILib $env->set('strtotime', new CoreFunc('strtotime', 'Parse datetime string into unix timestamp. Optional second argument can be used to give time for relative formats.', 1, 2, fn (string $format, ?int $time = null) => strtotime($format, $time !== null ? $time : time()) )); - - $env->set('sleep', new CoreFunc('sleep', 'Sleep (wait) for the specified time in milliseconds.', 1, 1, - function (int $time) { - usleep($time * 1000); - return null; - } - )); - - $env->set('timer', new CoreFunc('timer', 'Measure the execution time of a function and return it in seconds.', 1, -1, - function (Func $f, ...$args) { - $start = microtime(true); - $f->call($args); - $end = microtime(true); - return $end - $start; - } - )); } }