-
Notifications
You must be signed in to change notification settings - Fork 53
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
Nested definitions #349
Comments
Hmm, I totally understand what you're trying to do here, and the example with making a I think the better way to accomplish this would be through the use of real mutable references, which would not be hard to add, given that we already use a CESK machine (I thought we already had an issue for that but perhaps not). The reason we don't allow nested |
Regarding the example, I think it is better for
I run into #333 trying to use the readable definition from a file and into #351 when I did not constrain the types. 🐛 But with some copy-pasting, it works! 🥳 I am missing devices required for '+' though... |
Just to link it here, in #373 I encountered the following note in -- Note that _capCtx must be empty: at least at the
-- moment, definitions are only allowed at the top level,
-- so there can't be any inside the argument to build.
-- (Though perhaps there is an argument that this ought to
-- be relaxed specifically in the case of 'Build'.
let (caps, _capCtx) = requiredCaps (r ^. robotContext . defCaps) cmd I wonder if that would be harder or simpler than nested definitions, but definitions in But as it can be worked around, we can leave it for later. |
I no longer think this is useful - the original example can be implemented more cleanly in other ways. A |
…tate (#1928) The big idea of this PR is to add a new type of CESK machine state, `Suspended`, which is a state the base robot automatically goes into after completing execution of a program entered at the REPL. It is as if the base robot is still within the local context of any definitions etc. entered previously, just printed out an "intermediate result", and is now waiting to find out what the next term to be executed will be. This allows us to treat `def` as syntax sugar for `let` and results in a much cleaner way to manage the context of definitions, which in turn allows us to remove a whole lot of special cases and fixes several annoying bugs. See #1087 for more explanation and discussion. Things that are **deleted** (!) by this PR: - `TDef` (`def` is now just syntax sugar for `let`) (#997) - `VResult` (we no longer need to return anything other than plain values) - `FUnionEnv`, `FDiscardEnv`, `FLoadEnv` (we no longer need machinery to collect up definitions while evaluating terms) - `ProcessedTerm` (just a plain `TSyntax` (i.e. `Syntax' Polytype`) is now enough) - `Module` (it only existed to package up some contexts with typechecked terms, but we don't need them anymore) - `RobotContext` and `topContext` (we don't need to store those things separately any more, they are just stored in the `CESK` machine where they belong) Additions/changes: - The `Requirement` module is split into `Requirements.Type` and `Requirements.Analysis` to avoid circular module imports - New `Suspended` state for the CESK machine - `def` and `tydef` are now allowed anywhere (even nested inside other definitions etc.) since `def x = y end; z` is just syntax sugar for `let x = y in z` (see #349) - Code size decreased slightly for many programs using `def`, since `def` is now a synonym for `let`, and consecutive `def`s therefore do not require a `bind`. Closes #1087. Fixes #681 (hence also #736, #1796). Fixes #1032. Closes #1047. Closes #997. Fixes #1900. Fixes #1466. Fixes #1424. See also #636.
Feature
I would like to
def
insidedef
. It seems well defined in thatdef
-end
would nest properly and replace previous definitions.Example
For example, if I wanted to avoid coming up with variable names for built robots, I could create a
registry
function:Building a registered robot is as easy as:
Which would be nice to wrap in an outer definition:
Solution
I can imagine running a
cmd
could modify the outer definitions. The innerdef
s would need to be collected ininfer
and then put into the outer context when the outerdef
is called:Not sure if it would be necessary to store the outer def parameters somewhere so the inner
def
s could still access them.I have a feeling this is Pandora's box with many nasty bugs that could occur when the inner context calls some forgotten variable, but it could be fun to have self-modifying programs. 😂
Alternatives
The text was updated successfully, but these errors were encountered: