sync from Atlas

This commit is contained in:
Luciano Ramalho 2021-09-20 23:31:45 -03:00
parent c93076ac2b
commit ade9577a55
6 changed files with 21 additions and 28 deletions

View File

@ -122,7 +122,7 @@ def standard_env() -> Environment:
# tag::REPL[]
def repl(prompt: str = 'lis.py> ') -> NoReturn:
"A prompt-read-eval-print loop."
global_env = standard_env()
global_env = Environment({}, standard_env())
while True:
ast = parse(input(prompt))
val = evaluate(ast, global_env)
@ -200,7 +200,7 @@ class Procedure:
################ command-line interface
def run(source: str) -> Any:
global_env = standard_env()
global_env = Environment({}, standard_env())
tokens = tokenize(source)
while tokens:
exp = read_from_tokens(tokens)

View File

@ -117,7 +117,7 @@ def standard_env() -> Environment:
def repl(prompt: str = 'lis.py> ') -> NoReturn:
"A prompt-read-eval-print loop."
global_env = standard_env()
global_env = Environment({}, standard_env())
while True:
ast = parse(input(prompt))
val = evaluate(ast, global_env)
@ -190,7 +190,7 @@ class Procedure:
################ command-line interface
def run(source: str) -> Any:
global_env = standard_env()
global_env = Environment({}, standard_env())
tokens = tokenize(source)
while tokens:
exp = read_from_tokens(tokens)

View File

@ -48,7 +48,6 @@ Doctests for `evaluate`
# end::EVAL_NUMBER[]
# tag::EVAL_SYMBOL[]
>>> from lis import standard_env
>>> evaluate(parse('+'), standard_env())
<built-in function add>
>>> evaluate(parse('ni!'), standard_env())

View File

@ -121,7 +121,7 @@ def standard_env() -> Environment:
# tag::REPL[]
def repl(prompt: str = 'lis.py> ') -> NoReturn:
"A prompt-read-eval-print loop."
global_env = standard_env()
global_env = Environment({}, standard_env())
while True:
ast = parse(input(prompt))
val = evaluate(ast, global_env)
@ -140,10 +140,7 @@ def lispstr(exp: object) -> str:
################ Evaluator
# tag::EVALUATE[]
KEYWORDS = {'quote', 'if', 'lambda', 'define', 'set!'}
def is_keyword(s: Any) -> bool:
return isinstance(s, Symbol) and s in KEYWORDS
KEYWORDS = ['quote', 'if', 'lambda', 'define', 'set!']
def evaluate(exp: Expression, env: Environment) -> Any:
"Evaluate an expression in an environment."
@ -161,17 +158,13 @@ def evaluate(exp: Expression, env: Environment) -> Any:
return evaluate(alternative, env)
case ['lambda', [*parms], *body] if body:
return Procedure(parms, body, env)
case ['define', Symbol(var), value_exp]:
env[var] = evaluate(value_exp, env)
case ['define', Symbol(name), value_exp]:
env[name] = evaluate(value_exp, env)
case ['define', [Symbol(name), *parms], *body] if body:
env[name] = Procedure(parms, body, env)
case ['set!', Symbol(var), value_exp]:
env.change(var, evaluate(value_exp, env))
<<<<<<< HEAD
case ['set!', Symbol(name), value_exp]:
env.change(name, evaluate(value_exp, env))
case [func_exp, *args] if func_exp not in KEYWORDS:
=======
case [func_exp, *args] if not is_keyword(func_exp):
>>>>>>> 3ecfb212c6273122797c76876d6b373b2cb94fa6
proc = evaluate(func_exp, env)
values = [evaluate(arg, env) for arg in args]
return proc(*values)
@ -202,7 +195,7 @@ class Procedure:
################ command-line interface
def run(source: str) -> Any:
global_env = standard_env()
global_env = Environment({}, standard_env())
tokens = tokenize(source)
while tokens:
exp = read_from_tokens(tokens)

View File

@ -117,7 +117,7 @@ def standard_env() -> Environment:
def repl(prompt: str = 'lis.py> ') -> NoReturn:
"A prompt-read-eval-print loop."
global_env = standard_env()
global_env = Environment({}, standard_env())
while True:
ast = parse(input(prompt))
val = evaluate(ast, global_env)
@ -193,7 +193,7 @@ class Procedure:
################ command-line interface
def run(source: str) -> Any:
global_env = standard_env()
global_env = Environment({}, standard_env())
tokens = tokenize(source)
while tokens:
exp = read_from_tokens(tokens)

View File

@ -7,6 +7,7 @@
import asyncio
import itertools
import math
import functools
# tag::PRIME_NAP[]
async def is_prime(n):
@ -21,8 +22,8 @@ async def is_prime(n):
for i in range(3, root + 1, 2):
if n % i == 0:
return False
if i % 100_000 == 1: # <2>
await asyncio.sleep(0)
if i % 100_000 == 1:
await asyncio.sleep(0) # <1>
return True
# end::PRIME_NAP[]
@ -39,13 +40,13 @@ async def spin(msg: str) -> None:
print(f'\r{blanks}\r', end='')
async def check(n: int) -> int:
return await is_prime(n) # <4>
return await is_prime(n)
async def supervisor(n: int) -> int:
spinner = asyncio.create_task(spin('thinking!')) # <1>
print('spinner object:', spinner) # <2>
result = await check(n) # <3>
spinner.cancel() # <5>
spinner = asyncio.create_task(spin('thinking!'))
print('spinner object:', spinner)
result = await check(n)
spinner.cancel()
return result
def main() -> None: