From 08016309b7b999d80f57af6197b011101fa9344e Mon Sep 17 00:00:00 2001 From: Noah Date: Fri, 12 Jul 2024 15:56:58 -0400 Subject: [PATCH] gen glassbr.py example --- .../lib/Language/Drasil/Code/Imperative/Import.hs | 5 +++-- .../glassbr/lib/Drasil/GlassBR/Unitals.hs | 4 ++-- code/drasil-lang/lib/Language/Drasil/CodeExpr/Lang.hs | 2 +- code/drasil-lang/lib/Language/Drasil/Expr/Class.hs | 9 ++++++++- code/drasil-lang/lib/Language/Drasil/Expr/Lang.hs | 10 ++++++++-- code/drasil-lang/lib/Language/Drasil/ModelExpr/Lang.hs | 2 +- 6 files changed, 23 insertions(+), 9 deletions(-) diff --git a/code/drasil-code/lib/Language/Drasil/Code/Imperative/Import.hs b/code/drasil-code/lib/Language/Drasil/Code/Imperative/Import.hs index 84d2bb5c10..c7a8755b17 100644 --- a/code/drasil-code/lib/Language/Drasil/Code/Imperative/Import.hs +++ b/code/drasil-code/lib/Language/Drasil/Code/Imperative/Import.hs @@ -9,7 +9,8 @@ module Language.Drasil.Code.Imperative.Import (codeType, spaceCodeType, import Language.Drasil (HasSymbol, HasUID(..), HasSpace(..), Space (Rational, Real), RealInterval(..), UID, Constraint(..), Inclusive (..)) import Database.Drasil (symbResolve) -import Language.Drasil.CodeExpr (sy, ($<), ($>), ($<=), ($>=), ($&&), ($=), exactDbl, idx) +import Language.Drasil.CodeExpr (sy, ($<), ($>), ($<=), ($>=), ($&&), idxOf) +import qualified Language.Drasil.CodeExpr as CE (int) import Language.Drasil.CodeExpr.Development (CodeExpr(..), ArithBinOp(..), AssocArithOper(..), AssocBoolOper(..), AssocConcatOper(..), BoolBinOp(..), EqBinOp(..), LABinOp(..), OrdBinOp(..), UFunc(..), UFuncB(..), UFuncVV(..), UFuncVN(..), @@ -401,7 +402,7 @@ renderRealInt s (UpFrom (Inc, a)) = sy s $>= a renderRealInt s (UpFrom (Exc, a)) = sy s $> a renderSet :: (HasUID c, HasSymbol c) => c -> CodeExpr -> CodeExpr -renderSet e s = ((idx s (sy e))$= exactDbl 0) +renderSet e s = ((idxOf s (sy e))$>= CE.int 0) -- | Maps a 'UFunc' to the corresponding GOOL unary function. unop :: (OOProg r) => UFunc -> (SValue r -> SValue r) diff --git a/code/drasil-example/glassbr/lib/Drasil/GlassBR/Unitals.hs b/code/drasil-example/glassbr/lib/Drasil/GlassBR/Unitals.hs index b2bc41a56a..dcadca0b44 100644 --- a/code/drasil-example/glassbr/lib/Drasil/GlassBR/Unitals.hs +++ b/code/drasil-example/glassbr/lib/Drasil/GlassBR/Unitals.hs @@ -105,8 +105,8 @@ standOffDist = uq (constrained' (uc sD (variable "SD") Real metre) nomThick = cuc "nomThick" (nounPhraseSent $ S "nominal thickness") - lT millimetre {-Discrete nominalThicknesses, but not implemented-} Integer - [sfwrElem $ mkSet (map exactDbl [2,2,3,4,5,6,8,10,12,16,19,22])] $ exactDbl 8 -- for testing + lT millimetre {-Discrete nominalThicknesses, but not implemented-} Rational + [sfwrElem $ mkSet (map dbl nominalThicknesses)] $ exactDbl 8 -- for testing glassTypeCon = constrainedNRV' (dqdNoUnit glassTy lG String) [{- TODO: add back constraint: EnumeratedStr Software $ map (abrv . snd) glassType -}] diff --git a/code/drasil-lang/lib/Language/Drasil/CodeExpr/Lang.hs b/code/drasil-lang/lib/Language/Drasil/CodeExpr/Lang.hs index 15797e620a..a84bf49f34 100644 --- a/code/drasil-lang/lib/Language/Drasil/CodeExpr/Lang.hs +++ b/code/drasil-lang/lib/Language/Drasil/CodeExpr/Lang.hs @@ -26,7 +26,7 @@ data BoolBinOp = Impl | Iff deriving Eq -- | Index operator. -data LABinOp = Index +data LABinOp = Index | IndexOf deriving Eq -- | Ordered binary operators (less than, greater than, less than or equal to, greater than or equal to). diff --git a/code/drasil-lang/lib/Language/Drasil/Expr/Class.hs b/code/drasil-lang/lib/Language/Drasil/Expr/Class.hs index 78602f6e67..dc48d7358b 100644 --- a/code/drasil-lang/lib/Language/Drasil/Expr/Class.hs +++ b/code/drasil-lang/lib/Language/Drasil/Expr/Class.hs @@ -176,7 +176,9 @@ class ExprC r where -- | Smart constructor for indexing. idx :: r -> r -> r - + + idxOf :: r -> r -> r + -- | Smart constructor for the summation, product, and integral functions over an interval. defint, defsum, defprod :: Symbol -> r -> r -> r -> r @@ -339,6 +341,7 @@ instance ExprC Expr where -- | Smart constructor for indexing. idx = LABinaryOp Index + idxOf = LABinaryOp IndexOf -- | Integrate over some expression with bounds (∫). defint v low high = Operator Add (BoundedDD v Continuous low high) @@ -501,6 +504,9 @@ instance ExprC M.ModelExpr where -- | Smart constructor for indexing. idx = M.LABinaryOp M.Index + -- | Smart constructor for indexing. + idxOf = M.LABinaryOp M.IndexOf + -- | Integrate over some expression with bounds (∫). defint v low high = M.Operator M.Add (BoundedDD v Continuous low high) @@ -665,6 +671,7 @@ instance ExprC C.CodeExpr where -- | Smart constructor for indexing. idx = C.LABinaryOp C.Index + idxOf = C.LABinaryOp C.IndexOf -- | Integrate over some expression with bounds (∫). defint v low high = C.Operator C.Add (BoundedDD v Continuous low high) diff --git a/code/drasil-lang/lib/Language/Drasil/Expr/Lang.hs b/code/drasil-lang/lib/Language/Drasil/Expr/Lang.hs index f6db4f811e..6a5b09b4dc 100644 --- a/code/drasil-lang/lib/Language/Drasil/Expr/Lang.hs +++ b/code/drasil-lang/lib/Language/Drasil/Expr/Lang.hs @@ -39,7 +39,7 @@ data BoolBinOp = Impl | Iff deriving Eq -- | Index operator. -data LABinOp = Index +data LABinOp = Index | IndexOf deriving Eq -- | Ordered binary operators (less than, greater than, less than or equal to, greater than or equal to). @@ -399,7 +399,13 @@ instance Typed Expr Space where (Left lt , Left _) -> Right $ "List accessor expects a list/vector, but received `" ++ show lt ++ "`." (_ , Right e) -> Right e (Right e , _ ) -> Right e - + infer cxt (LABinaryOp IndexOf l n) = case (infer cxt l, infer cxt n) of + (Left (S.Set lt), Left nt) -> if S.isBasicNumSpace lt && nt == lt-- I guess we should only want it to be natural numbers, but integers or naturals is fine for now + then Left lt + else Right $ "List accessor not of type Integer nor Natural, but of type `" ++ show nt ++ "`" + (Left lt , Left _) -> Right $ "List accessor expects a list/vector, but received `" ++ show lt ++ "`." + (_ , Right e) -> Right e + (Right e , _ ) -> Right e infer cxt (OrdBinaryOp _ l r) = case (infer cxt l, infer cxt r) of (Left lt, Left rt) -> if S.isBasicNumSpace lt && lt == rt then Left S.Boolean diff --git a/code/drasil-lang/lib/Language/Drasil/ModelExpr/Lang.hs b/code/drasil-lang/lib/Language/Drasil/ModelExpr/Lang.hs index e19937a557..b7444142f6 100644 --- a/code/drasil-lang/lib/Language/Drasil/ModelExpr/Lang.hs +++ b/code/drasil-lang/lib/Language/Drasil/ModelExpr/Lang.hs @@ -27,7 +27,7 @@ data BoolBinOp = Impl | Iff deriving Eq -- | Index operator. -data LABinOp = Index +data LABinOp = Index | IndexOf deriving Eq -- | Ordered binary operators (less than, greater than, less than or equal to, greater than or equal to).