open import Prelude
module Lambda.Virtual-machine.Instructions (Name : Type) where
open import Equality.Propositional
open import Lambda.Syntax Name
mutual
data Instr (n : ℕ) : Type where
var : Fin n → Instr n
clo : Code (suc n) → Instr n
app ret : Instr n
cal tcl : Name → Instr n
con : Bool → Instr n
bra : Code n → Code n → Instr n
Code : ℕ → Type
Code n = List (Instr n)
open Closure Code
data Stack-element : Type where
val : Value → Stack-element
ret : ∀ {n} → Code n → Env n → Stack-element
Stack : Type
Stack = List Stack-element
data State : Type where
⟨_,_,_⟩ : ∀ {n} → Code n → Stack → Env n → State
data Result : Type where
continue : State → Result
done : Value → Result
crash : Result