lis.py: explicit var in first match/case
This commit is contained in:
@@ -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)
|
||||||
|
|||||||
@@ -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]),
|
||||||
|
|||||||
@@ -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]),
|
||||||
|
|||||||
Reference in New Issue
Block a user