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

View File

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

View File

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

View File

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

View File

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

View File

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