1
0
Fork 0

some actual calc stuff

This commit is contained in:
Sean Sube 2022-09-28 00:05:16 -05:00
parent 1e94ee8299
commit c50f49ebcb
5 changed files with 93 additions and 2 deletions

2
.gitignore vendored
View File

@ -2,4 +2,4 @@ MAlonzo/
out/ out/
*.agdai *.agdai
calc Calc

View File

@ -1 +1,18 @@
{-# OPTIONS --guardedness #-}
-- this one has main -- this one has main
module Calc where
open import Agda.Builtin.Char
open import Agda.Builtin.Nat
open import Agda.Builtin.String
open import Data.Nat.Show
open import IO
open import Parse
open import Util
main : Main
main = run (putStrLn (showMaybe show (takeNat "123a456")))

10
Makefile Normal file
View File

@ -0,0 +1,10 @@
.PHONY: clean
default: calc
clean:
rm -rfv MAlonzo/
rm -v calc
calc:
agda -c Calc.agda

View File

@ -1,3 +1,13 @@
module Parse where
open import Agda.Builtin.Char
open import Agda.Builtin.List
open import Agda.Builtin.Maybe
open import Agda.Builtin.Nat
open import Agda.Builtin.String
open import Util
data Token : Set where data Token : Set where
Digit : Nat → Token Digit : Nat → Token
Delim : Char → Token Delim : Char → Token
@ -20,6 +30,29 @@ parseChar '=' = Oper '='
parseChar '+' = Oper '+' parseChar '+' = Oper '+'
parseChar _ = Term parseChar _ = Term
parseNat : Nat → List Char → Nat
parseNat a [] = a
parseNat a (x ∷ xs) with parseChar x
... | Digit n = parseNat ((a * 10) + n) xs
... | _ = a
digits : List Char
digits = primStringToList "0123456789"
takeNat : String → Maybe Nat
takeNat s with takeCons digits (primStringToList s)
... | [] = nothing
... | xs = just (parseNat 0 xs)
parseList₂ : String → List Nat
parseList₂ s with primStringToList s
... | [] = []
... | (x ∷ xs) with parseChar x
... | Digit n = n ∷ []
... | _ = []
-- old stuff...
parseList : Nat → List Char → List Nat parseList : Nat → List Char → List Nat
parseList a [] = a ∷ [] parseList a [] = a ∷ []
parseList a (x ∷ xs) with parseChar x parseList a (x ∷ xs) with parseChar x

View File

@ -1,9 +1,11 @@
module Util where module Util where
open import Agda.Builtin.Bool open import Agda.Builtin.Bool
open import Agda.Builtin.Char
open import Agda.Builtin.List open import Agda.Builtin.List
open import Agda.Builtin.Maybe open import Agda.Builtin.Maybe
open import Agda.Builtin.Nat open import Agda.Builtin.Nat
open import Agda.Builtin.String
ident : {V : Set} → V → V ident : {V : Set} → V → V
ident x = x ident x = x
@ -42,3 +44,32 @@ takeIndex d [] 0 = d
takeIndex d [] (suc x) = d takeIndex d [] (suc x) = d
takeIndex d (x ∷ xs) 0 = x takeIndex d (x ∷ xs) 0 = x
takeIndex d (x ∷ xs) (suc n) = takeIndex d xs n takeIndex d (x ∷ xs) (suc n) = takeIndex d xs n
findIndex : Nat → Nat → List Nat → Maybe Nat
findIndex n t [] = nothing
findIndex n t (x ∷ xs) with (t == x)
... | true = just n
... | false = findIndex (suc n) t xs
findCharIndex : Nat → Char → List Char → Maybe Nat
findCharIndex n t [] = nothing
findCharIndex n t (x ∷ xs) with primCharEquality t x
... | true = just n
... | false = findCharIndex (suc n) t xs
showList : {V : Set} → (V → String) → List V → String
showList f [] = ""
showList f (x ∷ []) = f x
showList f (x ∷ xs) = primStringAppend (f x) (primStringAppend ", " (showList f xs))
showMaybe : {V : Set} → (V → String) → Maybe V → String
showMaybe f nothing = "nothing"
showMaybe f (just v) = f v
-- take consecutive occurences of a character set
takeCons : List Char → List Char → List Char
takeCons [] _ = []
takeCons _ [] = []
takeCons cs (x ∷ xs) with (findCharIndex 0 x cs)
... | nothing = []
... | just n = x ∷ (takeCons cs xs)