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,30 +14,35 @@ 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),
("(define abs (lambda (n) ((if (> n 0) + -) 0 n)))", None), ("(define abs (lambda (n) ((if (> n 0) + -) 0 n)))", None),
("(list (abs -3) (abs 0) (abs 3))", [3, 0, 3]), ("(list (abs -3) (abs 0) (abs 3))", [3, 0, 3]),
("""(define combine (lambda (f) ("""(define combine (lambda (f)
(lambda (x y) (lambda (x y)
(if (null? x) (quote ()) (if (null? x) (quote ())
(f (list (car x) (car y)) (f (list (car x) (car y))
((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)
(define take (lambda (n seq) (if (<= n 0) (quote ()) (cons (car seq) (take (- n 1) (cdr seq)))))) (begin
(define drop (lambda (n seq) (if (<= n 0) seq (drop (- n 1) (cdr seq))))) (define take (lambda (n seq) (if (<= n 0) (quote ()) (cons (car seq) (take (- n 1) (cdr seq))))))
(define mid (lambda (seq) (/ (length seq) 2))) (define drop (lambda (n seq) (if (<= n 0) seq (drop (- n 1) (cdr seq)))))
((combine append) (take (mid deck) deck) (drop (mid deck) deck)))))""", None), (define mid (lambda (seq) (/ (length seq) 2)))
((combine append) (take (mid deck) deck) (drop (mid deck) deck)))))""", None),
("(riff-shuffle (list 1 2 3 4 5 6 7 8))", [1, 5, 2, 6, 3, 7, 4, 8]), ("(riff-shuffle (list 1 2 3 4 5 6 7 8))", [1, 5, 2, 6, 3, 7, 4, 8]),
("((repeat riff-shuffle) (list 1 2 3 4 5 6 7 8))", [1, 3, 5, 7, 2, 4, 6, 8]), ("((repeat riff-shuffle) (list 1 2 3 4 5 6 7 8))", [1, 3, 5, 7, 2, 4, 6, 8]),
("(riff-shuffle (riff-shuffle (riff-shuffle (list 1 2 3 4 5 6 7 8))))", [1,2,3,4,5,6,7,8]), ("(riff-shuffle (riff-shuffle (riff-shuffle (list 1 2 3 4 5 6 7 8))))", [1,2,3,4,5,6,7,8]),

View File

@@ -14,30 +14,35 @@ 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),
("(define abs (lambda (n) ((if (> n 0) + -) 0 n)))", None), ("(define abs (lambda (n) ((if (> n 0) + -) 0 n)))", None),
("(list (abs -3) (abs 0) (abs 3))", [3, 0, 3]), ("(list (abs -3) (abs 0) (abs 3))", [3, 0, 3]),
("""(define combine (lambda (f) ("""(define combine (lambda (f)
(lambda (x y) (lambda (x y)
(if (null? x) (quote ()) (if (null? x) (quote ())
(f (list (car x) (car y)) (f (list (car x) (car y))
((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)
(define take (lambda (n seq) (if (<= n 0) (quote ()) (cons (car seq) (take (- n 1) (cdr seq)))))) (begin
(define drop (lambda (n seq) (if (<= n 0) seq (drop (- n 1) (cdr seq))))) (define take (lambda (n seq) (if (<= n 0) (quote ()) (cons (car seq) (take (- n 1) (cdr seq))))))
(define mid (lambda (seq) (/ (length seq) 2))) (define drop (lambda (n seq) (if (<= n 0) seq (drop (- n 1) (cdr seq)))))
((combine append) (take (mid deck) deck) (drop (mid deck) deck)))))""", None), (define mid (lambda (seq) (/ (length seq) 2)))
((combine append) (take (mid deck) deck) (drop (mid deck) deck)))))""", None),
("(riff-shuffle (list 1 2 3 4 5 6 7 8))", [1, 5, 2, 6, 3, 7, 4, 8]), ("(riff-shuffle (list 1 2 3 4 5 6 7 8))", [1, 5, 2, 6, 3, 7, 4, 8]),
("((repeat riff-shuffle) (list 1 2 3 4 5 6 7 8))", [1, 3, 5, 7, 2, 4, 6, 8]), ("((repeat riff-shuffle) (list 1 2 3 4 5 6 7 8))", [1, 3, 5, 7, 2, 4, 6, 8]),
("(riff-shuffle (riff-shuffle (riff-shuffle (list 1 2 3 4 5 6 7 8))))", [1,2,3,4,5,6,7,8]), ("(riff-shuffle (riff-shuffle (riff-shuffle (list 1 2 3 4 5 6 7 8))))", [1,2,3,4,5,6,7,8]),