v0.3.3: is lib word, UTF–8 string support
This commit is contained in:
@@ -52,7 +52,7 @@ class Clyx:
|
||||
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_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()),
|
||||
'uncons': lambda: (lambda q: (lambda l: self._stack.extend([l, 0] if not l else [l[1:], l[0], 1]))(list(q.encode('utf-8')) 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()),
|
||||
'+': lambda: self._stack.append(self._stack.pop() + self._stack.pop()), '*': lambda: self._stack.append(self._stack.pop() * self._stack.pop()), '-': lambda: (lambda y: self._stack.append(self._stack.pop() - y))(self._stack.pop()), '/': lambda: (lambda y: self._stack.append(self._stack.pop() / y))(self._stack.pop()),
|
||||
@@ -69,7 +69,7 @@ class Clyx:
|
||||
'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())),
|
||||
'q2s': lambda: self._stack.append("".join(chr(int(x)) for x in self._stack.pop())),
|
||||
'q2s': lambda: self._stack.append(bytes(int(x) for x in self._stack.pop()).decode('utf-8', errors='replace')),
|
||||
'hseval': lambda: self._stack.append(eval(self._stack.pop())),
|
||||
'chr': lambda: self._stack.append(chr(int(self._stack.pop()))),
|
||||
'sin': lambda: self._stack.append(math.sin(float(self._stack.pop()))), 'cos': lambda: self._stack.append(math.cos(float(self._stack.pop()))), 'atan': lambda: self._stack.append(math.atan(float(self._stack.pop()))),
|
||||
@@ -104,7 +104,12 @@ class Clyx:
|
||||
def _exec_loop(self, c, b):
|
||||
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 _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()
|
||||
name = self._stack.pop()
|
||||
if isinstance(name, str): name = self._norm_token(name)
|
||||
self._words[name] = val
|
||||
|
||||
def _tokenize(self, code):
|
||||
tokens = []
|
||||
|
||||
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
||||
|
||||
[project]
|
||||
name = "clyx"
|
||||
version = "0.3.2"
|
||||
version = "0.3.3"
|
||||
description = "Clyx programming language interpreter"
|
||||
readme = "README.md"
|
||||
requires-python = ">=3.7"
|
||||
|
||||
Reference in New Issue
Block a user