Home / aiken-lang / aiken
Jan 02, 1-2 AM (0)
Jan 02, 2-3 AM (0)
Jan 02, 3-4 AM (0)
Jan 02, 4-5 AM (0)
Jan 02, 5-6 AM (0)
Jan 02, 6-7 AM (0)
Jan 02, 7-8 AM (0)
Jan 02, 8-9 AM (0)
Jan 02, 9-10 AM (0)
Jan 02, 10-11 AM (0)
Jan 02, 11-12 PM (0)
Jan 02, 12-1 PM (0)
Jan 02, 1-2 PM (0)
Jan 02, 2-3 PM (0)
Jan 02, 3-4 PM (0)
Jan 02, 4-5 PM (0)
Jan 02, 5-6 PM (0)
Jan 02, 6-7 PM (0)
Jan 02, 7-8 PM (0)
Jan 02, 8-9 PM (0)
Jan 02, 9-10 PM (0)
Jan 02, 10-11 PM (0)
Jan 02, 11-12 AM (0)
Jan 03, 12-1 AM (0)
Jan 03, 1-2 AM (0)
Jan 03, 2-3 AM (0)
Jan 03, 3-4 AM (0)
Jan 03, 4-5 AM (0)
Jan 03, 5-6 AM (0)
Jan 03, 6-7 AM (0)
Jan 03, 7-8 AM (0)
Jan 03, 8-9 AM (0)
Jan 03, 9-10 AM (0)
Jan 03, 10-11 AM (0)
Jan 03, 11-12 PM (0)
Jan 03, 12-1 PM (0)
Jan 03, 1-2 PM (0)
Jan 03, 2-3 PM (0)
Jan 03, 3-4 PM (0)
Jan 03, 4-5 PM (0)
Jan 03, 5-6 PM (0)
Jan 03, 6-7 PM (0)
Jan 03, 7-8 PM (0)
Jan 03, 8-9 PM (0)
Jan 03, 9-10 PM (0)
Jan 03, 10-11 PM (0)
Jan 03, 11-12 AM (0)
Jan 04, 12-1 AM (0)
Jan 04, 1-2 AM (0)
Jan 04, 2-3 AM (0)
Jan 04, 3-4 AM (0)
Jan 04, 4-5 AM (0)
Jan 04, 5-6 AM (0)
Jan 04, 6-7 AM (0)
Jan 04, 7-8 AM (0)
Jan 04, 8-9 AM (0)
Jan 04, 9-10 AM (0)
Jan 04, 10-11 AM (0)
Jan 04, 11-12 PM (0)
Jan 04, 12-1 PM (0)
Jan 04, 1-2 PM (0)
Jan 04, 2-3 PM (0)
Jan 04, 3-4 PM (0)
Jan 04, 4-5 PM (0)
Jan 04, 5-6 PM (0)
Jan 04, 6-7 PM (0)
Jan 04, 7-8 PM (0)
Jan 04, 8-9 PM (0)
Jan 04, 9-10 PM (0)
Jan 04, 10-11 PM (0)
Jan 04, 11-12 AM (0)
Jan 05, 12-1 AM (0)
Jan 05, 1-2 AM (0)
Jan 05, 2-3 AM (0)
Jan 05, 3-4 AM (0)
Jan 05, 4-5 AM (0)
Jan 05, 5-6 AM (0)
Jan 05, 6-7 AM (0)
Jan 05, 7-8 AM (0)
Jan 05, 8-9 AM (0)
Jan 05, 9-10 AM (0)
Jan 05, 10-11 AM (0)
Jan 05, 11-12 PM (0)
Jan 05, 12-1 PM (0)
Jan 05, 1-2 PM (0)
Jan 05, 2-3 PM (0)
Jan 05, 3-4 PM (0)
Jan 05, 4-5 PM (0)
Jan 05, 5-6 PM (0)
Jan 05, 6-7 PM (0)
Jan 05, 7-8 PM (0)
Jan 05, 8-9 PM (1)
Jan 05, 9-10 PM (0)
Jan 05, 10-11 PM (0)
Jan 05, 11-12 AM (0)
Jan 06, 12-1 AM (0)
Jan 06, 1-2 AM (0)
Jan 06, 2-3 AM (0)
Jan 06, 3-4 AM (0)
Jan 06, 4-5 AM (0)
Jan 06, 5-6 AM (0)
Jan 06, 6-7 AM (0)
Jan 06, 7-8 AM (0)
Jan 06, 8-9 AM (0)
Jan 06, 9-10 AM (0)
Jan 06, 10-11 AM (0)
Jan 06, 11-12 PM (0)
Jan 06, 12-1 PM (0)
Jan 06, 1-2 PM (0)
Jan 06, 2-3 PM (0)
Jan 06, 3-4 PM (0)
Jan 06, 4-5 PM (0)
Jan 06, 5-6 PM (0)
Jan 06, 6-7 PM (0)
Jan 06, 7-8 PM (0)
Jan 06, 8-9 PM (0)
Jan 06, 9-10 PM (0)
Jan 06, 10-11 PM (0)
Jan 06, 11-12 AM (0)
Jan 07, 12-1 AM (0)
Jan 07, 1-2 AM (0)
Jan 07, 2-3 AM (0)
Jan 07, 3-4 AM (0)
Jan 07, 4-5 AM (0)
Jan 07, 5-6 AM (0)
Jan 07, 6-7 AM (0)
Jan 07, 7-8 AM (0)
Jan 07, 8-9 AM (0)
Jan 07, 9-10 AM (0)
Jan 07, 10-11 AM (0)
Jan 07, 11-12 PM (0)
Jan 07, 12-1 PM (0)
Jan 07, 1-2 PM (0)
Jan 07, 2-3 PM (0)
Jan 07, 3-4 PM (0)
Jan 07, 4-5 PM (12)
Jan 07, 5-6 PM (3)
Jan 07, 6-7 PM (0)
Jan 07, 7-8 PM (0)
Jan 07, 8-9 PM (0)
Jan 07, 9-10 PM (0)
Jan 07, 10-11 PM (0)
Jan 07, 11-12 AM (0)
Jan 08, 12-1 AM (0)
Jan 08, 1-2 AM (0)
Jan 08, 2-3 AM (0)
Jan 08, 3-4 AM (0)
Jan 08, 4-5 AM (0)
Jan 08, 5-6 AM (0)
Jan 08, 6-7 AM (0)
Jan 08, 7-8 AM (0)
Jan 08, 8-9 AM (0)
Jan 08, 9-10 AM (0)
Jan 08, 10-11 AM (0)
Jan 08, 11-12 PM (0)
Jan 08, 12-1 PM (0)
Jan 08, 1-2 PM (1)
Jan 08, 2-3 PM (1)
Jan 08, 3-4 PM (0)
Jan 08, 4-5 PM (0)
Jan 08, 5-6 PM (0)
Jan 08, 6-7 PM (0)
Jan 08, 7-8 PM (0)
Jan 08, 8-9 PM (0)
Jan 08, 9-10 PM (0)
Jan 08, 10-11 PM (0)
Jan 08, 11-12 AM (0)
Jan 09, 12-1 AM (0)
Jan 09, 1-2 AM (0)
18 commits this week Jan 02, 2026 - Jan 09, 2026
Add stepping interface, make generic over context
Exposes an interface to run the CEK machine one step at a time
(essentially just exporing a few functions);

More importantly, Now that we've added Context to terms, and propagated that through
compilation, when we *run* the machine, we have to erase the context
down to unit ().

This makes things like debugger support awkward, because as the machine
executes, the term being executed gets manipulated. That means to map it
back to the generated source maps, we'd need some kind of pattern
matching system.

So, instead if we update the Machine to be able to run generically over
context (i.e. preserve the context as we juggle the CEK machine), then
we can use that context to attach a post-order numbering to each node,
and use that to index into the source maps.

To that end, we add a context parameter to Value, BuiltinRuntime, and
Env.

Of note, we don't make Error generic over Context. While that might be
useful for better error messages on failure, it's a much bigger
refactor, and isn't critical for debugging steps; so for now, we just
erase the context when constructing errors, and provide a utility for
lifting Value<()> into the default context.
Construct UPLC Terms with location info
This now passes the location information we have down into the Term!

It's not *super* useful yet; the things generated by the compiler that
*should* be able to derive their span info from the things around them
aren't yet being provided; but it's a good start, all the tests pass!

For example, here's a little fibonacci test I put together:

=== Source code ===

          fn fib(n: Int) -> Int {
            if n < 2 {
              n
            } else {
              fib(n - 1) + fib(n - 2)
            }
          }

          test fib_test() {
            fib(10) == 55
          }

    === Term tree with source locations ===
    Apply (no span)
      Apply (no span)
        Builtin(EqualsInteger) (no span)
        Apply (no span)
          Apply (no span)
            Lambda(test_module_fib) (no span)
              Apply (no span)
                Lambda(test_module_fib) (no span)
                  Var(test_module_fib) @ 164..167 = "fib"
                Apply (no span)
                  Var(test_module_fib) (no span)
                  Var(test_module_fib) (no span)
            Lambda(__no_inline__) (no span)                                                 Lambda(test_module_fib) (no span)
                Lambda(n_id_0) (no span)
                  Force (no span)
                    Apply (no span)
                      Apply (no span)
                        Apply (no span)
                          Force (no span)
                            Builtin(IfThenElse) (no span)
                          Apply (no span)
                            Apply (no span)
                              Builtin(LessThanInteger) @ 42..47 = "n < 2"
                              Var(n_id_0) @ 42..43 = "n"
                            Constant(Integer(2)) (no span)
                        Delay (no span)
                          Var(n_id_0) @ 60..61 = "n"
                      Delay (no span)
                        Apply (no span)
                          Apply (no span)
                            Builtin(AddInteger) (no span)
                            Apply (no span)
                              Apply (no span)
                                Var(test_module_fib) @ 89..92 = "fib"                                         Var(test_module_fib) @ 89..92 = "fib"
                              Apply (no span)
                                Apply (no span)
                                  Builtin(SubtractInteger) @ 93..98 = "n
    - 1"
                                  Var(n_id_0) @ 93..94 = "n"
                                Constant(Integer(1)) (no span)                                          Apply (no span)
                            Apply (no span)
                              Var(test_module_fib) @ 102..105 = "fib"                                       Var(test_module_fib) @ 102..105 = "fib"
                            Apply (no span)
                              Apply (no span)
                                Builtin(SubtractInteger) @ 106..111 = "n
    - 2"
                                Var(n_id_0) @ 106..107 = "n"
                              Constant(Integer(2)) (no span)
          Constant(Integer(10)) (no span)
      Constant(Integer(55)) (no span)