basic arithmetic DSL

This commit is contained in:
Felix Dilke 2026-01-14 12:36:24 +00:00
parent c9e8feacc9
commit f71984b647
5 changed files with 76 additions and 5 deletions

View File

@ -3,7 +3,9 @@
<component name="MaterialThemeProjectNewConfig">
<option name="metadata">
<MTProjectMetadataState>
<option name="userId" value="-70c0f615:19bbbe81457:-7f6e" />
<option name="migrated" value="true" />
<option name="pristineConfig" value="false" />
<option name="userId" value="-4395108f:199cee938a2:-7ff9" />
</MTProjectMetadataState>
</option>
</component>

View File

@ -78,13 +78,13 @@ test-suite haskell-exps-test
-- Test dependencies.
build-depends: base, hspec, langfeatures
other-modules: Test.OlogsSpec
other-modules: Test.OlogsSpec,
Test.SimpleParserSpec
library langfeatures
build-depends: base, containers
build-depends: base, containers, megaparsec
hs-source-dirs: src
exposed-modules: Ologs
exposed-modules: Ologs, SimpleParser
ghc-options: -Wall
executable haskell-experiments

View File

@ -0,0 +1,41 @@
{-# LANGUAGE BlockArguments #-}
{-# LANGUAGE DuplicateRecordFields #-}
{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE OverloadedRecordDot #-}
{-# HLINT ignore "Unused LANGUAGE pragma" #-}
{-# HLINT ignore "Use concatMap" #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications #-}
{-# HLINT ignore "Move catMaybes" #-}
{-# HLINT ignore "Use mapMaybe" #-}
{-# HLINT ignore "Use list comprehension" #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE NoFieldSelectors #-}
{-# LANGUAGE NoMonomorphismRestriction #-}
{-# OPTIONS_GHC -Wno-unrecognised-pragmas #-}
module SimpleParser
( eval, Expr (..) )
where
import Text.Megaparsec
import Data.Void (Void)
type Parser = Parsec Void String
data Expr =
Add Expr Expr |
Subtract Expr Expr |
Multiply Expr Expr |
Divide Expr Expr |
Negate Expr |
Literal Int
eval :: Expr -> Int
eval (Literal n) = n
eval (Add a b) = (eval a) + (eval b)
eval (Subtract a b) = (eval a) - (eval b)
eval (Multiply a b) = (eval a) * (eval b)
eval (Divide a b) = (eval a) `div` (eval b)
eval (Negate a) = -(eval a)

View File

@ -2,10 +2,12 @@ module Main (main) where
import Test.Hspec
import qualified Test.OlogsSpec as Ologs
import qualified Test.SimpleParserSpec as SimpleParserSpec
--import Test.FooSpec
main :: IO ()
main = hspec $ do
describe "Ologs" Ologs.spec
describe "SimpleParser" SimpleParserSpec.spec
-- describe "My amazing tests" [ FastLaneSpec FooSpec ]

View File

@ -0,0 +1,26 @@
{-# LANGUAGE DuplicateRecordFields #-}
{-# LANGUAGE OverloadedRecordDot #-}
{-# HLINT ignore "Use const" #-}
{-# HLINT ignore "Unused LANGUAGE pragma" #-}
{-# HLINT ignore "Avoid lambda" #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE NoFieldSelectors #-}
{-# OPTIONS_GHC -Wno-unrecognised-pragmas #-}
{-# LANGUAGE TypeApplications #-}
module Test.SimpleParserSpec where
import Test.Hspec
import SimpleParser
spec :: Spec
spec = do
describe "evaluate expressions" $ do
it "arithmetic on literals" $ do
eval (Add (Literal 2) (Literal 3) ) `shouldBe` 5
eval (Subtract (Literal 2) (Literal 3) ) `shouldBe` -1
eval (Multiply (Literal 2) (Literal 3) ) `shouldBe` 6
eval (Divide (Literal 7) (Literal 3) ) `shouldBe` 2