git.iko.soy/rowtype-yoga/purescript-native
on golang help sign in
Object getters
4813b5fGary Burgess
examples/passing/ObjectGetter.pursnew file+9
@@ -0,0 +1,9 @@
1+module Main where
2+
3+getX = _.x
4+
5+point = { x: 1, y: 0 }
6+
7+main = do
8+ Debug.Trace.print $ getX point
9+ Debug.Trace.trace $ _.value { value: "Done!" }
src/Language/PureScript/AST/Declarations.hs+5
@@ -325,6 +325,11 @@ data Expr
325 --
325 --
326 | ObjectConstructor [(String, Maybe Expr)]
326 | ObjectConstructor [(String, Maybe Expr)]
327 -- |
327 -- |
328+ -- An object property getter (e.g. `_.x`). This will be removed during
329+ -- desugaring and expanded into a lambda that reads a property from an object.
330+ --
331+ | ObjectGetter String
332+ -- |
328 -- An record property accessor expression
333 -- An record property accessor expression
329 --
334 --
330 | Accessor String Expr
335 | Accessor String Expr
src/Language/PureScript/Parser/Declarations.hs+4
@@ -345,6 +345,7 @@ parseValueAtom = P.choice
345 , P.try parseBooleanLiteral
345 , P.try parseBooleanLiteral
346 , parseArrayLiteral
346 , parseArrayLiteral
347 , P.try parseObjectLiteral
347 , P.try parseObjectLiteral
348+ , parseObjectGetter
348 , parseAbs
349 , parseAbs
349 , P.try parseConstructor
350 , P.try parseConstructor
350 , P.try parseVar
351 , P.try parseVar
@@ -383,6 +384,9 @@ parseDoNotationElement = P.choice
383 , parseDoNotationLet
384 , parseDoNotationLet
384 , P.try (DoNotationValue <$> parseValue) ]
385 , P.try (DoNotationValue <$> parseValue) ]
385
386
387+parseObjectGetter :: TokenParser Expr
388+parseObjectGetter = ObjectGetter <$> (underscore *> C.indented *> dot *> C.indented *> (lname <|> stringLiteral))
389+
386-- |
390-- |
387-- Parse a value
391-- Parse a value
388--
392--
src/Language/PureScript/Sugar/ObjectWildcards.hs+2
@@ -37,6 +37,8 @@ desugarObjectConstructors (Module mn ds exts) = Module mn (map desugarDecl ds) e
37 in if null args
37 in if null args
38 then ObjectLiteral $ second fromJust `map` props
38 then ObjectLiteral $ second fromJust `map` props
39 else foldr (Abs . Left . Ident . fst) (ObjectLiteral (mkProp `map` ps)) args
39 else foldr (Abs . Left . Ident . fst) (ObjectLiteral (mkProp `map` ps)) args
40+ desugarExpr (ObjectGetter prop) =
41+ Abs (Left (Ident "obj")) (Accessor prop (Var (Qualified Nothing (Ident "obj"))))
40 desugarExpr e = e
42 desugarExpr e = e
41
43
42 mkProp :: (String, Maybe Expr) -> (String, Expr)
44 mkProp :: (String, Maybe Expr) -> (String, Expr)