shithub: MicroHs

Download patch

ref: 4a0b0de0296d6792d81ebd4f3428b5a11138b939
parent: d0807e07a016e5a08e9f02d51d79d5e3378d5938
author: Lennart Augustsson <lennart.augustsson@epicgames.com>
date: Fri Sep 22 12:17:24 EDT 2023

Better command decoder

--- a/comb/mhs.comb
+++ b/comb/mhs.comb
@@ -1,3 +1,3 @@
 v3.5
-883
-(($A :0 _770) (($A :1 (($B _816) _0)) (($A :2 ((($S' _816) _0) $I)) (($A :3 _740) (($A :4 (_3 "undefined")) (($A :5 $I) (($A :6 ((($C' $B) _769) (($C _48) _5))) (($A :7 ((($C' _6) (_787 _45)) ((_48 _785) _44))) (($A :8 (($B (($S _816) _785)) _3)) (($A :9 $T) (($A :10 ($T $I)) (($A :11 (($B (_48 _159)) _10)) (($A :12 (($B ($B (_47 _9))) ((($C' $B) (($B $C) _10)) ($B _10)))) (($A :13 (($B ($B (_47 _9))) ((($C' $B) (($B $C) _10)) ($BK _10)))) (($A :14 (($B (_47 _9)) $P)) (($A :15 (($B ($B (_47 _9))) (($B (($C' $C) _10)) ($B $P)))) (($A :16 _15) (($A :17 (($B (_47 _9)) ($B ($P _710)))) (($A :18 (($B (_47 _9)) ($BK ($P _710)))) (($A :19 ((_47 _9) (($S $P) $I))) (($A :20 (($B (_47 _9)) (($C ($S' $P)) $I))) (($A :21 (($B $Y) (($B ($B ($P (_14 _88)))) ((($C' $B) (($B ($C' $B)) ($B _12))) ((($C' ($C' $B)) ($B _12)) (($B ($B _14)) _89)))))) (($A :22 (($B $Y) (($B ($B ($P (_14 _710)))) (($B ($C' $B)) ($B _13))))) (($A :23 _3) (($A :24 ($T (_14 _710))) (($A :25 (($C $C) _32)) (($A :26 ($T _31)) (($A :27 (($P _32) _31)) (($A :28 _32) (($A :29 (($C (($C $S') _27)) $I)) (($A :30 (($C $S) _27)) (($A :31 $K) (($A :32 $A) (($A :33 _745) (($A :34 _746) (($A :35 ((($S' _26) (_737 97)) (($C _737) 122))) (($A :36 ((($S' _26) (_737 65)) (($C _737) 90))) (($A :37 ((($S' _25) _35) _36)) (($A :38 ((($S' _26) (_737 48)) (($C _737) 57))) (($A :39 ((($S' _26) (_737 32)) (($C _737) 126))) (($A :40 _734) (($A :41 _735) (($A :42 _737) (($A :43 _736) (($A :44 (($B $BK) $T)) (($A :45 ($BK $T)) (($A :46 $P) (($A :47 $I) (($A :48 $B) (($A :49 $I) (($A :50 $K) (($A :51 $C) (($A :52 _741) (($A :53 (($C (($C $S') _159)) _160)) (($A :54 ((($C' ($S' ($C' $B))) $B) $I)) (($A :55 _711) (($A :56 _712) (($A :57 _713) (($A :58 _714) (($A :59 _715) (($A :60 _716) (($A :61 (_56 0)) (($A :62 _722) (($A :63 _723) (($A :64 _724) (($A :65 _725) (($A :66 _726) (($A :67 _727) (($A :68 _62) (($A :69 ($BK $K)) (($A :70 (($B $BK) (($B ($B $BK)) $P))) (($A :71 (($B ($B ($B $BK))) (($B ($B ($B $BK))) (($B ($B ($B $C))) (($B ($B $C)) $P))))) (($A :72 ((($S' $S) ((($S' ($S' $C)) ((($C' ($C' $S)) ((($C' $B) (($B ($S' $S')) ((($C' $B) (($B _25) (_65 0))) (_62 0)))) (($B ($B (($C' $P) (_60 1)))) _55))) ($C $P))) _58)) _59)) (($A :73 _69) (($A :74 ((($S' $C) (($B ($P _148)) ((($C' ($C' $B)) ((($C' $C) _62) _148)) _149))) (($B (($C' ($C' ($C' $C))) ((($C' ($C' ($C' $C))) ((($C' ($C' ($C' ($C' $S')))) (($B ($B ($B ($B $C)))) (($B (($C' ($C' ($C' $C))) (($B ($B ($B (($S' $S') (_62 0))))) (($B (($C' ($C' $C)) (($B ($B (($S' $S') (_62 1)))) (($B (($C' $C) (($B (($C' $S') (_62 2))) ($C _74)))) ($C _74))))) ($C _74))))) ($C _74)))) ($T $K))) ($T $A)))) (($C _72) 4)))) (($A :75 (_81 _50)) (($A :76 ((_96 (_53 _75)) _73)) (($A :77 (($C ((($C' $B) (($P _88) ((($C' ($C' $O)) $P) $K))) ((($S' ($C' ($C' ($C' $B)))) (($B ($B ($B ($B _78)))) ((($S' ($C' ($C' $B))) (($B ($B ($B _78))) ((($S' ($C' $B)) (($B ($B _78)) ((($C' $B) (($B _94) ($T 0))) _77))) ((($C' $B) (($B _94) ($T 1))) _77)))) ((($C' $B) (($B _94) ($T 2))) _77)))) ((($C' $B) (($B _94) ($T 3))) _77)))) (($B $T) (($B ($B $P)) (($C' _55) (_57 4)))))) (($A :78 (($S $S) (($B $BK) (($B $BK) ((($S' $S) $T) (($B $BK) (($B $BK) (($C ((($S' $C') $S) (($B ($B ($B ($S $B)))) (($B ($B ($B ($B ($B $BK))))) (($B (($S' ($C' $B)) (($B $B') $B'))) (($B ($B ($B ($B ($B ($S $B)))))) (($B ($B ($B ($B ($B ($B ($B $BK))))))) ((($C' $B) ($B' ($B' (($B ($C' ($C' ($C' $C)))) (($B (($C' $B) ($B' (($B $C) _64)))) (($B (($C' $B) _89)) _78)))))) (($B (($C' $B) _89)) ($C _78)))))))))) (((_709 "lib/Data/IntMap.hs") 3) 8))))))))) (($A :79 ((_48 (_94 _159)) _77)) (($A :80 ((($C' $C) ((($C' $C) ($C _74)) (_3 "Data.IntMap.!"))) $I)) (($A :81 (($B (($C' $B) $T)) (($B ($B $Y)) ((($C' ($C' ($S' ($S' $C)))) (($B (($S' $B) (($B ($S' $P)) ($C _70)))) (($B ($B (($C' ($S' $C)) (($B (($S' ($S' $S')) _62)) ((($C' ($C' $B)) (($B $B') ($B _47))) ((($C' ($C' _47)) _75) ((((_71 _69) _69) _69) _69))))))) ($B (($C' $B) _70))))) ((($C' $B) (($B ($C' ($C' ($C' $C)))) ((($C' ($C' ($C' ($C' $C)))) ((($C' ($C' ($C' ($C' ($C' $S'))))) (($B ($B ($B ($B ($B $C))))) ((($S' ($S' ($S' ($S' ($S' $C))
\ No newline at end of file
+887
+(($A :0 _773) (($A :1 (($B _819) _0)) (($A :2 ((($S' _819) _0) $I)) (($A :3 _743) (($A :4 (_3 "undefined")) (($A :5 $I) (($A :6 ((($C' $B) _772) (($C _49) _5))) (($A :7 ((($C' _6) (_790 _46)) ((_49 _788) _45))) (($A :8 (($B (($S _819) _788)) _3)) (($A :9 $T) (($A :10 ($T $I)) (($A :11 (($B (_49 _160)) _10)) (($A :12 (($B ($B (_48 _9))) ((($C' $B) (($B $C) _10)) ($B _10)))) (($A :13 (($B ($B (_48 _9))) ((($C' $B) (($B $C) _10)) ($BK _10)))) (($A :14 (($B (_48 _9)) $P)) (($A :15 (($B ($B (_48 _9))) (($B (($C' $C) _10)) ($B $P)))) (($A :16 _15) (($A :17 (($B (_48 _9)) ($B ($P _713)))) (($A :18 (($B (_48 _9)) ($BK ($P _713)))) (($A :19 ((_48 _9) (($S $P) $I))) (($A :20 (($B (_48 _9)) (($C ($S' $P)) $I))) (($A :21 (($B $Y) (($B ($B ($P (_14 _89)))) ((($C' $B) (($B ($C' $B)) ($B _12))) ((($C' ($C' $B)) ($B _12)) (($B ($B _14)) _90)))))) (($A :22 (($B $Y) (($B ($B ($P (_14 _713)))) (($B ($C' $B)) ($B _13))))) (($A :23 _3) (($A :24 ($T (_14 _713))) (($A :25 (($C $C) _32)) (($A :26 ($T _31)) (($A :27 (($P _32) _31)) (($A :28 _32) (($A :29 (($C (($C $S') _27)) $I)) (($A :30 (($C $S) _27)) (($A :31 $K) (($A :32 $A) (($A :33 _748) (($A :34 _749) (($A :35 ((($S' _26) (_740 97)) (($C _740) 122))) (($A :36 ((($S' _26) (_740 65)) (($C _740) 90))) (($A :37 ((($S' _25) _35) _36)) (($A :38 ((($S' _26) (_740 48)) (($C _740) 57))) (($A :39 ((($S' _26) (_740 32)) (($C _740) 126))) (($A :40 _737) (($A :41 _738) (($A :42 _740) (($A :43 _739) (($A :44 ((($S' _25) (($C _40) 32)) ((($S' _25) (($C _40) 9)) (($C _40) 10)))) (($A :45 (($B $BK) $T)) (($A :46 ($BK $T)) (($A :47 $P) (($A :48 $I) (($A :49 $B) (($A :50 $I) (($A :51 $K) (($A :52 $C) (($A :53 _744) (($A :54 (($C (($C $S') _160)) _161)) (($A :55 ((($C' ($S' ($C' $B))) $B) $I)) (($A :56 _714) (($A :57 _715) (($A :58 _716) (($A :59 _717) (($A :60 _718) (($A :61 _719) (($A :62 (_57 0)) (($A :63 _725) (($A :64 _726) (($A :65 _727) (($A :66 _728) (($A :67 _729) (($A :68 _730) (($A :69 _63) (($A :70 ($BK $K)) (($A :71 (($B $BK) (($B ($B $BK)) $P))) (($A :72 (($B ($B ($B $BK))) (($B ($B ($B $BK))) (($B ($B ($B $C))) (($B ($B $C)) $P))))) (($A :73 ((($S' $S) ((($S' ($S' $C)) ((($C' ($C' $S)) ((($C' $B) (($B ($S' $S')) ((($C' $B) (($B _25) (_66 0))) (_63 0)))) (($B ($B (($C' $P) (_61 1)))) _56))) ($C $P))) _59)) _60)) (($A :74 _70) (($A :75 ((($S' $C) (($B ($P _149)) ((($C' ($C' $B)) ((($C' $C) _63) _149)) _150))) (($B (($C' ($C' ($C' $C))) ((($C' ($C' ($C' $C))) ((($C' ($C' ($C' ($C' $S')))) (($B ($B ($B ($B $C)))) (($B (($C' ($C' ($C' $C))) (($B ($B ($B (($S' $S') (_63 0))))) (($B (($C' ($C' $C)) (($B ($B (($S' $S') (_63 1)))) (($B (($C' $C) (($B (($C' $S') (_63 2))) ($C _75)))) ($C _75))))) ($C _75))))) ($C _75)))) ($T $K))) ($T $A)))) (($C _73) 4)))) (($A :76 (_82 _51)) (($A :77 ((_97 (_54 _76)) _74)) (($A :78 (($C ((($C' $B) (($P _89) ((($C' ($C' $O)) $P) $K))) ((($S' ($C' ($C' ($C' $B)))) (($B ($B ($B ($B _79)))) ((($S' ($C' ($C' $B))) (($B ($B ($B _79))) ((($S' ($C' $B)) (($B ($B _79)) ((($C' $B) (($B _95) ($T 0))) _78))) ((($C' $B) (($B _95) ($T 1))) _78)))) ((($C' $B) (($B _95) ($T 2))) _78)))) ((($C' $B) (($B _95) ($T 3))) _78)))) (($B $T) (($B ($B $P)) (($C' _56) (_58 4)))))) (($A :79 (($S $S) (($B $BK) (($B $BK) ((($S' $S) $T) (($B $BK) (($B $BK) (($C ((($S' $C') $S) (($B ($B ($B ($S $B)))) (($B ($B ($B ($B ($B $BK))))) (($B (($S' ($C' $B)) (($B $B') $B'))) (($B ($B ($B ($B ($B ($S $B)))))) (($B ($B ($B ($B ($B ($B ($B $BK))))))) ((($C' $B) ($B' ($B' (($B ($C' ($C' ($C' $C)))) (($B (($C' $B) ($B' (($B $C) _65)))) (($B (($C' $B) _90)) _79)))))) (($B (($C' $B) _90)) ($C _79)))))))))) (((_712 "lib/Data/IntMap.hs") 3) 8))))))))) (($A :80 ((_49 (_95 _160)) _78)) (($A :81 ((($C' $C) ((($C' $C) ($C _75)) (_3 "Data.IntMap.!"))) $I)) (($A :82 (($B (($C' $B) $T)) (($B ($B $Y)) ((($C' ($C' ($S' ($S' $C)))) (($B (($S' $B) (($B ($S' $P)) ($C _71)))) (($B ($B (($C' ($S' $C)) (($B (($S' ($S' $S')) _63)) ((($C' ($C' $B)) (($B $B') ($B _48))) ((($C' ($C' _48)) _76) ((((_72 _70) _70) _70) _70))))))) ($B (($C' $B) _71))))) ((($C' $B) (($B ($C' ($C' ($C' $C)))) ((($C' ($C' ($C' ($C' $C)))) ((($C' ($C' ($C' 
\ No newline at end of file
--- a/src/MicroHs/Interactive.hs
+++ b/src/MicroHs/Interactive.hs
@@ -33,17 +33,44 @@
   ms <- S.liftIO $ getInputLineHist ".mhsi" "> "
   case ms of
     Nothing -> repl
-    Just ":quit" -> S.liftIO $ putStrLn "Bye"
-    Just ":clear" -> S.do
+    Just s ->
+      case s of
+        [] -> repl
+        ':':r -> S.do
+          c <- command r
+          if c then repl else S.liftIO $ putStrLn "Bye"
+        _ -> S.do
+          oneline s
+          repl
+
+command :: String -> I Bool
+command s =
+  case words s of
+    [] -> S.return True
+    c : ws ->
+      case filter (isPrefixOfBy eqChar c . fst) commands of
+        [] -> S.do
+          S.liftIO $ putStrLn "Unrecognized command"
+          S.return True
+        [(_, cmd)] ->
+          cmd (unwords ws)
+        xs -> S.do
+          S.liftIO $ putStrLn $ "Ambiguous command: " ++ unwords (map fst xs)
+          S.return True
+
+commands :: [(String, String -> I Bool)]
+commands =
+  [ ("quit", const $ S.return False)
+  , ("clear", const $ S.do
       updateLines (const preamble)
       S.modify $ \ (ls, flgs, _) -> (ls, flgs, emptyCache)
-      repl
-    Just s | Just del <- stripPrefixBy eqChar ":del " s -> S.do
+      S.return True
+    )
+  , ("delete", \ del -> S.do
       updateLines (unlines . filter (not . isPrefixOfBy eqChar del) . lines)
-      repl
-    Just s -> S.do
-      oneline s
-      repl
+      S.return True
+    )
+  ]
 
 updateLines :: (String -> String) -> I ()
 updateLines f = S.modify $ \ (ls, flgs, cache) -> (f ls, flgs, cache)
--