aboutsummaryrefslogtreecommitdiff
path: root/neb/std/term.py
blob: 3c82bcfcf9836e7020bd533580ab9448c1720b6c (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
from .. import TypeEnum, Environment, Arg, Builtin, evaluate, InterpretPanic, MultiFunction
from ..structs import *
import subprocess
import sys

TERM = Environment()

def interpretClear(symbol, args, env, ns):
    subprocess.run(["clear"])
    return List([])

clear_func = Builtin("clear", interpretClear, [], return_type=Type(":list"))
clear_multi = MultiFunction("clear")
clear_multi.register(clear_func)
TERM.register("clear", clear_multi)

def interpretReadLine(symbol, args, env, ns):
    ret = input(args[0].value)
    return String(ret)

readline_func = Builtin("read-line", interpretReadLine, [Arg("prompt", TypeEnum.STRING)], return_type=Type(":string"))
readline_multi = MultiFunction("read-line")
readline_multi.register(readline_func)
TERM.register("read-line", readline_multi)

def interpretReadChar(symbol, args, env, ns):
    import termios, tty
    fd = sys.stdin.fileno()
    old = termios.tcgetattr(fd)
    try:
        tty.setraw(fd)
        ch = sys.stdin.buffer.read1(4)  # some keys are >1 bytes
    except Exception:
        raise
    finally:
        termios.tcsetattr(fd, termios.TCSADRAIN, old)
    return String(ch.decode("utf-8"))

readchar_func = Builtin("read-char", interpretReadChar, [], return_type=Type(":string"))
readchar_multi = MultiFunction("read-char")
readchar_multi.register(readchar_func)
TERM.register("read-char", readchar_multi)