sync from Atlas
This commit is contained in:
@@ -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)
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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())
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
Reference in New Issue
Block a user