From f71984b6470ae9c5ec914b11fac75732bb5ffa1d Mon Sep 17 00:00:00 2001 From: Felix Dilke Date: Wed, 14 Jan 2026 12:36:24 +0000 Subject: [PATCH] basic arithmetic DSL --- .../.idea/material_theme_project_new.xml | 4 +- haskell-experiments/haskell-experiments.cabal | 8 ++-- haskell-experiments/src/SimpleParser.hs | 41 +++++++++++++++++++ haskell-experiments/test/Main.hs | 2 + .../test/Test/SimpleParserSpec.hs | 26 ++++++++++++ 5 files changed, 76 insertions(+), 5 deletions(-) create mode 100644 haskell-experiments/src/SimpleParser.hs create mode 100644 haskell-experiments/test/Test/SimpleParserSpec.hs diff --git a/haskell-experiments/.idea/material_theme_project_new.xml b/haskell-experiments/.idea/material_theme_project_new.xml index d582fbf..3772ef8 100644 --- a/haskell-experiments/.idea/material_theme_project_new.xml +++ b/haskell-experiments/.idea/material_theme_project_new.xml @@ -3,7 +3,9 @@ diff --git a/haskell-experiments/haskell-experiments.cabal b/haskell-experiments/haskell-experiments.cabal index bde08fd..52e827b 100644 --- a/haskell-experiments/haskell-experiments.cabal +++ b/haskell-experiments/haskell-experiments.cabal @@ -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 diff --git a/haskell-experiments/src/SimpleParser.hs b/haskell-experiments/src/SimpleParser.hs new file mode 100644 index 0000000..14d06cd --- /dev/null +++ b/haskell-experiments/src/SimpleParser.hs @@ -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) + diff --git a/haskell-experiments/test/Main.hs b/haskell-experiments/test/Main.hs index 8fcaf22..deca85c 100644 --- a/haskell-experiments/test/Main.hs +++ b/haskell-experiments/test/Main.hs @@ -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 ] diff --git a/haskell-experiments/test/Test/SimpleParserSpec.hs b/haskell-experiments/test/Test/SimpleParserSpec.hs new file mode 100644 index 0000000..1fe6d0c --- /dev/null +++ b/haskell-experiments/test/Test/SimpleParserSpec.hs @@ -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 + +