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