From f83ffe578db6298bee4ee79ebfbdd58210dcce87 Mon Sep 17 00:00:00 2001 From: superatrain Date: Tue, 18 Dec 2012 21:08:27 -0500 Subject: [PATCH] Implemented ternary operator. --- Graphics/Implicit/ExtOpenScad/Default.hs | 7 ++++++- Graphics/Implicit/ExtOpenScad/Parser/Expr.hs | 17 +++++++++++++++-- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/Graphics/Implicit/ExtOpenScad/Default.hs b/Graphics/Implicit/ExtOpenScad/Default.hs index 6869fa07..09c85055 100644 --- a/Graphics/Implicit/ExtOpenScad/Default.hs +++ b/Graphics/Implicit/ExtOpenScad/Default.hs @@ -85,7 +85,8 @@ defaultPolymorphicFunctions = (">=", toOObj ((>=) :: ℝ -> ℝ -> Bool) ), ("<=", toOObj ((<=) :: ℝ -> ℝ -> Bool) ), ("==", toOObj ((==) :: OVal -> OVal -> Bool) ), - ("!=", toOObj ((/=) :: OVal -> OVal -> Bool) ), + ("!=", toOObj ((/=) :: OVal -> OVal -> Bool) ), + ("?", toOObj ( ternary :: Bool -> OVal -> OVal -> OVal) ), ("list_gen", toOObj list_gen) ] where @@ -196,3 +197,7 @@ defaultPolymorphicFunctions = [fromIntegral (ceiling a), fromIntegral (ceiling (a+b)).. fromIntegral (floor c)] list_gen _ = Nothing + ternary True a b = a + ternary False a b = b + + diff --git a/Graphics/Implicit/ExtOpenScad/Parser/Expr.hs b/Graphics/Implicit/ExtOpenScad/Parser/Expr.hs index f6175fbf..6da182c9 100644 --- a/Graphics/Implicit/ExtOpenScad/Parser/Expr.hs +++ b/Graphics/Implicit/ExtOpenScad/Parser/Expr.hs @@ -179,8 +179,7 @@ expression n@3 = expr <- expression $ n+1 return expr ) <|> try (expression $ n+1) -expression n@2 = try (expression $ n+1) -expression n@1 = +expression n@2 = try ( do firstExpr <- expression $ n+1 otherComparisonsExpr <- many $ do @@ -201,5 +200,19 @@ expression n@1 = [x] -> x :$ exprs _ -> collector "all" [(comparisons!!n) :$ [exprs!!n, exprs!!(n+1)] | n <- [0.. length comparisons - 1] ] )<|> try (expression $ n+1) +expression n@1 = + try (( do + a <- expression (n+1) + genSpace + string "?" + genSpace + b <- expression n + genSpace + string ":" + genSpace + c <- expression n + return $ Var "?" :$ [a,b,c] + ) "ternary") + <|> try (expression $ n+1) expression n@0 = try (do { genSpace; expr <- expression $ n+1; genSpace; return expr}) <|> try (expression $ n+1)