aboutsummaryrefslogtreecommitdiff
path: root/iclean.icl
diff options
context:
space:
mode:
authorCamil Staps2016-03-02 23:40:25 +0100
committerCamil Staps2016-03-02 23:40:25 +0100
commit2856828c645aa868f9a1caa439cab535427d1f58 (patch)
tree122499e16872beb99284e74955e6a157a5e51807 /iclean.icl
parentMoved 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.icl51
1 files changed, 31 insertions, 20 deletions
diff --git a/iclean.icl b/iclean.icl
index 9f51c05..30287fe 100644
--- a/iclean.icl
+++ b/iclean.icl
@@ -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"
}