-
-
Notifications
You must be signed in to change notification settings - Fork 79
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
case switch support #158
base: main
Are you sure you want to change the base?
case switch support #158
Conversation
6d1c17a
to
c777dbd
Compare
d4164bd
to
ed0b311
Compare
fbe4e89
to
c4afc9c
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Nice! I left some initial thoughts before digging into details.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Great work, Jianling. This is an impressive feature. 💪
Aside from the C++ comments, I stopped leaving comments in the .jank
files because there's just too much going on. Mainly, there's a lot of overlap and duplication.
- Each test file should have one focus and test one thing (i.e. no tests with 10 different test cases)
- There should be very minimal overlap between the tests
- For categorically different tests, we should put them into subdirectories
- We need to include tests which intentionally try to break the feature
So, for case, we need to identify the primary feature set. Here's a starting point:
- Input shapes (make sure I didn't miss any)
- Integers
- Reals
- Ratios
- Bools
- Keywords
- Characters
- Multiple values
- Collections
- Scenario
- Empty case (no branches, no default)
- Empty case with default
- Normal cases
- Normal cases with default value
- Nested
- Positions
- Value
- Statement
- Return
- Expected failures
- Non-literal branch value
- Duplicate branches
- Overlapping branches
- Unexpected failures
- Invalid data passed to
case*
(this one may have a few files)
- Invalid data passed to
Each one of these gets one file, with one test case in it. We don't need more than that. The groupings I've done there can also correspond with the directories, if that guidance helps. I would recommend taking a look at the other tests we have and how they're laid out. For example, the fn tests:
❯ tree test/jank/form/fn/
test/jank/form/fn/
├── arity
│ ├── fail-duplicate.jank
│ ├── fail-invalid-arity-wrapper-type.jank
│ ├── pass-immediate-call.jank
│ ├── pass-multiple.jank
│ ├── pass-single-wrapped.jank
│ └── variadic
│ ├── fail-multiple-adjacent-ampersands.jank
│ ├── fail-multiple-variadic-arities.jank
│ ├── fail-nothing-after-ampersand.jank
│ ├── fail-packing-exceeds-max-params-but-not-variadic.jank
│ ├── fail-param-after-rest.jank
│ ├── fail-same-position-as-fixed.jank
│ ├── pass-ambiguous.jank
│ ├── pass-dynamic.jank
│ ├── pass-packing-exceeds-max-params.jank
│ ├── pass-position-0.jank
│ └── pass-with-fixed-arities.jank
├── closure
│ ├── pass-multiple-arities-using-captures.jank
│ ├── pass-nested-fn.jank
│ └── pass-nested-fn-skip-level.jank
├── fail-just-fn.jank
├── fail-missing-params.jank
├── fail-named-not-symbol.jank
├── fail-not-all-params-symbols.jank
├── fail-qualified-param.jank
├── fail-too-many-names.jank
├── fail-too-many-params.jank
├── named-recur
│ ├── pass-practical.jank
│ ├── pass-recur-across-fn.jank
│ ├── pass-recur-from-closure.jank
│ └── pass-same-name-param.jank
├── pass-empty.jank
├── pass-named.jank
├── pass-params-with-same-name.jank
└── recur
├── fail-invalid-arity-fixed.jank
├── fail-invalid-arity-variadic.jank
├── fail-not-fail-in-if-do.jank
├── fail-not-tail-in-body.jank
├── fail-outside-of-fn-nullary.jank
├── fail-outside-of-fn-unary.jank
├── fail-recur-within-recur.jank
├── pass-countdown.jank
├── pass-in-if-do.jank
├── pass-variadic-position-0.jank
└── pass-variadic-position-1.jank
compiler+runtime/test/jank/form/case/pass-basic-expanded-case-tests.jank
Outdated
Show resolved
Hide resolved
compiler+runtime/test/jank/form/case/pass-basic-case-tests.jank
Outdated
Show resolved
Hide resolved
compiler+runtime/test/jank/form/case/pass-case-in-value-position.jank
Outdated
Show resolved
Hide resolved
compiler+runtime/test/jank/form/case/pass-simple-case-no-default.jank
Outdated
Show resolved
Hide resolved
I've updated the test jank files. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Woot! This is really coming together. I left some notes to improve the error messages and a couple other smaller things. I think, after those, we'll be ready. 🚀
case
benchmark: Jank v.s. clj.Integer
Benchmark Details
JANK Benchmark Script
Running Jank Benchmark (21 times)
Individual Jank Run Outputs
Jank Run 1 Output
Jank Run 2 Output
Jank Run 3 Output
Jank Run 4 Output
Jank Run 5 Output
Jank Run 6 Output
Jank Run 7 Output
Jank Run 8 Output
Jank Run 9 Output
Jank Run 10 Output
Jank Run 11 Output
Jank Run 12 Output
Jank Run 13 Output
Jank Run 14 Output
Jank Run 15 Output
Jank Run 16 Output
Jank Run 17 Output
Jank Run 18 Output
Jank Run 19 Output
Jank Run 20 Output
Jank Run 21 Output
CLJ Benchmark Script
Running Clj Benchmark
Performance Summary
Conclusion:
Clojure and Jank are comparable (0.036 ns/op difference)
Real
Benchmark Details
JANK Benchmark Script
Running Jank Benchmark (21 times)
Individual Jank Run Outputs
Jank Run 1 Output
Jank Run 2 Output
Jank Run 3 Output
Jank Run 4 Output
Jank Run 5 Output
Jank Run 6 Output
Jank Run 7 Output
Jank Run 8 Output
Jank Run 9 Output
Jank Run 10 Output
Jank Run 11 Output
Jank Run 12 Output
Jank Run 13 Output
Jank Run 14 Output
Jank Run 15 Output
Jank Run 16 Output
Jank Run 17 Output
Jank Run 18 Output
Jank Run 19 Output
Jank Run 20 Output
Jank Run 21 Output
CLJ Benchmark Script
Running Clj Benchmark
Performance Summary
Conclusion:
Jank is 17.4x faster (21.031 ns/op difference)
String
Benchmark Details
JANK Benchmark Script
Running Jank Benchmark (21 times)
Individual Jank Run Outputs
Jank Run 1 Output
Jank Run 2 Output
Jank Run 3 Output
Jank Run 4 Output
Jank Run 5 Output
Jank Run 6 Output
Jank Run 7 Output
Jank Run 8 Output
Jank Run 9 Output
Jank Run 10 Output
Jank Run 11 Output
Jank Run 12 Output
Jank Run 13 Output
Jank Run 14 Output
Jank Run 15 Output
Jank Run 16 Output
Jank Run 17 Output
Jank Run 18 Output
Jank Run 19 Output
Jank Run 20 Output
Jank Run 21 Output
CLJ Benchmark Script
Running Clj Benchmark
Performance Summary
Conclusion:
Jank is 4.6x faster (4.633 ns/op difference)
Ratio
Benchmark Details
JANK Benchmark Script
Running Jank Benchmark (21 times)
Individual Jank Run Outputs
Jank Run 1 Output
Jank Run 2 Output
Jank Run 3 Output
Jank Run 4 Output
Jank Run 5 Output
Jank Run 6 Output
Jank Run 7 Output
Jank Run 8 Output
Jank Run 9 Output
Jank Run 10 Output
Jank Run 11 Output
Jank Run 12 Output
Jank Run 13 Output
Jank Run 14 Output
Jank Run 15 Output
Jank Run 16 Output
Jank Run 17 Output
Jank Run 18 Output
Jank Run 19 Output
Jank Run 20 Output
Jank Run 21 Output
CLJ Benchmark Script
Running Clj Benchmark
Performance Summary
Conclusion:
Jank is 46.0x faster (57.562 ns/op difference)
Symbol
Benchmark Details
JANK Benchmark Script
Running Jank Benchmark (21 times)
Individual Jank Run Outputs
Jank Run 1 Output
Jank Run 2 Output
Jank Run 3 Output
Jank Run 4 Output
Jank Run 5 Output
Jank Run 6 Output
Jank Run 7 Output
Jank Run 8 Output
Jank Run 9 Output
Jank Run 10 Output
Jank Run 11 Output
Jank Run 12 Output
Jank Run 13 Output
Jank Run 14 Output
Jank Run 15 Output
Jank Run 16 Output
Jank Run 17 Output
Jank Run 18 Output
Jank Run 19 Output
Jank Run 20 Output
Jank Run 21 Output
CLJ Benchmark Script
Running Clj Benchmark
Performance Summary
Conclusion:
Jank is 15.3x faster (18.308 ns/op difference)
Keywords
Benchmark Details
JANK Benchmark Script
Running Jank Benchmark (21 times)
Individual Jank Run Outputs
Jank Run 1 Output
Jank Run 2 Output
Jank Run 3 Output
Jank Run 4 Output
Jank Run 5 Output
Jank Run 6 Output
Jank Run 7 Output
Jank Run 8 Output
Jank Run 9 Output
Jank Run 10 Output
Jank Run 11 Output
Jank Run 12 Output
Jank Run 13 Output
Jank Run 14 Output
Jank Run 15 Output
Jank Run 16 Output
Jank Run 17 Output
Jank Run 18 Output
Jank Run 19 Output
Jank Run 20 Output
Jank Run 21 Output
CLJ Benchmark Script
Running Clj Benchmark
Performance Summary
Conclusion:
Jank is 1.5x faster (0.593 ns/op difference)
Map
Benchmark Details
JANK Benchmark Script
Running Jank Benchmark (21 times)
Individual Jank Run Outputs
Jank Run 1 Output
Jank Run 2 Output
Jank Run 3 Output
Jank Run 4 Output
Jank Run 5 Output
Jank Run 6 Output
Jank Run 7 Output
Jank Run 8 Output
Jank Run 9 Output
Jank Run 10 Output
Jank Run 11 Output
Jank Run 12 Output
Jank Run 13 Output
Jank Run 14 Output
Jank Run 15 Output
Jank Run 16 Output
Jank Run 17 Output
Jank Run 18 Output
Jank Run 19 Output
Jank Run 20 Output
Jank Run 21 Output
CLJ Benchmark Script
Running Clj Benchmark
Performance Summary
Conclusion:
Jank is 70.2x faster (88.637 ns/op difference)
Set
Benchmark Details
JANK Benchmark Script
Running Jank Benchmark (21 times)
Individual Jank Run Outputs
Jank Run 1 Output
Jank Run 2 Output
Jank Run 3 Output
Jank Run 4 Output
Jank Run 5 Output
Jank Run 6 Output
Jank Run 7 Output
Jank Run 8 Output
Jank Run 9 Output
Jank Run 10 Output
Jank Run 11 Output
Jank Run 12 Output
Jank Run 13 Output
Jank Run 14 Output
Jank Run 15 Output
Jank Run 16 Output
Jank Run 17 Output
Jank Run 18 Output
Jank Run 19 Output
Jank Run 20 Output
Jank Run 21 Output
CLJ Benchmark Script
Running Clj Benchmark
Performance Summary
Conclusion:
Jank is 77.7x faster (98.148 ns/op difference)
Vector
Benchmark Details
JANK Benchmark Script
Running Jank Benchmark (21 times)
Individual Jank Run Outputs
Jank Run 1 Output
Jank Run 2 Output
Jank Run 3 Output
Jank Run 4 Output
Jank Run 5 Output
Jank Run 6 Output
Jank Run 7 Output
Jank Run 8 Output
Jank Run 9 Output
Jank Run 10 Output
Jank Run 11 Output
Jank Run 12 Output
Jank Run 13 Output
Jank Run 14 Output
Jank Run 15 Output
Jank Run 16 Output
Jank Run 17 Output
Jank Run 18 Output
Jank Run 19 Output
Jank Run 20 Output
Jank Run 21 Output
CLJ Benchmark Script
Running Clj Benchmark
Performance Summary
Conclusion:
Jank is 36.2x faster (45.073 ns/op difference)
Mixed int and real
Benchmark Details
JANK Benchmark Script
Running Jank Benchmark (21 times)
Individual Jank Run Outputs
Jank Run 1 Output
Jank Run 2 Output
Jank Run 3 Output
Jank Run 4 Output
Jank Run 5 Output
Jank Run 6 Output
Jank Run 7 Output
Jank Run 8 Output
Jank Run 9 Output
Jank Run 10 Output
Jank Run 11 Output
Jank Run 12 Output
Jank Run 13 Output
Jank Run 14 Output
Jank Run 15 Output
Jank Run 16 Output
Jank Run 17 Output
Jank Run 18 Output
Jank Run 19 Output
Jank Run 20 Output
Jank Run 21 Output
CLJ Benchmark Script
Running Clj Benchmark
Performance Summary
Conclusion:
Jank is 18.4x faster (22.211 ns/op difference)
Mixed int and string
Benchmark Details
JANK Benchmark Script
Running Jank Benchmark (21 times)
Individual Jank Run Outputs
Jank Run 1 Output
Jank Run 2 Output
Jank Run 3 Output
Jank Run 4 Output
Jank Run 5 Output
Jank Run 6 Output
Jank Run 7 Output
Jank Run 8 Output
Jank Run 9 Output
Jank Run 10 Output
Jank Run 11 Output
Jank Run 12 Output
Jank Run 13 Output
Jank Run 14 Output
Jank Run 15 Output
Jank Run 16 Output
Jank Run 17 Output
Jank Run 18 Output
Jank Run 19 Output
Jank Run 20 Output
Jank Run 21 Output
CLJ Benchmark Script
Running Clj Benchmark
Performance Summary
Conclusion:
Jank is 5.1x faster (5.259 ns/op difference)
Multivalues
Benchmark Details
JANK Benchmark Script
Running Jank Benchmark (21 times)
Individual Jank Run Outputs
Jank Run 1 Output
Jank Run 2 Output
Jank Run 3 Output
Jank Run 4 Output
Jank Run 5 Output
Jank Run 6 Output
Jank Run 7 Output
Jank Run 8 Output
Jank Run 9 Output
Jank Run 10 Output
Jank Run 11 Output
Jank Run 12 Output
Jank Run 13 Output
Jank Run 14 Output
Jank Run 15 Output
Jank Run 16 Output
Jank Run 17 Output
Jank Run 18 Output
Jank Run 19 Output
Jank Run 20 Output
Jank Run 21 Output
CLJ Benchmark Script
Running Clj Benchmark
Performance Summary
Conclusion:
Jank is 1.7x faster (0.912 ns/op difference)
closes #143