aboutsummaryrefslogtreecommitdiff
path: root/lib/tools/repl.nom
blob: 2c0d3dfccdf9b0be1d70ded8bc9143a4375970a8 (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
86
#!/usr/bin/env nomsu -V6.14
#
    This file defines a Read-Evaluate-Print-Loop (REPL) for Nomsu
    
use "consolecolor"
use "filesystem"
use "commandline"

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

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.
    ")

command line program with $args:
    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 with $err:
            say $err
            do next
        
        unless $tree:
            do next
        
        for $chunk in $tree:
            try:
                $lua = ($chunk as lua)
            ..if it fails with $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 with $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"