-
Notifications
You must be signed in to change notification settings - Fork 1
/
repl.php
77 lines (59 loc) · 1.28 KB
/
repl.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
<?php
namespace igorw\lambda;
use Symfony\Component\Debug\ErrorHandler;
require 'vendor/autoload.php';
function prompt($mode, $interactive)
{
if ($interactive) {
echo "$mode> ";
}
return true;
}
function format_raw($result)
{
return dump($result);
}
function identity($x)
{
return $x;
}
function format($result)
{
if (is_bool($result)) {
return json_encode($result);
}
return $result;
}
$mode = 'i';
foreach (['b', 'r'] as $flag) {
if (in_array("-$flag", $argv, true)) {
$mode = $flag;
break;
}
}
$interactive = true;
if (in_array('-n', $argv, true)) {
$interactive = false;
}
while (prompt($mode, $interactive) && false !== ($line = fgets(STDIN))) {
$exp = trim($line);
$factories = [
'i' => 'igorw\lambda\to_int',
'b' => 'igorw\lambda\to_bool',
'r' => 'igorw\lambda\identity',
];
if (in_array($exp, array_keys($factories), true)) {
$mode = $exp;
continue;
}
try {
$factory = $factories[$mode];
$format = __NAMESPACE__.'\\'.('r' === $mode ? 'format_raw' : 'format');
echo $format(evaluate($factory(parse($exp))))."\n";
} catch (\Exception $e) {
echo $e->getMessage()."\n";
}
}
if ($interactive) {
echo "\n";
}