Add section on chalk structure
This commit is contained in:
parent
910326f2a9
commit
1ea546df15
|
|
@ -16,6 +16,71 @@ existing, somewhat ad-hoc implementation into something far more principled and
|
||||||
expressive, which should behave better in corner cases, and be much easier to
|
expressive, which should behave better in corner cases, and be much easier to
|
||||||
extend.
|
extend.
|
||||||
|
|
||||||
|
## Chalk Structure
|
||||||
|
Chalk has two main "products". The first of these is the
|
||||||
|
[`chalk_engine`][doc-chalk-engine] crate, which defines the core [SLG
|
||||||
|
solver][slg]. This is the part rustc uses.
|
||||||
|
|
||||||
|
The rest of chalk can be considered an elaborate testing harness. Chalk is
|
||||||
|
capable of parsing Rust-like "programs", lowering them to logic, and
|
||||||
|
performing queries on them.
|
||||||
|
|
||||||
|
Here's a sample session in the chalk repl, chalki. After feeding it our
|
||||||
|
program, we perform some queries on it.
|
||||||
|
|
||||||
|
```rust,ignore
|
||||||
|
?- program
|
||||||
|
Enter a program; press Ctrl-D when finished
|
||||||
|
| struct Foo { }
|
||||||
|
| struct Bar { }
|
||||||
|
| struct Vec<T> { }
|
||||||
|
| trait Clone { }
|
||||||
|
| impl<T> Clone for Vec<T> where T: Clone { }
|
||||||
|
| impl Clone for Foo { }
|
||||||
|
|
||||||
|
?- Vec<Foo>: Clone
|
||||||
|
Unique; substitution [], lifetime constraints []
|
||||||
|
|
||||||
|
?- Vec<Bar>: Clone
|
||||||
|
No possible solution.
|
||||||
|
|
||||||
|
?- exists<T> { Vec<T>: Clone }
|
||||||
|
Ambiguous; no inference guidance
|
||||||
|
```
|
||||||
|
|
||||||
|
You can see more examples of programs and queries in the [unit tests][chalk-tests].
|
||||||
|
|
||||||
|
[chalk-tests]: https://github.com/rust-lang-nursery/chalk/blob/4bce000801de31bf45c02f742a5fce335c9f035f/src/test.rs#L115
|
||||||
|
|
||||||
|
### Crates
|
||||||
|
- [**chalk_engine**][doc-chalk-engine]: Defines the core [SLG solver][slg].
|
||||||
|
- [**chalk_ir**][doc-chalk-ir]: Defines chalk's internal representation of
|
||||||
|
types, lifetimes, and goals.
|
||||||
|
- [**chalk_solve**][doc-chalk-solve]: Combines `chalk_ir` and `chalk_engine`,
|
||||||
|
effectively.
|
||||||
|
- [`chalk_engine::context`][engine-context] provides the necessary hooks.
|
||||||
|
- [**chalk_parse**][doc-chalk-parse]: Defines the raw AST and a parser.
|
||||||
|
- [**chalk**][doc-chalk]: Brings everything together. Defines the following
|
||||||
|
modules:
|
||||||
|
- [`rust_ir`][doc-chalk-rust-ir], containing the "HIR-like" form of the AST
|
||||||
|
- `rust_ir::lowering`, which converts AST to `rust_ir`
|
||||||
|
- `rules`, which implements logic rules
|
||||||
|
converting `rust_ir` to `chalk_ir`
|
||||||
|
- `coherence`, which implements coherence rules
|
||||||
|
- Also includes [chalki][doc-chalki], chalk's REPL.
|
||||||
|
|
||||||
|
[Browse source on GitHub](https://github.com/rust-lang-nursery/chalk)
|
||||||
|
|
||||||
|
[engine-context]: https://rust-lang-nursery.github.io/chalk/doc/chalk_engine/context/index.html
|
||||||
|
|
||||||
|
[doc-chalk-engine]: https://rust-lang-nursery.github.io/chalk/doc/chalk_engine/index.html
|
||||||
|
[doc-chalk-ir]: https://rust-lang-nursery.github.io/chalk/doc/chalk_ir/index.html
|
||||||
|
[doc-chalk-solve]: https://rust-lang-nursery.github.io/chalk/doc/chalk_solve/index.html
|
||||||
|
[doc-chalk-parse]: https://rust-lang-nursery.github.io/chalk/doc/chalk_parse/index.html
|
||||||
|
[doc-chalk]: https://rust-lang-nursery.github.io/chalk/doc/chalk/index.html
|
||||||
|
[doc-chalk-rust-ir]: https://rust-lang-nursery.github.io/chalk/doc/chalk/rules/index.html
|
||||||
|
[doc-chalki]: https://rust-lang-nursery.github.io/chalk/doc/chalki/index.html
|
||||||
|
|
||||||
## Resources
|
## Resources
|
||||||
|
|
||||||
* [Chalk Source Code](https://github.com/rust-lang-nursery/chalk)
|
* [Chalk Source Code](https://github.com/rust-lang-nursery/chalk)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue