q-form renaming effort
This commit is contained in:
+13
-13
@@ -51,7 +51,7 @@ class Clyx:
|
||||
self._stack, self._tokens, self._token_streams = [], [], []
|
||||
self._words = {
|
||||
'dup': lambda: self._stack.append(self._stack[-1]), 'drop': lambda: self._stack.pop(), 'swap': lambda: self._stack.extend([self._stack.pop(), self._stack.pop()]), 'i': lambda: self._eval(self._stack.pop()),
|
||||
'cond': lambda: (lambda c, t, f: self._exec_quot(t if c else f))(self._stack.pop(), self._stack.pop(), self._stack.pop()), 'cons': lambda: (lambda q: self._stack.append([self._stack.pop()] + q))(self._stack.pop()),
|
||||
'cond': lambda: (lambda c, t, f: self._exec_qform(t if c else f))(self._stack.pop(), self._stack.pop(), self._stack.pop()), 'cons': lambda: (lambda q: self._stack.append([self._stack.pop()] + q))(self._stack.pop()),
|
||||
'uncons': lambda: (lambda q: (lambda l: self._stack.extend([l, 0] if not l else [l[1:], l[0], 1]))(list(map(ord, q)) if isinstance(q, str) else q))(self._stack.pop()), 'qpop': lambda: (lambda q: self._stack.extend([q[:-1], q[-1]]))(self._stack.pop()),
|
||||
'qlen': lambda: (lambda v: self._stack.append(len(v) if isinstance(v, list) else 0))(self._stack.pop()), 'qget': lambda: (lambda i,v: self._stack.append(v[i] if isinstance(v, list) else None))(self._stack.pop(), self._stack.pop()),
|
||||
'qset': self._cmd_qset, 'slen': lambda: (lambda v: self._stack.append(len(v) if isinstance(v, str) else 0))(self._stack.pop()),
|
||||
@@ -65,7 +65,7 @@ class Clyx:
|
||||
'read': self._cmd_read,
|
||||
'close': lambda: (lambda fd: fd.close() if not (fd in (sys.stdin, sys.stdout, sys.stderr) or fd.__class__.__name__ == 'FD0') else None)(self._stack.pop()),
|
||||
'delf': lambda: os.remove(self._stack.pop()), 'maked': lambda: os.mkdir(self._stack.pop()), 'listd': lambda: self._stack.append(os.listdir(self._stack.pop())), 'deld': lambda: os.rmdir(self._stack.pop()),
|
||||
'rand': lambda: self._stack.append(randrange(int(self._stack.pop()))), '.s': lambda: self._out_num(repr(self._stack)), 'dip': lambda: (lambda q, y: (self._exec_quot(q), self._stack.append(y)))(self._stack.pop(), self._stack.pop()),
|
||||
'rand': lambda: self._stack.append(randrange(int(self._stack.pop()))), '.s': lambda: self._out_num(repr(self._stack)), 'dip': lambda: (lambda q, y: (self._exec_qform(q), self._stack.append(y)))(self._stack.pop(), self._stack.pop()),
|
||||
'loop': lambda: (lambda body, cond: self._exec_loop(cond, body))(self._stack.pop(), self._stack.pop()),
|
||||
'hsargs': lambda: self._stack.append(list(sys.argv)),
|
||||
'hsexit': lambda: sys.exit(int(self._stack.pop())),
|
||||
@@ -102,8 +102,8 @@ class Clyx:
|
||||
self._stack.append(res)
|
||||
def _cmd_qset(self): i, v, x = self._stack.pop(), self._stack.pop(), self._stack.pop(); (v.pop(int(i)), v.insert(int(i), x)) if isinstance(v, list) else None; self._stack.append(v if isinstance(v, list) else None)
|
||||
def _exec_loop(self, c, b):
|
||||
while (self._exec_quot(c), self._stack.pop())[1]: self._exec_quot(b)
|
||||
_pop_caller_token = lambda self: (lambda t: (t.pop(0) if t[0] != '[' else self._parse_quot((t.pop(0), t)[1])) if t else None)(self._token_streams[-1] if self._token_streams else self._tokens)
|
||||
while (self._exec_qform(c), self._stack.pop())[1]: self._exec_qform(b)
|
||||
_pop_caller_token = lambda self: (lambda t: (t.pop(0) if t[0] != '[' else self._parse_qform((t.pop(0), t)[1])) if t else None)(self._token_streams[-1] if self._token_streams else self._tokens)
|
||||
def _cmd_defw(self): t = self._token_streams[-1] if self._token_streams else self._tokens; val = self._pop_caller_token() if (t and (t[0] == '[' or isinstance(t[0], list))) else self._stack.pop(); self._words[self._stack.pop()] = val
|
||||
|
||||
def _tokenize(self, code):
|
||||
@@ -116,13 +116,13 @@ class Clyx:
|
||||
|
||||
_next_token = lambda self: self._tokens.pop(0) if self._tokens else None
|
||||
|
||||
def _parse_quot(self, tokens=None):
|
||||
tokens, quot = self._tokens if tokens is None else tokens, []
|
||||
def _parse_qform(self, tokens=None):
|
||||
tokens, qform = self._tokens if tokens is None else tokens, []
|
||||
try:
|
||||
while True:
|
||||
t = tokens.pop(0)
|
||||
if t == ']': return quot
|
||||
quot.append(self._parse_quot(tokens) if t == '[' else self._norm_token(t))
|
||||
if t == ']': return qform
|
||||
qform.append(self._parse_qform(tokens) if t == '[' else self._norm_token(t))
|
||||
except IndexError: raise SyntaxError('Syntax error: unbalanced brackets')
|
||||
|
||||
def _norm_token(self, t):
|
||||
@@ -130,25 +130,25 @@ class Clyx:
|
||||
except: return t[1:-1].replace('\\\\', '\x01').replace('\\n', '\n').replace('\\t', '\t').replace('\\r', '\r').replace('\\s', ' ').replace('\\b', '\b').replace('\\f', '\f').replace('\\"', '"').replace('\x01', '\\') if (t.startswith('"') and t.endswith('"')) else t
|
||||
_flush = lambda self, fd: getattr(fd, 'flush', lambda: None)()
|
||||
|
||||
def _exec_quot(self, q):
|
||||
def _exec_qform(self, q):
|
||||
self._token_streams.append(self._tokens); self._tokens = list(q)
|
||||
while self._tokens:
|
||||
t = self._next_token()
|
||||
if isinstance(t, list): self._stack.append(t)
|
||||
elif t == '[': self._stack.append(self._parse_quot(self._tokens))
|
||||
elif t == '[': self._stack.append(self._parse_qform(self._tokens))
|
||||
else:
|
||||
t = self._norm_token(t) if isinstance(t, str) else t
|
||||
v = self._words.get(t) if isinstance(t, str) else None
|
||||
if callable(v): v()
|
||||
elif isinstance(v, list): self._exec_quot(v)
|
||||
elif isinstance(v, list): self._exec_qform(v)
|
||||
elif v is not None: self._stack.append(v)
|
||||
else: self._stack.append(t)
|
||||
self._tokens = self._token_streams.pop()
|
||||
|
||||
def _eval(self, q):
|
||||
try: self._exec_quot(self._tokenize(q) if isinstance(q, str) else q)
|
||||
try: self._exec_qform(self._tokenize(q) if isinstance(q, str) else q)
|
||||
except Exception as e: sys.stderr.write(f'Error: {e}\n')
|
||||
run = lambda self, code: self._exec_quot(self._tokenize(code))
|
||||
run = lambda self, code: self._exec_qform(self._tokenize(code))
|
||||
|
||||
def clyx(f):
|
||||
try:
|
||||
|
||||
Reference in New Issue
Block a user