Some checks failed
Test, Build, and Deploy / test-build-deploy (push) Failing after 53s
hk-bind-data-ioref! registers newIORef / readIORef / writeIORef /
modifyIORef / modifyIORef' under the import alias (default IORef).
Representation: dict {"hk-ioref" true "hk-value" v} allocated inside IO.
modifyIORef' uses hk-deep-force on the new value before write.
Side-effect: fixed pre-existing bug in import handler — modname was
reading (nth d 1) (the qualified flag) instead of (nth d 2). All
'import qualified … as Foo' paths were silently no-ops; map.sx unit
suite jumps from 22→26 passing.
Conformance now 33/34 programs, 266/269 tests (only pre-existing
palindrome.hs 9/12 still failing on string-as-list reversal, present
on prior commit).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
95 lines
3.4 KiB
Plaintext
95 lines
3.4 KiB
Plaintext
;; Phase 15 — IORef unit tests.
|
|
|
|
(hk-test
|
|
"newIORef + readIORef returns initial value"
|
|
(hk-deep-force
|
|
(hk-run
|
|
"import qualified Data.IORef as IORef\nmain = do { r <- IORef.newIORef 42; v <- IORef.readIORef r; return v }"))
|
|
(list "IO" 42))
|
|
|
|
(hk-test
|
|
"writeIORef updates the cell"
|
|
(hk-deep-force
|
|
(hk-run
|
|
"import qualified Data.IORef as IORef\nmain = do { r <- IORef.newIORef 0; IORef.writeIORef r 99; v <- IORef.readIORef r; return v }"))
|
|
(list "IO" 99))
|
|
|
|
(hk-test
|
|
"writeIORef returns IO ()"
|
|
(hk-deep-force
|
|
(hk-run
|
|
"import qualified Data.IORef as IORef\nmain = do { r <- IORef.newIORef 0; IORef.writeIORef r 1 }"))
|
|
(list "IO" (list "Tuple")))
|
|
|
|
(hk-test
|
|
"modifyIORef applies a function"
|
|
(hk-deep-force
|
|
(hk-run
|
|
"import qualified Data.IORef as IORef\nmain = do { r <- IORef.newIORef 5; IORef.modifyIORef r (\\x -> x * 2); v <- IORef.readIORef r; return v }"))
|
|
(list "IO" 10))
|
|
|
|
(hk-test
|
|
"modifyIORef' (strict) applies a function"
|
|
(hk-deep-force
|
|
(hk-run
|
|
"import qualified Data.IORef as IORef\nmain = do { r <- IORef.newIORef 7; IORef.modifyIORef' r (\\x -> x + 3); v <- IORef.readIORef r; return v }"))
|
|
(list "IO" 10))
|
|
|
|
(hk-test
|
|
"two reads return the same value"
|
|
(hk-deep-force
|
|
(hk-run
|
|
"import qualified Data.IORef as IORef\nmain = do { r <- IORef.newIORef 11; a <- IORef.readIORef r; b <- IORef.readIORef r; return (a + b) }"))
|
|
(list "IO" 22))
|
|
|
|
(hk-test
|
|
"shared ref across do-steps: write then read"
|
|
(hk-deep-force
|
|
(hk-run
|
|
"import qualified Data.IORef as IORef\nmain = do { r <- IORef.newIORef 1; IORef.writeIORef r 2; IORef.writeIORef r 3; v <- IORef.readIORef r; return v }"))
|
|
(list "IO" 3))
|
|
|
|
(hk-test
|
|
"two refs are independent"
|
|
(hk-deep-force
|
|
(hk-run
|
|
"import qualified Data.IORef as IORef\nmain = do { r1 <- IORef.newIORef 1; r2 <- IORef.newIORef 2; IORef.writeIORef r1 10; a <- IORef.readIORef r1; b <- IORef.readIORef r2; return (a + b) }"))
|
|
(list "IO" 12))
|
|
|
|
(hk-test
|
|
"string-valued IORef"
|
|
(hk-deep-force
|
|
(hk-run
|
|
"import qualified Data.IORef as IORef\nmain = do { r <- IORef.newIORef \"hi\"; IORef.writeIORef r \"bye\"; v <- IORef.readIORef r; return v }"))
|
|
(list "IO" "bye"))
|
|
|
|
(hk-test
|
|
"list-valued IORef + cons"
|
|
(hk-deep-force
|
|
(hk-run
|
|
"import qualified Data.IORef as IORef\nmain = do { r <- IORef.newIORef [1,2,3]; IORef.modifyIORef r (\\xs -> 0 : xs); v <- IORef.readIORef r; return v }"))
|
|
(list
|
|
"IO"
|
|
(list ":" 0 (list ":" 1 (list ":" 2 (list ":" 3 (list "[]")))))))
|
|
|
|
(hk-test
|
|
"counter loop: increment N times"
|
|
(hk-deep-force
|
|
(hk-run
|
|
"import qualified Data.IORef as IORef\nloop r 0 = return ()\nloop r n = do { IORef.modifyIORef r (\\x -> x + 1); loop r (n - 1) }\nmain = do { r <- IORef.newIORef 0; loop r 10; v <- IORef.readIORef r; return v }"))
|
|
(list "IO" 10))
|
|
|
|
(hk-test
|
|
"modifyIORef' inside a loop"
|
|
(hk-deep-force
|
|
(hk-run
|
|
"import qualified Data.IORef as IORef\ngo r 0 = return ()\ngo r n = do { IORef.modifyIORef' r (\\x -> x + n); go r (n - 1) }\nmain = do { r <- IORef.newIORef 0; go r 5; v <- IORef.readIORef r; return v }"))
|
|
(list "IO" 15))
|
|
|
|
(hk-test
|
|
"newIORef inside a function passed via parameter"
|
|
(hk-deep-force
|
|
(hk-run
|
|
"import qualified Data.IORef as IORef\nbump r = IORef.modifyIORef r (\\x -> x + 100)\nmain = do { r <- IORef.newIORef 1; bump r; v <- IORef.readIORef r; return v }"))
|
|
(list "IO" 101))
|