aboutsummaryrefslogtreecommitdiff
path: root/lib/tools/repl.nom
blob: 76b35cb3b9437fb241ae34be06e721a152ed8b88 (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
87
88
89
90
91
92
93
94
#!/usr/bin/env nomsu -V6.15.13.8
#
    This file defines a Read-Evaluate-Print-Loop (REPL) for Nomsu
    
use "consolecolor"
use "filesystem"
use "commandline"

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

external:
    (help) means:
        say ("
            This is the Nomsu v\($(NOMSU VERSION), joined with ".") 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.
        ")
    
    (tutorial) means:
        (use "tools/tutorial").run_with {.extras = []}
        exit

command line program with $args:
    say ("
        
        \(bright)\(underscore)Welcome to the Nomsu v\($(NOMSU VERSION), joined with ".") interactive console!\
        ..\(reset color)
               press 'enter' twice to run a command
               type 'tutorial' to run the tutorial
        
    ")
    
    # Best way I know of to detect the number of return values and only
        print if it's >0:
    (say results of (*extra arguments*)) means:
        $N = (select "#" (*extra arguments*))
        if ($N == 0): return
        for $ in 1 to $N:
            $ret = (select $ (*extra arguments*))
            if ($ret is "Text"):
                $ret = (quote $ret)
            say "\$ret"
    
    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 ((#$buff) > 0):
                    # clear the line
                    if $(COLOR ENABLED):
                        say "\027[1A\027[2K" inline
                go to (run buffer)
            $buff, add ($line, with "\t" -> "    ")
            say (dim (yellow ".. ")) inline
        --- (run buffer) ---
        if ((#$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
        
        if ($tree.type == "Comment"):
            say (dim "Comment:\($tree.1)")
            do next
        
        if ($tree.type != "FileChunks"): $tree = [$tree]
        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
            if (load "return \($lua, text)"):
                $lua, prepend "return "
            
            try:
                say results of (run $lua)
            ..if it fails with $err: say $err