49 lines
1.2 KiB
Plaintext
49 lines
1.2 KiB
Plaintext
;; sieve.hs — lazy sieve of Eratosthenes.
|
|
;;
|
|
;; The canonical artefact lives at lib/haskell/tests/programs/sieve.hs.
|
|
;; Mirrored here as an SX string because the default eval env has no
|
|
;; read-file. Uses filter + backtick `mod` + lazy [2..] — all of which
|
|
;; are now wired in via Phase 3 + the mod/div additions to hk-binop.
|
|
|
|
(define
|
|
hk-as-list
|
|
(fn (xs)
|
|
(cond
|
|
((and (list? xs) (= (first xs) "[]")) (list))
|
|
((and (list? xs) (= (first xs) ":"))
|
|
(cons (nth xs 1) (hk-as-list (nth xs 2))))
|
|
(:else xs))))
|
|
|
|
(define
|
|
hk-prog-val
|
|
(fn
|
|
(src name)
|
|
(hk-deep-force (get (hk-eval-program (hk-core src)) name))))
|
|
|
|
(define
|
|
hk-sieve-source
|
|
"sieve (p:xs) = p : sieve (filter (\\x -> x `mod` p /= 0) xs)
|
|
sieve [] = []
|
|
primes = sieve [2..]
|
|
result = take 10 primes
|
|
")
|
|
|
|
(hk-test
|
|
"sieve.hs — first 10 primes"
|
|
(hk-as-list (hk-prog-val hk-sieve-source "result"))
|
|
(list 2 3 5 7 11 13 17 19 23 29))
|
|
|
|
(hk-test
|
|
"sieve.hs — 20th prime is 71"
|
|
(nth
|
|
(hk-as-list
|
|
(hk-prog-val
|
|
(str
|
|
hk-sieve-source
|
|
"result20 = take 20 primes\n")
|
|
"result20"))
|
|
19)
|
|
71)
|
|
|
|
{:fails hk-test-fails :pass hk-test-pass :fail hk-test-fail}
|