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>
82 lines
3.1 KiB
Plaintext
82 lines
3.1 KiB
Plaintext
;; accumulate.hs — accumulate results into an IORef [Int] (Phase 15 conformance).
|
|
|
|
(define
|
|
hk-accumulate-source
|
|
"import qualified Data.IORef as IORef\n\npush :: IORef [Int] -> Int -> IO ()\npush r x = IORef.modifyIORef r (\\xs -> x : xs)\n\npushAll :: IORef [Int] -> [Int] -> IO ()\npushAll r [] = return ()\npushAll r (x:xs) = do\n push r x\n pushAll r xs\n\nreadReversed :: IORef [Int] -> IO [Int]\nreadReversed r = do\n xs <- IORef.readIORef r\n return (reverse xs)\n\ndoubleEach :: IORef [Int] -> [Int] -> IO ()\ndoubleEach r [] = return ()\ndoubleEach r (x:xs) = do\n push r (x * 2)\n doubleEach r xs\n\nsumIntoRef :: IORef Int -> [Int] -> IO ()\nsumIntoRef r [] = return ()\nsumIntoRef r (x:xs) = do\n IORef.modifyIORef r (\\acc -> acc + x)\n sumIntoRef r xs\n\n")
|
|
|
|
(hk-test
|
|
"accumulate.hs — push three then read length"
|
|
(hk-deep-force
|
|
(hk-run
|
|
(str
|
|
hk-accumulate-source
|
|
"main = do { r <- IORef.newIORef []; push r 1; push r 2; push r 3; xs <- IORef.readIORef r; return (length xs) }")))
|
|
(list "IO" 3))
|
|
|
|
(hk-test
|
|
"accumulate.hs — pushAll preserves reverse order"
|
|
(hk-deep-force
|
|
(hk-run
|
|
(str
|
|
hk-accumulate-source
|
|
"main = do { r <- IORef.newIORef []; pushAll r [1,2,3,4]; xs <- IORef.readIORef r; return xs }")))
|
|
(list
|
|
"IO"
|
|
(list ":" 4 (list ":" 3 (list ":" 2 (list ":" 1 (list "[]")))))))
|
|
|
|
(hk-test
|
|
"accumulate.hs — readReversed gives original order"
|
|
(hk-deep-force
|
|
(hk-run
|
|
(str
|
|
hk-accumulate-source
|
|
"main = do { r <- IORef.newIORef []; pushAll r [10,20,30]; readReversed r }")))
|
|
(list "IO" (list ":" 10 (list ":" 20 (list ":" 30 (list "[]"))))))
|
|
|
|
(hk-test
|
|
"accumulate.hs — doubleEach maps then accumulates"
|
|
(hk-deep-force
|
|
(hk-run
|
|
(str
|
|
hk-accumulate-source
|
|
"main = do { r <- IORef.newIORef []; doubleEach r [1,2,3]; readReversed r }")))
|
|
(list "IO" (list ":" 2 (list ":" 4 (list ":" 6 (list "[]"))))))
|
|
|
|
(hk-test
|
|
"accumulate.hs — sum into Int IORef"
|
|
(hk-deep-force
|
|
(hk-run
|
|
(str
|
|
hk-accumulate-source
|
|
"main = do { r <- IORef.newIORef 0; sumIntoRef r [1,2,3,4,5]; v <- IORef.readIORef r; return v }")))
|
|
(list "IO" 15))
|
|
|
|
(hk-test
|
|
"accumulate.hs — empty list leaves ref untouched"
|
|
(hk-deep-force
|
|
(hk-run
|
|
(str
|
|
hk-accumulate-source
|
|
"main = do { r <- IORef.newIORef [99]; pushAll r []; xs <- IORef.readIORef r; return xs }")))
|
|
(list "IO" (list ":" 99 (list "[]"))))
|
|
|
|
(hk-test
|
|
"accumulate.hs — pushAll then sumIntoRef on the same input"
|
|
(hk-deep-force
|
|
(hk-run
|
|
(str
|
|
hk-accumulate-source
|
|
"main = do { r <- IORef.newIORef 0; sumIntoRef r [10,20,30,40]; v <- IORef.readIORef r; return v }")))
|
|
(list "IO" 100))
|
|
|
|
(hk-test
|
|
"accumulate.hs — accumulate results from a recursive helper"
|
|
(hk-deep-force
|
|
(hk-run
|
|
(str
|
|
hk-accumulate-source
|
|
"squaresUpTo r 0 = return ()\nsquaresUpTo r n = do { push r (n * n); squaresUpTo r (n - 1) }\nmain = do { r <- IORef.newIORef []; squaresUpTo r 4; readReversed r }")))
|
|
(list
|
|
"IO"
|
|
(list ":" 16 (list ":" 9 (list ":" 4 (list ":" 1 (list "[]")))))))
|