git.iko.soy/rowtype-yoga/purescript-native
on golang help sign in
Improve let declaration handling
commit6e719f43cbdc591f855dbe1b89dd0171366449a8 authorGary Burgess <gary.burgess@gmail.com> dateSun 16 Nov 2014, 01:03 (12 years ago) parent2e55e86
1 file changed+36−27
psci/Main.hs+36−27
psci/Main.hs+36−27
@@ -17,46 +17,40 @@
1717
1818module Main where
1919
20−import Commands
20+import Data.Foldable (traverse_)
21+import Data.List (intercalate, isPrefixOf, nub, sortBy, sort)
22+import Data.Maybe (mapMaybe)
23+import Data.Traversable (traverse)
24+import Data.Version (showVersion)
25+import qualified Data.Map as M
2126
2227import Control.Applicative
2328import Control.Monad
29+import Control.Monad.Error (ErrorT(..), MonadError)
30+import Control.Monad.Error.Class (MonadError(..))
2431import Control.Monad.Trans.Class
2532import Control.Monad.Trans.Maybe (MaybeT(..), runMaybeT)
2633import Control.Monad.Trans.State.Strict
2734import qualified Control.Monad.Trans.State.Lazy as L
28−import Control.Monad.Error (ErrorT(..), MonadError)
29−import Control.Monad.Error.Class (MonadError(..))
30−
31−import Data.List (intercalate, isPrefixOf, nub, sortBy, sort)
32−import Data.Maybe (mapMaybe)
33−import Data.Foldable (traverse_)
34−import Data.Version (showVersion)
35−import Data.Traversable (traverse)
36−
37−import Parser
3835
39−import System.IO.Error (tryIOError)
4036import System.Console.Haskeline
41−import System.Directory
42− (createDirectoryIfMissing, getModificationTime, doesFileExist,
43− findExecutable, getHomeDirectory, getCurrentDirectory)
44−import System.Process (readProcessWithExitCode)
37+import System.Directory (createDirectoryIfMissing, getModificationTime, doesFileExist, findExecutable, getHomeDirectory, getCurrentDirectory)
4538import System.Exit
46−import System.FilePath
47− (pathSeparator, takeDirectory, (</>), isPathSeparator)
39+import System.FilePath (pathSeparator, takeDirectory, (</>), isPathSeparator)
40+import System.IO.Error (tryIOError)
41+import System.Process (readProcessWithExitCode)
4842import qualified System.Console.CmdTheLine as Cmd
43+import qualified System.IO.UTF8 as U (writeFile, putStrLn, print, readFile)
4944
5045import Text.Parsec (ParseError)
5146
52−import qualified Data.Map as M
5347import qualified Language.PureScript as P
54−import qualified Paths_purescript as Paths
55−import qualified System.IO.UTF8 as U
56− (writeFile, putStrLn, print, readFile)
57−import qualified Language.PureScript.Names as N
5848import qualified Language.PureScript.Declarations as D
59−import qualified Language.PureScript.Constants as C
49+import qualified Language.PureScript.Names as N
50+import qualified Paths_purescript as Paths
51+
52+import Commands
53+import Parser
6054
6155-- |
6256-- The PSCI state.
@@ -316,6 +310,23 @@ handleDeclaration value = do
316310 Just (ExitFailure _, _, err) -> PSCI $ outputStrLn err
317311 Nothing -> PSCI $ outputStrLn "Couldn't find node.js"
318312
313+-- |
314+-- Takes a let declaration and updates the environment, then run a make. If the declaration fails,
315+-- restore the pre-let environment.
316+--
317+handleLet :: (P.Expr -> P.Expr) -> PSCI ()
318+handleLet l = do
319+ st <- PSCI $ lift get
320+ PSCI $ lift $ modify (updateLets l)
321+ st' <- PSCI $ lift get
322+ let m = createTemporaryModule False st' (P.ObjectLiteral [])
323+ e <- psciIO . runMake $ P.make modulesDir options (psciLoadedModules st' ++ [(Left P.RebuildAlways, m)]) []
324+ case e of
325+ Left err -> do
326+ PSCI $ outputStrLn err
327+ PSCI $ lift (put st)
328+ Right _ -> return ()
329+
319330-- |
320331-- Show actual loaded modules in psci.
321332--
@@ -445,9 +456,7 @@ handleCommand :: Command -> PSCI ()
445456handleCommand (Expression val) = handleDeclaration val
446457handleCommand Help = PSCI $ outputStrLn helpMessage
447458handleCommand (Import moduleName) = handleImport moduleName
448−handleCommand (Let l) = do
449− PSCI $ lift $ modify (updateLets l)
450− handleDeclaration (D.Var (N.Qualified (Just $ N.ModuleName [N.ProperName C.prelude]) (N.Ident C.unit)))
459+handleCommand (Let l) = handleLet l
451460handleCommand (LoadFile filePath) = do
452461 absPath <- psciIO $ expandTilde filePath
453462 exists <- psciIO $ doesFileExist absPath