lis.py: explicit var in first match/case

This commit is contained in:
Luciano Ramalho
2021-06-09 19:58:43 -03:00
parent 36afc017d4
commit d88b17c75f
3 changed files with 36 additions and 26 deletions

View File

@@ -142,8 +142,8 @@ def lispstr(exp: object) -> str:
def evaluate(x: Expression, env: Environment) -> Any: def evaluate(x: Expression, env: Environment) -> Any:
"Evaluate an expression in an environment." "Evaluate an expression in an environment."
match x: match x:
case str(): # variable reference case str(var): # variable reference
return env[x] return env[var]
case literal if not isinstance(x, list): # constant literal case literal if not isinstance(x, list): # constant literal
return literal return literal
case ['quote', exp]: # (quote exp) case ['quote', exp]: # (quote exp)

View File

@@ -14,13 +14,17 @@ ENV_FOR_FIRST_TEST = standard_env()
("(+ (* 2 100) (* 1 10))", 210), ("(+ (* 2 100) (* 1 10))", 210),
("(if (> 6 5) (+ 1 1) (+ 2 2))", 2), ("(if (> 6 5) (+ 1 1) (+ 2 2))", 2),
("(if (< 6 5) (+ 1 1) (+ 2 2))", 4), ("(if (< 6 5) (+ 1 1) (+ 2 2))", 4),
("(define x 3)", None), ("x", 3), ("(+ x x)", 6), ("(define x 3)", None),
("x", 3),
("(+ x x)", 6),
("((lambda (x) (+ x x)) 5)", 10), ("((lambda (x) (+ x x)) 5)", 10),
("(define twice (lambda (x) (* 2 x)))", None), ("(twice 5)", 10), ("(define twice (lambda (x) (* 2 x)))", None),
("(twice 5)", 10),
("(define compose (lambda (f g) (lambda (x) (f (g x)))))", None), ("(define compose (lambda (f g) (lambda (x) (f (g x)))))", None),
("((compose list twice) 5)", [10]), ("((compose list twice) 5)", [10]),
("(define repeat (lambda (f) (compose f f)))", None), ("(define repeat (lambda (f) (compose f f)))", None),
("((repeat twice) 5)", 20), ("((repeat (repeat twice)) 5)", 80), ("((repeat twice) 5)", 20),
("((repeat (repeat twice)) 5)", 80),
("(define fact (lambda (n) (if (<= n 1) 1 (* n (fact (- n 1))))))", None), ("(define fact (lambda (n) (if (<= n 1) 1 (* n (fact (- n 1))))))", None),
("(fact 3)", 6), ("(fact 3)", 6),
("(fact 50)", 30414093201713378043612608166064768844377641568960512000000000000), ("(fact 50)", 30414093201713378043612608166064768844377641568960512000000000000),
@@ -33,7 +37,8 @@ ENV_FOR_FIRST_TEST = standard_env()
((combine f) (cdr x) (cdr y)))))))""", None), ((combine f) (cdr x) (cdr y)))))))""", None),
("(define zip (combine cons))", None), ("(define zip (combine cons))", None),
("(zip (list 1 2 3 4) (list 5 6 7 8))", [[1, 5], [2, 6], [3, 7], [4, 8]]), ("(zip (list 1 2 3 4) (list 5 6 7 8))", [[1, 5], [2, 6], [3, 7], [4, 8]]),
("""(define riff-shuffle (lambda (deck) (begin ("""(define riff-shuffle (lambda (deck)
(begin
(define take (lambda (n seq) (if (<= n 0) (quote ()) (cons (car seq) (take (- n 1) (cdr seq)))))) (define take (lambda (n seq) (if (<= n 0) (quote ()) (cons (car seq) (take (- n 1) (cdr seq))))))
(define drop (lambda (n seq) (if (<= n 0) seq (drop (- n 1) (cdr seq))))) (define drop (lambda (n seq) (if (<= n 0) seq (drop (- n 1) (cdr seq)))))
(define mid (lambda (seq) (/ (length seq) 2))) (define mid (lambda (seq) (/ (length seq) 2)))

View File

@@ -14,13 +14,17 @@ ENV_FOR_FIRST_TEST = standard_env()
("(+ (* 2 100) (* 1 10))", 210), ("(+ (* 2 100) (* 1 10))", 210),
("(if (> 6 5) (+ 1 1) (+ 2 2))", 2), ("(if (> 6 5) (+ 1 1) (+ 2 2))", 2),
("(if (< 6 5) (+ 1 1) (+ 2 2))", 4), ("(if (< 6 5) (+ 1 1) (+ 2 2))", 4),
("(define x 3)", None), ("x", 3), ("(+ x x)", 6), ("(define x 3)", None),
("x", 3),
("(+ x x)", 6),
("((lambda (x) (+ x x)) 5)", 10), ("((lambda (x) (+ x x)) 5)", 10),
("(define twice (lambda (x) (* 2 x)))", None), ("(twice 5)", 10), ("(define twice (lambda (x) (* 2 x)))", None),
("(twice 5)", 10),
("(define compose (lambda (f g) (lambda (x) (f (g x)))))", None), ("(define compose (lambda (f g) (lambda (x) (f (g x)))))", None),
("((compose list twice) 5)", [10]), ("((compose list twice) 5)", [10]),
("(define repeat (lambda (f) (compose f f)))", None), ("(define repeat (lambda (f) (compose f f)))", None),
("((repeat twice) 5)", 20), ("((repeat (repeat twice)) 5)", 80), ("((repeat twice) 5)", 20),
("((repeat (repeat twice)) 5)", 80),
("(define fact (lambda (n) (if (<= n 1) 1 (* n (fact (- n 1))))))", None), ("(define fact (lambda (n) (if (<= n 1) 1 (* n (fact (- n 1))))))", None),
("(fact 3)", 6), ("(fact 3)", 6),
("(fact 50)", 30414093201713378043612608166064768844377641568960512000000000000), ("(fact 50)", 30414093201713378043612608166064768844377641568960512000000000000),
@@ -33,7 +37,8 @@ ENV_FOR_FIRST_TEST = standard_env()
((combine f) (cdr x) (cdr y)))))))""", None), ((combine f) (cdr x) (cdr y)))))))""", None),
("(define zip (combine cons))", None), ("(define zip (combine cons))", None),
("(zip (list 1 2 3 4) (list 5 6 7 8))", [[1, 5], [2, 6], [3, 7], [4, 8]]), ("(zip (list 1 2 3 4) (list 5 6 7 8))", [[1, 5], [2, 6], [3, 7], [4, 8]]),
("""(define riff-shuffle (lambda (deck) (begin ("""(define riff-shuffle (lambda (deck)
(begin
(define take (lambda (n seq) (if (<= n 0) (quote ()) (cons (car seq) (take (- n 1) (cdr seq)))))) (define take (lambda (n seq) (if (<= n 0) (quote ()) (cons (car seq) (take (- n 1) (cdr seq))))))
(define drop (lambda (n seq) (if (<= n 0) seq (drop (- n 1) (cdr seq))))) (define drop (lambda (n seq) (if (<= n 0) seq (drop (- n 1) (cdr seq)))))
(define mid (lambda (seq) (/ (length seq) 2))) (define mid (lambda (seq) (/ (length seq) 2)))