From b4bbd298a026594e8f7a792ae6072b7e5207a04d Mon Sep 17 00:00:00 2001 From: VegOwOtenks Date: Sun, 15 Sep 2024 17:58:43 +0200 Subject: [PATCH] replacing Variables with constant values --- hc.cabal | 3 +++ package.yaml | 1 + src/Lib.hs | 11 +++++++++-- 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/hc.cabal b/hc.cabal index 40d475c..ed1564b 100644 --- a/hc.cabal +++ b/hc.cabal @@ -35,6 +35,7 @@ library ghc-options: -Wall -Wcompat -Widentities -Wincomplete-record-updates -Wincomplete-uni-patterns -Wmissing-export-lists -Wmissing-home-modules -Wpartial-fields -Wredundant-constraints build-depends: base >=4.7 && <5 + , containers , parsec default-language: Haskell2010 @@ -49,6 +50,7 @@ executable hc-exe ghc-options: -Wall -Wcompat -Widentities -Wincomplete-record-updates -Wincomplete-uni-patterns -Wmissing-export-lists -Wmissing-home-modules -Wpartial-fields -Wredundant-constraints -threaded -rtsopts -with-rtsopts=-N build-depends: base >=4.7 && <5 + , containers , hc , parsec default-language: Haskell2010 @@ -65,6 +67,7 @@ test-suite hc-test ghc-options: -Wall -Wcompat -Widentities -Wincomplete-record-updates -Wincomplete-uni-patterns -Wmissing-export-lists -Wmissing-home-modules -Wpartial-fields -Wredundant-constraints -threaded -rtsopts -with-rtsopts=-N build-depends: base >=4.7 && <5 + , containers , hc , parsec default-language: Haskell2010 diff --git a/package.yaml b/package.yaml index 2287f3b..6dcae46 100644 --- a/package.yaml +++ b/package.yaml @@ -22,6 +22,7 @@ description: Please see the README on GitHub at = 4.7 && < 5 - parsec +- containers ghc-options: - -Wall diff --git a/src/Lib.hs b/src/Lib.hs index e244e22..d83b50d 100644 --- a/src/Lib.hs +++ b/src/Lib.hs @@ -1,9 +1,11 @@ module Lib - ( exprparser, evaluate + ( exprparser, evaluate, replaceVars ) where import Control.Applicative((<*)) import Data.Ratio +import Data.Map (Map) +import qualified Data.Map as Map import Text.Parsec import Text.Parsec.Char @@ -26,7 +28,7 @@ def = emptyDef{ commentStart = "" , opStart = oneOf "+-/*^" , opLetter = oneOf "+-/*^" , reservedOpNames = ["+", "-", "/", "*", "^"] - , reservedNames = ["pi", "e"] + , reservedNames = [] } TokenParser{ parens = m_parens @@ -89,6 +91,11 @@ term = m_parens exprparser <|> fmap Constant constantInteger <|> fmap Constant constantRational +replaceVars :: Expr -> Map.Map String Rational -> Expr +replaceVars (Variable name) vs = Constant . maybe (0 % 1) id $ Map.lookup name vs +replaceVars (Binary op a b) vs = Binary op (replaceVars a vs) (replaceVars b vs) +replaceVars (Constant c) vs = Constant c + evaluate :: Expr -> Rational evaluate (Constant c) = c evaluate (Binary Plus a b) = evaluate a + evaluate b