aboutsummaryrefslogtreecommitdiff
path: root/tools/repl.nom
blob: c35abc58fa16517ca0beea72d9b28a13cc92f620 (plain)
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
78
79
80
81
82
83
84
85
#!/usr/bin/env nomsu -V6.14
#
    This file defines a Read-Evaluate-Print-Loop (REPL) for Nomsu
    
use "lib/consolecolor.nom"
use "lib/os.nom"

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

externally [quit, exit] all mean: lua> "os.exit(0)"
externally (help) means:
    say ("
        This is the Nomsu v\(Nomsu version) interactive console.
        You can type in Nomsu code here and hit 'enter' twice to run it.
        To exit, type 'exit' or 'quit' and hit enter twice.
    ")

say ("
    
    \(bright)\(underscore)Welcome to the Nomsu v\(Nomsu version) interactive console!\
    ..\(reset color)
           press 'enter' twice to run a command
    
")

repeat:
    say (bright (yellow ">> ")) inline
    $buff = []
    repeat:
        say (bright) inline
        $line = ($io.read "*L")
        say (reset color) inline
        if (($line == "\n") or (not $line)):
            if ((size of $buff) > 0):
                # clear the line
                say "\027[1A\027[2K" inline
            go to (run buffer)
        $buff, add ($line, with "\t" -> "    ")
        say (dim (yellow ".. ")) inline
    
    --- (run buffer) ---
    
    if ((size of $buff) == 0): stop
    $buff = ($buff, joined)
    spoof file $buff
    try:
        $tree = ($buff parsed)
    ..if it fails $err:
        say $err
        do next
    
    unless $tree:
        do next
    
    for $chunk in $tree:
        try:
            $lua = ($chunk as lua)
        ..if it fails $err: say $err
        
        unless $lua:
            do next
        
        # TODO: this is a bit hacky, it just defaults variables to global
            so that stuff mostly works across multiple lines. It would be
            nicer if local variables actually worked.
        $lua, remove free vars
        try:
            $ret = (run $lua)
        ..if it fails $err: say $err
        ..if it succeeds:
            if (type of $ret) is:
                "nil":
                    do nothing
                
                "boolean":
                    say "= \("yes" if $ret else "no")"
                
                "table":
                    if $ret.as_nomsu:
                        say "= \($ret, as nomsu)"
                    ..else:
                        say "= \$ret"
                
                else:
                    say "= \$ret"