mirror of
https://github.com/luau-lang/luau.git
synced 2025-05-04 10:33:46 +01:00
numbers work
This commit is contained in:
parent
e76783d0bf
commit
f765d144ca
13 changed files with 34 additions and 22 deletions
2
prototyping/.gitignore
vendored
2
prototyping/.gitignore
vendored
|
@ -4,3 +4,5 @@ Main
|
||||||
MAlonzo
|
MAlonzo
|
||||||
PrettyPrinter
|
PrettyPrinter
|
||||||
.ghc.*
|
.ghc.*
|
||||||
|
Interpreter
|
||||||
|
Examples
|
||||||
|
|
|
@ -6,4 +6,3 @@ open import Luau.Heap using (∅)
|
||||||
|
|
||||||
ex1 : ∅ ⊢ (local (var "x") ← nil ∙ return (var "x") ∙ done) ⟶ᴮ (return nil ∙ done) ⊣ ∅
|
ex1 : ∅ ⊢ (local (var "x") ← nil ∙ return (var "x") ∙ done) ⟶ᴮ (return nil ∙ done) ⊣ ∅
|
||||||
ex1 = subst
|
ex1 = subst
|
||||||
|
|
||||||
|
|
|
@ -3,8 +3,8 @@
|
||||||
module Examples.Run where
|
module Examples.Run where
|
||||||
|
|
||||||
open import Agda.Builtin.Equality using (_≡_; refl)
|
open import Agda.Builtin.Equality using (_≡_; refl)
|
||||||
open import Luau.Syntax using (nil; var; _$_; function_is_end; return; _∙_; done; _⟨_⟩)
|
open import Luau.Syntax using (nil; var; _$_; function_is_end; return; _∙_; done; _⟨_⟩; number_)
|
||||||
open import Luau.Value using (nil)
|
open import Luau.Value using (nil; number)
|
||||||
open import Luau.Run using (run; return)
|
open import Luau.Run using (run; return)
|
||||||
open import Luau.Heap using (lookup-next; next-emp; lookup-next-emp)
|
open import Luau.Heap using (lookup-next; next-emp; lookup-next-emp)
|
||||||
|
|
||||||
|
@ -13,3 +13,6 @@ import Agda.Builtin.Equality.Rewrite
|
||||||
|
|
||||||
ex1 : (run (function "id" ⟨ var "x" ⟩ is return (var "x") ∙ done end ∙ return (var "id" $ nil) ∙ done) ≡ return nil _)
|
ex1 : (run (function "id" ⟨ var "x" ⟩ is return (var "x") ∙ done end ∙ return (var "id" $ nil) ∙ done) ≡ return nil _)
|
||||||
ex1 = refl
|
ex1 = refl
|
||||||
|
|
||||||
|
ex2 : (run (function "fn" ⟨ var "x" ⟩ is return (Luau.Syntax.Expr.number 123.0) ∙ done end ∙ return (var "fn" $ nil) ∙ done) ≡ return (Luau.Value.Value.number 123.0) _)
|
||||||
|
ex2 = refl
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
module FFI.Data.Scientific where
|
module FFI.Data.Scientific where
|
||||||
|
|
||||||
|
open import Agda.Builtin.Float using (Float)
|
||||||
open import FFI.Data.String using (String)
|
open import FFI.Data.String using (String)
|
||||||
open import FFI.Data.HaskellString using (HaskellString; pack; unpack)
|
open import FFI.Data.HaskellString using (HaskellString; pack; unpack)
|
||||||
|
|
||||||
|
@ -11,8 +12,10 @@ postulate Scientific : Set
|
||||||
|
|
||||||
postulate
|
postulate
|
||||||
showHaskell : Scientific → HaskellString
|
showHaskell : Scientific → HaskellString
|
||||||
|
toFloat : Scientific → Float
|
||||||
|
|
||||||
{-# COMPILE GHC showHaskell = \x -> Text.Show.show x #-}
|
{-# COMPILE GHC showHaskell = \x -> Text.Show.show x #-}
|
||||||
|
{-# COMPILE GHC toFloat = \x -> Data.Scientific.toRealFloat x #-}
|
||||||
|
|
||||||
show : Scientific → String
|
show : Scientific → String
|
||||||
show x = pack (showHaskell x)
|
show x = pack (showHaskell x)
|
||||||
|
|
|
@ -3,13 +3,14 @@ module Luau.RuntimeError where
|
||||||
open import Agda.Builtin.Equality using (_≡_)
|
open import Agda.Builtin.Equality using (_≡_)
|
||||||
open import Luau.Heap using (Heap; _[_])
|
open import Luau.Heap using (Heap; _[_])
|
||||||
open import FFI.Data.Maybe using (just; nothing)
|
open import FFI.Data.Maybe using (just; nothing)
|
||||||
|
open import FFI.Data.String using (String)
|
||||||
open import Luau.Syntax using (Block; Expr; nil; var; addr; block_is_end; _$_; local_←_; return; done; _∙_)
|
open import Luau.Syntax using (Block; Expr; nil; var; addr; block_is_end; _$_; local_←_; return; done; _∙_)
|
||||||
|
|
||||||
data RuntimeErrorᴮ {a} (H : Heap a) : Block a → Set
|
data RuntimeErrorᴮ {a} (H : Heap a) : Block a → Set
|
||||||
data RuntimeErrorᴱ {a} (H : Heap a) : Expr a → Set
|
data RuntimeErrorᴱ {a} (H : Heap a) : Expr a → Set
|
||||||
|
|
||||||
data RuntimeErrorᴱ H where
|
data RuntimeErrorᴱ H where
|
||||||
NilIsNotAFunction : ∀ {M} → RuntimeErrorᴱ H (nil $ M)
|
ValueNotCallable : ∀ x → RuntimeErrorᴱ H x
|
||||||
UnboundVariable : ∀ x → RuntimeErrorᴱ H (var x)
|
UnboundVariable : ∀ x → RuntimeErrorᴱ H (var x)
|
||||||
SEGV : ∀ a → (H [ a ] ≡ nothing) → RuntimeErrorᴱ H (addr a)
|
SEGV : ∀ a → (H [ a ] ≡ nothing) → RuntimeErrorᴱ H (addr a)
|
||||||
app : ∀ {M N} → RuntimeErrorᴱ H M → RuntimeErrorᴱ H (M $ N)
|
app : ∀ {M N} → RuntimeErrorᴱ H M → RuntimeErrorᴱ H (M $ N)
|
||||||
|
@ -18,4 +19,3 @@ data RuntimeErrorᴱ H where
|
||||||
data RuntimeErrorᴮ H where
|
data RuntimeErrorᴮ H where
|
||||||
local : ∀ x {M B} → RuntimeErrorᴱ H M → RuntimeErrorᴮ H (local x ← M ∙ B)
|
local : ∀ x {M B} → RuntimeErrorᴱ H M → RuntimeErrorᴮ H (local x ← M ∙ B)
|
||||||
return : ∀ {M B} → RuntimeErrorᴱ H M → RuntimeErrorᴮ H (return M ∙ B)
|
return : ∀ {M B} → RuntimeErrorᴱ H M → RuntimeErrorᴮ H (return M ∙ B)
|
||||||
|
|
||||||
|
|
|
@ -1,15 +1,17 @@
|
||||||
module Luau.RuntimeError.ToString where
|
module Luau.RuntimeError.ToString where
|
||||||
|
|
||||||
open import FFI.Data.String using (String; _++_)
|
open import FFI.Data.String using (String; _++_)
|
||||||
open import Luau.RuntimeError using (RuntimeErrorᴮ; RuntimeErrorᴱ; local; return; NilIsNotAFunction; UnboundVariable; SEGV; app; block)
|
open import Luau.RuntimeError using (RuntimeErrorᴮ; RuntimeErrorᴱ; local; return; ValueNotCallable; UnboundVariable; SEGV; app; block)
|
||||||
open import Luau.Addr.ToString using (addrToString)
|
open import Luau.Addr.ToString using (addrToString)
|
||||||
|
open import Luau.Syntax.ToString using (exprToString)
|
||||||
open import Luau.Var.ToString using (varToString)
|
open import Luau.Var.ToString using (varToString)
|
||||||
open import Luau.Syntax using (name)
|
open import Luau.Syntax using (name; _$_)
|
||||||
|
|
||||||
errToStringᴱ : ∀ {a H B} → RuntimeErrorᴱ {a} H B → String
|
errToStringᴱ : ∀ {a H B} → RuntimeErrorᴱ {a} H B → String
|
||||||
errToStringᴮ : ∀ {a H B} → RuntimeErrorᴮ {a} H B → String
|
errToStringᴮ : ∀ {a H B} → RuntimeErrorᴮ {a} H B → String
|
||||||
|
|
||||||
errToStringᴱ NilIsNotAFunction = "nil is not a function"
|
errToStringᴱ (ValueNotCallable (x $ _)) = "value " ++ exprToString x ++ " is not callable"
|
||||||
|
errToStringᴱ (ValueNotCallable x) = "value " ++ exprToString x ++ " is not callable"
|
||||||
errToStringᴱ (UnboundVariable x) = "variable " ++ varToString x ++ " is unbound"
|
errToStringᴱ (UnboundVariable x) = "variable " ++ varToString x ++ " is unbound"
|
||||||
errToStringᴱ (SEGV a x) = "address " ++ addrToString a ++ " is unallocated"
|
errToStringᴱ (SEGV a x) = "address " ++ addrToString a ++ " is unallocated"
|
||||||
errToStringᴱ (app E) = errToStringᴱ E
|
errToStringᴱ (app E) = errToStringᴱ E
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
module Luau.Substitution where
|
module Luau.Substitution where
|
||||||
|
|
||||||
open import Luau.Syntax using (Expr; Stat; Block; nil; addr; var; function_is_end; _$_; block_is_end; local_←_; _∙_; done; return; _⟨_⟩ ; name; fun; arg)
|
open import Luau.Syntax using (Expr; Stat; Block; nil; addr; var; function_is_end; _$_; block_is_end; local_←_; _∙_; done; return; _⟨_⟩ ; name; fun; arg; number_)
|
||||||
open import Luau.Value using (Value; val)
|
open import Luau.Value using (Value; val)
|
||||||
open import Luau.Var using (Var; _≡ⱽ_)
|
open import Luau.Var using (Var; _≡ⱽ_)
|
||||||
open import Properties.Dec using (Dec; yes; no)
|
open import Properties.Dec using (Dec; yes; no)
|
||||||
|
@ -13,6 +13,7 @@ _[_/_]ᴮunless_ : ∀ {a P} → Block a → Value → Var → (Dec P) → Block
|
||||||
nil [ v / x ]ᴱ = nil
|
nil [ v / x ]ᴱ = nil
|
||||||
var y [ v / x ]ᴱ = var y [ v / x ]ᴱwhenever (x ≡ⱽ y)
|
var y [ v / x ]ᴱ = var y [ v / x ]ᴱwhenever (x ≡ⱽ y)
|
||||||
addr a [ v / x ]ᴱ = addr a
|
addr a [ v / x ]ᴱ = addr a
|
||||||
|
(number y) [ v / x ]ᴱ = number y
|
||||||
(M $ N) [ v / x ]ᴱ = (M [ v / x ]ᴱ) $ (N [ v / x ]ᴱ)
|
(M $ N) [ v / x ]ᴱ = (M [ v / x ]ᴱ) $ (N [ v / x ]ᴱ)
|
||||||
function F is C end [ v / x ]ᴱ = function F is C [ v / x ]ᴮunless (x ≡ⱽ name(arg F)) end
|
function F is C end [ v / x ]ᴱ = function F is C [ v / x ]ᴮunless (x ≡ⱽ name(arg F)) end
|
||||||
block b is C end [ v / x ]ᴱ = block b is C [ v / x ]ᴮ end
|
block b is C end [ v / x ]ᴱ = block b is C [ v / x ]ᴮ end
|
||||||
|
@ -27,4 +28,3 @@ var y [ v / x ]ᴱwhenever no p = var y
|
||||||
|
|
||||||
B [ v / x ]ᴮunless yes p = B
|
B [ v / x ]ᴮunless yes p = B
|
||||||
B [ v / x ]ᴮunless no p = B [ v / x ]ᴮ
|
B [ v / x ]ᴮunless no p = B [ v / x ]ᴮ
|
||||||
|
|
||||||
|
|
|
@ -1,11 +1,11 @@
|
||||||
module Luau.Syntax where
|
module Luau.Syntax where
|
||||||
|
|
||||||
open import Agda.Builtin.Equality using (_≡_)
|
open import Agda.Builtin.Equality using (_≡_)
|
||||||
|
open import Agda.Builtin.Float using (Float)
|
||||||
open import Properties.Dec using (⊥)
|
open import Properties.Dec using (⊥)
|
||||||
open import Luau.Var using (Var)
|
open import Luau.Var using (Var)
|
||||||
open import Luau.Addr using (Addr)
|
open import Luau.Addr using (Addr)
|
||||||
open import Luau.Type using (Type)
|
open import Luau.Type using (Type)
|
||||||
open import FFI.Data.Scientific using (Scientific)
|
|
||||||
|
|
||||||
infixr 5 _∙_
|
infixr 5 _∙_
|
||||||
|
|
||||||
|
@ -53,4 +53,4 @@ data Expr a where
|
||||||
_$_ : Expr a → Expr a → Expr a
|
_$_ : Expr a → Expr a → Expr a
|
||||||
function_is_end : FunDec a → Block a → Expr a
|
function_is_end : FunDec a → Block a → Expr a
|
||||||
block_is_end : Var → Block a → Expr a
|
block_is_end : Var → Block a → Expr a
|
||||||
number_ : Scientific → Expr a
|
number_ : Float → Expr a
|
||||||
|
|
|
@ -9,6 +9,7 @@ open import FFI.Data.Aeson using (Value; Array; Object; object; array; string; f
|
||||||
open import FFI.Data.Bool using (true; false)
|
open import FFI.Data.Bool using (true; false)
|
||||||
open import FFI.Data.Either using (Either; Left; Right)
|
open import FFI.Data.Either using (Either; Left; Right)
|
||||||
open import FFI.Data.Maybe using (Maybe; nothing; just)
|
open import FFI.Data.Maybe using (Maybe; nothing; just)
|
||||||
|
open import FFI.Data.Scientific using (toFloat)
|
||||||
open import FFI.Data.String using (String; _++_)
|
open import FFI.Data.String using (String; _++_)
|
||||||
open import FFI.Data.Vector using (head; tail; null; empty)
|
open import FFI.Data.Vector using (head; tail; null; empty)
|
||||||
|
|
||||||
|
@ -85,7 +86,7 @@ exprFromObject obj | just (string "AstExprLocal") | just x | Right x′ = Right
|
||||||
exprFromObject obj | just (string "AstExprLocal") | just x | Left err = Left err
|
exprFromObject obj | just (string "AstExprLocal") | just x | Left err = Left err
|
||||||
exprFromObject obj | just (string "AstExprLocal") | nothing = Left "AstExprLocal missing local"
|
exprFromObject obj | just (string "AstExprLocal") | nothing = Left "AstExprLocal missing local"
|
||||||
exprFromObject obj | just (string "AstExprConstantNumber") with lookup value obj
|
exprFromObject obj | just (string "AstExprConstantNumber") with lookup value obj
|
||||||
exprFromObject obj | just (string "AstExprConstantNumber") | just (FFI.Data.Aeson.Value.number x) = Right (number x)
|
exprFromObject obj | just (string "AstExprConstantNumber") | just (FFI.Data.Aeson.Value.number x) = Right (number (toFloat x))
|
||||||
exprFromObject obj | just (string "AstExprConstantNumber") | just _ = Left "AstExprConstantNumber value is not a number"
|
exprFromObject obj | just (string "AstExprConstantNumber") | just _ = Left "AstExprConstantNumber value is not a number"
|
||||||
exprFromObject obj | just (string "AstExprConstantNumber") | nothing = Left "AstExprConstantNumber missing value"
|
exprFromObject obj | just (string "AstExprConstantNumber") | nothing = Left "AstExprConstantNumber missing value"
|
||||||
exprFromObject obj | just (string ty) = Left ("TODO: Unsupported AstExpr " ++ ty)
|
exprFromObject obj | just (string ty) = Left ("TODO: Unsupported AstExpr " ++ ty)
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
module Luau.Syntax.ToString where
|
module Luau.Syntax.ToString where
|
||||||
|
|
||||||
|
open import Agda.Builtin.Float using (primShowFloat)
|
||||||
open import Luau.Syntax using (Block; Stat; Expr; VarDec; FunDec; nil; var; var_∈_; addr; _$_; function_is_end; return; local_←_; _∙_; done; block_is_end; _⟨_⟩; _⟨_⟩∈_; number_)
|
open import Luau.Syntax using (Block; Stat; Expr; VarDec; FunDec; nil; var; var_∈_; addr; _$_; function_is_end; return; local_←_; _∙_; done; block_is_end; _⟨_⟩; _⟨_⟩∈_; number_)
|
||||||
open import FFI.Data.String using (String; _++_)
|
open import FFI.Data.String using (String; _++_)
|
||||||
open import FFI.Data.Scientific using (show)
|
|
||||||
open import Luau.Addr.ToString using (addrToString)
|
open import Luau.Addr.ToString using (addrToString)
|
||||||
open import Luau.Type.ToString using (typeToString)
|
open import Luau.Type.ToString using (typeToString)
|
||||||
open import Luau.Var.ToString using (varToString)
|
open import Luau.Var.ToString using (varToString)
|
||||||
|
@ -37,7 +37,7 @@ exprToString′ lb (block b is B end) =
|
||||||
"(" ++ b ++ "()" ++ lb ++
|
"(" ++ b ++ "()" ++ lb ++
|
||||||
" " ++ (blockToString′ (lb ++ " ") B) ++ lb ++
|
" " ++ (blockToString′ (lb ++ " ") B) ++ lb ++
|
||||||
"end)()"
|
"end)()"
|
||||||
exprToString′ lb (number x) = show x
|
exprToString′ lb (number x) = primShowFloat x
|
||||||
|
|
||||||
statToString′ lb (function F is B end) =
|
statToString′ lb (function F is B end) =
|
||||||
"local " ++ funDecToString F ++ lb ++
|
"local " ++ funDecToString F ++ lb ++
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
module Luau.Value where
|
module Luau.Value where
|
||||||
|
|
||||||
open import FFI.Data.Scientific using (Scientific)
|
open import Agda.Builtin.Float using (Float)
|
||||||
open import Luau.Addr using (Addr)
|
open import Luau.Addr using (Addr)
|
||||||
open import Luau.Syntax using (Block; Expr; nil; addr)
|
open import Luau.Syntax using (Block; Expr; nil; addr)
|
||||||
open import Luau.Var using (Var)
|
open import Luau.Var using (Var)
|
||||||
|
@ -8,7 +8,7 @@ open import Luau.Var using (Var)
|
||||||
data Value : Set where
|
data Value : Set where
|
||||||
nil : Value
|
nil : Value
|
||||||
addr : Addr → Value
|
addr : Addr → Value
|
||||||
number : Scientific → Value
|
number : Float → Value
|
||||||
|
|
||||||
val : ∀ {a} → Value → Expr a
|
val : ∀ {a} → Value → Expr a
|
||||||
val nil = nil
|
val nil = nil
|
||||||
|
|
|
@ -1,11 +1,11 @@
|
||||||
module Luau.Value.ToString where
|
module Luau.Value.ToString where
|
||||||
|
|
||||||
open import Agda.Builtin.String using (String)
|
open import Agda.Builtin.String using (String)
|
||||||
open import FFI.Data.Scientific using (show)
|
open import Agda.Builtin.Float using (primShowFloat)
|
||||||
open import Luau.Value using (Value; nil; addr; number)
|
open import Luau.Value using (Value; nil; addr; number)
|
||||||
open import Luau.Addr.ToString using (addrToString)
|
open import Luau.Addr.ToString using (addrToString)
|
||||||
|
|
||||||
valueToString : Value → String
|
valueToString : Value → String
|
||||||
valueToString nil = "nil"
|
valueToString nil = "nil"
|
||||||
valueToString (addr a) = addrToString a
|
valueToString (addr a) = addrToString a
|
||||||
valueToString (number x) = show x
|
valueToString (number x) = primShowFloat x
|
||||||
|
|
|
@ -3,9 +3,9 @@ module Properties.Step where
|
||||||
open import Agda.Builtin.Equality using (_≡_; refl)
|
open import Agda.Builtin.Equality using (_≡_; refl)
|
||||||
open import FFI.Data.Maybe using (just; nothing)
|
open import FFI.Data.Maybe using (just; nothing)
|
||||||
open import Luau.Heap using (Heap; _[_]; alloc; ok; function_is_end)
|
open import Luau.Heap using (Heap; _[_]; alloc; ok; function_is_end)
|
||||||
open import Luau.Syntax using (Block; Expr; nil; var; addr; function_is_end; block_is_end; _$_; local_←_; return; done; _∙_; name; fun; arg)
|
open import Luau.Syntax using (Block; Expr; nil; var; addr; function_is_end; block_is_end; _$_; local_←_; return; done; _∙_; name; fun; arg; number_)
|
||||||
open import Luau.OpSem using (_⊢_⟶ᴱ_⊣_; _⊢_⟶ᴮ_⊣_; app ; beta; function; block; return; done; local; subst)
|
open import Luau.OpSem using (_⊢_⟶ᴱ_⊣_; _⊢_⟶ᴮ_⊣_; app ; beta; function; block; return; done; local; subst)
|
||||||
open import Luau.RuntimeError using (RuntimeErrorᴱ; RuntimeErrorᴮ; NilIsNotAFunction; UnboundVariable; SEGV; app; block; local; return)
|
open import Luau.RuntimeError using (RuntimeErrorᴱ; RuntimeErrorᴮ; ValueNotCallable; UnboundVariable; SEGV; app; block; local; return)
|
||||||
open import Luau.Substitution using (_[_/_]ᴮ)
|
open import Luau.Substitution using (_[_/_]ᴮ)
|
||||||
open import Luau.Value using (nil; addr; val)
|
open import Luau.Value using (nil; addr; val)
|
||||||
open import Properties.Remember using (remember; _,_)
|
open import Properties.Remember using (remember; _,_)
|
||||||
|
@ -30,9 +30,11 @@ stepᴮ : ∀ {a} H B → StepResultᴮ {a} H B
|
||||||
stepᴱ H nil = value nil refl
|
stepᴱ H nil = value nil refl
|
||||||
stepᴱ H (var x) = error (UnboundVariable x)
|
stepᴱ H (var x) = error (UnboundVariable x)
|
||||||
stepᴱ H (addr a) = value (addr a) refl
|
stepᴱ H (addr a) = value (addr a) refl
|
||||||
|
stepᴱ H (number x) = value (Luau.Value.Value.number x) refl
|
||||||
stepᴱ H (M $ N) with stepᴱ H M
|
stepᴱ H (M $ N) with stepᴱ H M
|
||||||
stepᴱ H (M $ N) | step H′ M′ D = step H′ (M′ $ N) (app D)
|
stepᴱ H (M $ N) | step H′ M′ D = step H′ (M′ $ N) (app D)
|
||||||
stepᴱ H (nil $ N) | value nil refl = error NilIsNotAFunction
|
stepᴱ H (nil $ N) | value nil refl = error (ValueNotCallable (nil $ N))
|
||||||
|
stepᴱ H ((number _) $ N) | value (Luau.Value.Value.number x) refl = error (ValueNotCallable ((number x) $ N))
|
||||||
stepᴱ H (addr a $ N) | value (addr a) refl with remember (H [ a ])
|
stepᴱ H (addr a $ N) | value (addr a) refl with remember (H [ a ])
|
||||||
stepᴱ H (addr a $ N) | value (addr a) refl | (nothing , p) = error (app (SEGV a p))
|
stepᴱ H (addr a $ N) | value (addr a) refl | (nothing , p) = error (app (SEGV a p))
|
||||||
stepᴱ H (addr a $ N) | value (addr a) refl | (just(function F is B end) , p) = step H (block fun F is (local arg F ← N) ∙ B end) (beta p)
|
stepᴱ H (addr a $ N) | value (addr a) refl | (just(function F is B end) , p) = step H (block fun F is (local arg F ← N) ∙ B end) (beta p)
|
||||||
|
|
Loading…
Add table
Reference in a new issue