Grackle can now compile |> pipelines. This means that these two programs compile to identical execution plans:
```kcl
fn double = (x) => { return x * 2 }
fn triple = (x) => { return x * 3 }
let x = 1 |> double(%) |> triple(%) // should be 6
```
```kcl
fn double = (x) => { return x * 2 }
fn triple = (x) => { return x * 3 }
let x = triple(double(1)) // should be 6
```
This required adding passing "what should % actually resolve to" through the program. This required modifying every call site of `plan_to_bind` and `plan_to_compute` to pass the data. To avoid doing this again, I wrapped that data into a struct called `Context` so that when we have more data like it, we can just add a new field and won't need to change every call site.
* Grackle: compile KCL function definitions
Definitions like `fn x = () => { return 1 }` can now be compiled. These functions can't be _called_ yet, but just defining them and mapping them to names works now.
* Failing test for executing a user-defined function
* Refactor: KclFunction is now an enum, not a trait
It's a pain in the ass to work with trait objects in Rust, so I'm refactoring to avoid needing traits at all. We can just use enums. This simplifies future work.
* Zero-parameter functions can be called
Finally, Grackle can actually run user-defined KCL functions! It basically treats them as a new, separate program (with its own scope of variables, nested within the existing parent scope).
* Failing test for multi-param KCL functions
* Execute user-defined functions which declare parameters
Previous commits in this PR got user-defined functions working, but only if they had zero parameters. In this commit, call arguments are bound to function parameters, so you can now compile functions with params.
* Users get a compile error if they try to pass more args to a function than it has parameters
This will help users get clear error messages.
* More test coverage
Among other things, this verify that Grackle compiles KCL functions which themselves either return or accept functions
* Start Grackle (KCL-to-EP compiler)
This begins work on a second, different executor. The old executor is a tree-walk interpreter, this executor compiles the KCL programs into the Execution Plan virtual machine defined in its [own crate](https://github.com/KittyCAD/modeling-api/tree/main/execution-plan). This executor is called "Grackle", after an Austin bird, and it's got its own module in wasm-lib so that I can keep merging small PRs and developing incrementally, rather than building a complete executor which replaces the old executor in one PR.
Grackle's "Planner" walks the AST, like the tree-walk executor. But it doesn't actually execute code. Instead, as it walks each AST node, it outputs a sequence of Execution Plan instructions which, when run, can compute that node's value. It also notes which Execution Plan virtual machine address will eventually contain each KCL variable.
Done:
- Storing KCL variables
- Computing primitives, literals, binary expressions
- Calling native (i.e. Rust) functions from KCL
- Storing arrays
Todo:
- KCL functions (i.e. user-defined functions)
- Member expressions
- Port over existing executor's native funtions (e.g. `lineTo`, `extrude` and `startSketchAt`)
* Create a file and expect stream to fail on Linux
Fixes#1190
* A snapshot a day keeps the bugs away! 📷🐛 (OS: ubuntu)
* Try to add @franknoirot's suggestion
* A snapshot a day keeps the bugs away! 📷🐛 (OS: ubuntu)
* Check settings first
* A snapshot a day keeps the bugs away! 📷🐛 (OS: ubuntu)
* Working test
* Clean up
* Linux fix
* Linux fix attempt #2
* BUILD_RELEASE true temporarily
* Revert "BUILD_RELEASE true temporarily"
This reverts commit 42b2d5f6bb.
* Better comment
* Home checks, and proj name check
* A snapshot a day keeps the bugs away! 📷🐛 (OS: ubuntu)
* Open proj
* Fix defaultDir in test
* WIP signout
* Workaround to recover from error
* Typo
---------
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
* Naming tweaks
* Update heading font to be owners
* Update app icon
* Update Tauri App title
* Fix sign in page (#1232)
* Change to Zoo Modeling App, CI fixes (#1238)
* Replace website urls for dl.zoo.dev
---------
Co-authored-by: Pierre Jacquier <pierrejacquier39@gmail.com>
# Problem
This is my proposal for fixing #1107 . I've only done it for one stdlib function, `tangentialArcTo` -- if y'all like it, I'll apply this idea to the rest of the stdlib.
Previously, if users want to put a tag on the arc, the function's parameters change type.
```
// Tag missing: first param is array
tangentialArcTo([x, y], %)
// Tag present: first param is object
tangentialArcTo({to: [x, y], tag: "myTag"}, %)
```
# Solution
My proposal in #1006 is that KCL should have optional values. This means we can change the stdlib `tangentialArcTo` function to use them. In this PR, the calls are now like
```
// Tag missing: first param is array
tangentialArcTo([x, y], %)
// Tag present: first param is array still, but we now pass a tag at the end.
tangentialArcTo([x, y], %, "myTag")
```
This adds an "option" type to KCL typesystem, but it's not really revealed to users (no KCL types are revealed to users right now, they write untyped code and only interact with types when they get type errors upon executing programs). Also adds a None type, which is the default case of the Optional enum.
* Add new logomarks
* Replace KittyCAD and KCMA with Zoo and ZMA anywhere it's safe
* fmt
* A snapshot a day keeps the bugs away! 📷🐛 (OS: ubuntu)
* Make README logo a PNG instead of an SVG
---------
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
* delete old exports
* update test
* tweaks and assets
* install kittycad cli
* fix weird typo
* A snapshot a day keeps the bugs away! 📷🐛 (OS: ubuntu)
---------
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>