diff options
author | Camil Staps | 2016-03-02 23:40:25 +0100 |
---|---|---|
committer | Camil Staps | 2016-03-02 23:40:25 +0100 |
commit | 2856828c645aa868f9a1caa439cab535427d1f58 (patch) | |
tree | 122499e16872beb99284e74955e6a157a5e51807 /iclean.icl | |
parent | Moved runflags to clmflags (diff) |
Implemented memory
Not release ready:
- Cannot forget things
- Not documented in Readme
Diffstat (limited to 'iclean.icl')
-rw-r--r-- | iclean.icl | 51 |
1 files changed, 31 insertions, 20 deletions
@@ -29,11 +29,13 @@ module iclean import StdEnv import ReadLine +import ExtraString // SETTINGS temp_path :== "/tmp/" temp_module :== "iclean" readline_history :== ".iclean_history" +template :== ["import StdEnv"] // END SETTINGS temp_file :== temp_path +++ temp_module +++ ".icl" @@ -43,23 +45,31 @@ Start w # w = setReadLineName "iClean" w # w = usingHistory w # w = checkedWorldFunc readHistory "Couldn't read history file\n" readline_history w -# w = loop w +# w = loop template True w # w = checkedWorldFunc writeHistory "Couldn't write history file\n" readline_history w = w where - loop :: !*World -> *World - loop w - # (s,w) = readLine "λ. " False w - | isNothing s = print "\n" w - # s = fromJust s - | s == "" = loop (print "Use Ctrl-D to exit\n" w) - # w = addHistory s w - # w = writemodule s w - # (r,w) = compile temp_path temp_module w - | r <> 0 = loop w - # w = run (temp_path +++ temp_module) w - = loop w + loop :: ![String] Bool !*World -> *World + loop mem success w + # prompt = color (if success None Red) "λ. " + # (s,w) = readLine prompt False w + | isNothing s = print "\n" w + # s = fromJust s + | s == "" = loop mem False (print "Use Ctrl-D to exit\n" w) + # w = addHistory s w + | s == ":quit" || s == ":q" = w + | s == ":mem" = loop mem True (print (join "\n" mem) w) + | matches ":import " s = loop (mem ++ [skip 1 s]) True w + | matches ":def " s = loop (mem ++ [skip 5 s]) True w + | matches ":" s = loop mem False (print ("Unknown command " +++ s +++ "\n") w) + # w = writemodule mem s w + # (r,w) = compile temp_path temp_module w + | r <> 0 = loop mem False w + # (r,w) = run (temp_path +++ temp_module +++ " -nt") w + | r <> 0 = loop mem False w + = loop mem True w +// iClean functions checkedWorldFunc :: (a *World -> (Bool, *World)) !String !a !*World -> *World checkedWorldFunc f err s w # (ok, w) = f s w @@ -74,24 +84,25 @@ print s w | not ok = abort "Couldn't close stdio\n" | otherwise = w -writemodule :: String *World -> *World -writemodule s w +writemodule :: ![String] !String !*World -> *World +writemodule mem s w # (ok,f,w) = fopen temp_file FWriteText w | not ok = abort ("Couldn't open " +++ temp_file +++ " for writing.\n") # f = fwrites ("module " +++ temp_module +++ "\n") f -# f = fwrites "import StdEnv\n" f +# f = fwrites (join "\n" mem) f # f = fwrites ("Start = " +++ s +++ "\n") f # (ok,w) = fclose f w | not ok = abort ("Couldn't close " +++ temp_file +++ "\n") | otherwise = w -compile :: !String !String !*World -> *(!Int,*World) +// C functions +compile :: !String !String !*World -> *(!Int,!*World) compile _ _ _ = code { - ccall compile "SS:p:p" + ccall compile "SS:p:A" } -run :: !String *World -> *World +run :: !String !*World -> (!Int, !*World) run _ _ = code { - ccall run "S:V:p" + ccall run "S:I:A" } |