shithub: MicroHs

Download patch

ref: 92364d5ed2e9d9fa2f11292f1735371745056b8b
parent: 7b8a7888b007109413d9540b6f195a207f0bddbe
author: Lennart Augustsson <lennart.augustsson@epicgames.com>
date: Thu Dec 14 18:49:58 EST 2023

Fix bug in C'

--- a/ghc/PrimTable.hs
+++ b/ghc/PrimTable.hs
@@ -4,28 +4,33 @@
 import System.IO
 import Unsafe.Coerce
 import GHC.Types(Any)
+import Debug.Trace
 
 primitive :: String -> Any
+primitive s | trace ("primitive " ++ show s) False = undefined
+primitive "dynsym" = unsafeCoerce dynsym
 primitive s = fromMaybe (error $ "primitive: " ++ s) $ lookup s primOps
 
-newtype DIO a = DIO { unDIO :: IO a }
-
 primOps :: [(String, Any)]
 primOps =
   [ comb "S" (\ f g x -> f x (g x))
-  , comb "S'" (\ k f g x -> k f x (g x))
   , comb "K" (\ x _y -> x)
-  , comb "A" (\ _x y -> y)
-  , comb "T" (\ x y -> y x)
   , comb "I" (\ x -> x)
-  , comb "Y" (\ f -> let r = f r in r)
   , comb "B" (\ f g x -> f (g x))
-  , comb "B'" (\ k f g x -> k f (g x))
-  , comb "BK" (\ f g _x -> f g)
   , comb "C" (\ f g x -> f x g)
-  , comb "C'" (\ k f g x -> k f x g)
+  , comb "S'" (\ k f g x -> k (f x) (g x))
+  , comb "B'" (\ k f g x -> k f (g x))
+  , comb "C'" (\ k f g x -> k (f x) g)
+  , comb "A" (\ _x y -> y)
+  , comb "U" (\ x y -> y x)
+  , comb "Y" (\ f -> let r = f r in r)
+  , comb "Z" (\ f g _x -> f g)
   , comb "P" (\ x y f -> f x y)
+  , comb "R" (\ x y f -> y f x)
   , comb "O" (\ x y _g f -> f x y)
+  , comb "K2" (\ x _y _z -> x)
+  , comb "K3" (\ x _y _z _w -> x)
+  , comb "K4" (\ x _y _z _w _v -> x)
 
   , arith "+" (+)
   , arith "-" (-)
@@ -36,13 +41,6 @@
   , farith "fadd" (+)
   , farith "fsub" (-)
   , farith "fmul" (*)
-  , cmp "feq" (==)
-  , cmp "fne" (/=)
-  , cmp "flt" (<)
-  , cmp "fle" (<=)
-  , cmp "fgt" (>)
-  , cmp "fge" (>=)
-  , comb "fshow" (show :: Double -> String)
   , cmp "==" (==)
   , cmp "/=" (/=)
   , cmp "<"  (<)
@@ -49,13 +47,19 @@
   , cmp "<=" (<=)
   , cmp ">"  (>)
   , cmp ">=" (>=)
-  , cmp "error" err
+  , fcmp "feq" (==)
+  , fcmp "fne" (/=)
+  , fcmp "flt" (<)
+  , fcmp "fle" (<=)
+  , fcmp "fgt" (>)
+  , fcmp "fge" (>=)
+  , comb "fshow" (show :: Double -> String)
+  , comb "error" err
   , comb "ord" ord
   , comb "chr" chr
   , comb "IO.>>=" iobind
   , comb "IO.>>" iothen
   , comb "IO.return" ioret
---  , comb "IO.getChar" getc
   , comb "IO.putChar" putc
   , comb "IO.stdin" stdin
   , comb "IO.stdout" stdout
@@ -69,23 +73,20 @@
     farith = comb
     cmp :: String -> (Int -> Int -> Bool) -> (String, Any)
     cmp n f = comb n (\ x y -> if f x y then cTrue else cFalse)
+    fcmp :: String -> (Double -> Double -> Bool) -> (String, Any)
+    fcmp n f = comb n (\ x y -> if f x y then cTrue else cFalse)
     cTrue _x y = y
     cFalse x _y = x
-    iobind :: DIO a -> (a -> DIO b) -> DIO b
-    iobind a k = DIO (unDIO a >>= \ x -> unDIO (k x))
-    iothen :: DIO a -> DIO b -> DIO b
-    iothen a b = DIO (unDIO a >> unDIO b)
-    ioret :: a -> DIO a
-    ioret a = DIO (return a)
---    getc h = undefined -- fromEnum <$> hGetChar h  -- XXX
-    putc :: Handle -> Int -> DIO ()
-    putc h c = DIO $ do
---      let h = unsafeCoerce hh :: Handle
---          c = unsafeCoerce cc :: Int
---      print (h, c)
-      hPutChar h (toEnum c)
---    open = undefined
---    close = undefined
---    isnull = undefined
+    iobind :: IO a -> (a -> IO b) -> IO b
+    iobind = (>>=)
+    iothen :: IO a -> IO b -> IO b
+    iothen = (>>)
+    ioret :: a -> IO a
+    ioret = return
+    putc :: Int -> IO ()
+    putc c = hPutChar stdout (chr c)
 
     err _ = error "ERROR"
+
+dynsym :: String -> Any
+dynsym cfun = error $ "dynsym " ++ cfun
--