git.iko.soy/rowtype-yoga/purescript-native
on golang help sign in
Make tests pass again
commit041e4eac618e4ec50b8e1b043275f97a31c14e45 authorPhil Freeman <paf31@cantab.net> dateMon 3 Feb 2014, 20:18 (13 years ago) parentf4c6711
29 files changed+235−67
examples/failing/Arrays.purs+2 examples/failing/Do.purs+4−6 examples/failing/LocalVars.purs+2 examples/failing/PatternScope.purs+2 examples/failing/Rank2Types.purs+2 examples/failing/Shadowed.purs+2 examples/failing/TypeError.purs+3−1 examples/passing/Arrays.purs+3−1 examples/passing/Assign.purs+2 examples/passing/Conditional.purs−2 examples/passing/Do.purs+3−5 examples/passing/Eff.purs+1−1 examples/passing/FFI.purs+2−2 examples/passing/Functions.purs+3−1 examples/passing/Guards.purs+2 examples/passing/IfThenElse.purs+2 examples/passing/Module.purs+4 examples/passing/MutRec.purs+2 examples/passing/Objects.purs+3−1 examples/passing/Operators.purs+8−2 examples/passing/OptimizerBug.purs+2 examples/passing/Patterns.purs+5−3 examples/passing/Person.purs+2 examples/passing/Rank2Data.purs+2 examples/passing/Rank2Types.purs+2 examples/passing/Recursion.purs+2 examples/passing/TailCall.purs+4 examples/passing/TopLevelCase.purs+2 libraries/prelude/prelude.purs+162−42
examples/failing/Arrays.purs+2
@@ -1,3 +1,5 @@
11module Arrays where
22
3+ import Prelude
4+
35 test = \arr -> arr !! (0 !! 0)
examples/failing/Do.purs+4−6
@@ -1,10 +1,8 @@
11module Do where
22
3−id = { ret: \x -> x, bind: \x f -> f x }
3+test1 = do let x = 1
44
5−test1 = id do let x = 1
5+test2 y = do x <- y
66
7−test2 y = id do x <- y
8−
9−test3 = id do return 1
10− return 2
7+test3 = do ret 1
8+ ret 2
examples/failing/LocalVars.purs+2
@@ -1,5 +1,7 @@
11module LocalVars where
22
3+ import Prelude
4+
35 bad = \x -> {
46 x = x + 1;
57 return x;
examples/failing/PatternScope.purs+2
@@ -1,5 +1,7 @@
11module PatternScope where
22
3+ import Prelude
4+
35 -- Pattern scope doesn't leak
46 foobar = \x -> {
57 var y = case x of
examples/failing/Rank2Types.purs+2
@@ -1,5 +1,7 @@
11module Rank2Types where
22
3+ import Prelude
4+
35 foreign import test :: (forall a. a -> a) -> Number
46
57 test1 = test (\n -> n + 1)
examples/failing/Shadowed.purs+2
@@ -1,5 +1,7 @@
11module Shadowed where
22
3+import Prelude
4+
35a = [1, 2]
46
57foo = {
examples/failing/TypeError.purs+3−1
@@ -1,3 +1,5 @@
11module TypeError where
22
3− test = x ++ "A"
3+ import Prelude
4+
5+ test = 1 ++ "A"
examples/passing/Arrays.purs+3−1
@@ -1,6 +1,8 @@
11module ArraysTests where
22
3−test1 = \arr -> arr !! 0 + arr !! 1
3+import Prelude
4+
5+test1 arr = arr !! 0 + arr !! 1 + 1
46
57test2 = \arr -> case arr of
68 [x, y] -> x + y
examples/passing/Assign.purs+2
@@ -1,5 +1,7 @@
11module Assign where
22
3+ import Prelude
4+
35 sum = \n -> {
46 var x = 0;
57 for (i <- 0 until n) {
examples/passing/Conditional.purs−2
@@ -2,8 +2,6 @@ module Conditional where
22
33 fns = \f -> if f true then f else \x -> x
44
5− bin = \x -> if x && !x then x else x
6−
75 not = \x -> if x then false else true
86
97module Main where
examples/passing/Do.purs+3−5
@@ -25,14 +25,14 @@ test3 = \_ -> do
2525test4 mx my = do
2626 x <- mx
2727 y <- my
28− Just (x + y)
28+ Just (x + y + 1)
2929
3030test5 mx my mz = do
3131 x <- mx
3232 y <- my
3333 let sum = x + y
3434 z <- mz
35− Just (z + sum)
35+ Just (z + sum + 1)
3636
3737test6 mx = \_ -> do
3838 let Just x = mx
@@ -53,14 +53,12 @@ test8 = \_ -> do
5353 a <- m
5454 ret (g a)
5555
56−foo x y z = x + y + z
57−
5856forever :: forall m a b. (Monad m) => m a -> m b
5957forever a = do
6058 a
6159 forever a
6260
63−test9 = \_ -> foo <$> Just 1 <*> Just 2 <*> Just 3
61+test9 = \_ -> (+) <$> Just 1 <*> Just 2
6462
6563module Main where
6664
examples/passing/Eff.purs+1−1
@@ -17,9 +17,9 @@ test2 = runPure $ runST $ do
1717
1818module Main where
1919
20+import Prelude
2021import Eff
2122import TestEff
22−import Global
2323
2424main = do
2525 n <- test1
examples/passing/FFI.purs+2−2
@@ -3,13 +3,13 @@ module FFI where
33foreign import foo :: String -> String
44
55bar :: String -> String
6−bar = \x -> foo (x ++ "bar")
6+bar _ = foo "test"
77
88module FFIModuleTest where
99
1010import FFI
1111
12−baz = \_ -> foo "test"
12+baz _ = foo "test"
1313
1414module Main where
1515
examples/passing/Functions.purs+3−1
@@ -1,8 +1,10 @@
11module Functions where
22
3+ import Prelude
4+
35 test1 = \_ -> 0
46
5− test2 = \a b c d -> a + b + c + d
7+ test2 = \a b -> a + b + 1
68
79 test3 = \a -> a
810
examples/passing/Guards.purs+2
@@ -1,5 +1,7 @@
11module Guards where
22
3+ import Prelude
4+
35 collatz = \x -> case x of
46 y | y % 2 == 0 -> y / 2
57 y -> y * 3 + 1
examples/passing/IfThenElse.purs+2
@@ -1,5 +1,7 @@
11module IfThenElse where
22
3+ import Prelude
4+
35 testIf =
46 {
57 var x = 0;
examples/passing/Module.purs+4
@@ -1,5 +1,7 @@
11module M1 where
22
3+ import Prelude
4+
35 data Foo = Foo String
46
57 foo :: M1.Foo -> String
@@ -13,6 +15,8 @@ module M1 where
1315
1416module M2 where
1517
18+ import Prelude
19+
1620 baz :: M1.Foo -> String
1721 baz = M1.foo
1822
examples/passing/MutRec.purs+2
@@ -1,5 +1,7 @@
11module MutRec where
22
3+ import Prelude
4+
35 f 0 = 0
46 f x = g x + 1
57
examples/passing/Objects.purs+3−1
@@ -1,6 +1,8 @@
11module Objects where
22
3− test = \x -> x.foo + x.bar
3+ import Prelude
4+
5+ test = \x -> x.foo + x.bar + 1
46
57 append = \o -> { foo: o.foo, bar: 1 }
68
examples/passing/Operators.purs+8−2
@@ -1,5 +1,7 @@
11module Operators1 where
22
3+ import Prelude ((++))
4+
35 (@@) :: forall a b. (a -> b) -> a -> b
46 (@@) = \f x -> f x
57
@@ -12,7 +14,10 @@ module Operators1 where
1214
1315module Operators2 where
1416
15− test1 = \x y z -> x * y + z(x)(y)
17+ import Prelude
18+
19+ test1 :: forall n. (Num n) => n -> n -> (n -> n -> n) -> n
20+ test1 x y z = x * y + z x y
1621
1722 test2 = (\x -> x.foo false) { foo : \_ -> 1 }
1823
@@ -24,7 +29,8 @@ module Operators2 where
2429
2530 infixl 5 %%
2631
27− (%%) = \x -> \y -> x * y + y
32+ (%%) :: Number -> Number -> Number
33+ (%%) x y = x * y + y
2834
2935 test5 = 1 %% 2 %% 3
3036
examples/passing/OptimizerBug.purs+2
@@ -1,5 +1,7 @@
11module OptimizerBug where
22
3+import Prelude
4+
35x = 1 + y
46
57y = x
examples/passing/Patterns.purs+5−3
@@ -1,5 +1,7 @@
11module Patterns where
22
3+ import Prelude
4+
35 test = \x -> case x of
46 { str = "Foo", bool = true } -> true
57 { str = "Bar", bool = b } -> b
@@ -19,9 +21,9 @@ module Patterns where
1921 a@[_,_,_] -> a
2022 _ -> []
2123
22− isDesc = \o -> case o of
23− [x, y] | x > y -> true
24− _ -> false
24+ isDesc :: [Number] -> Boolean
25+ isDesc [x, y] | x > y = true
26+ isDesc _ = false
2527
2628module Main where
2729
examples/passing/Person.purs+2
@@ -1,5 +1,7 @@
11module Person where
22
3+ import Prelude ((++))
4+
35 data Person = Person { name :: String, age :: Number }
46
57 foreign import itoa :: Number -> String
examples/passing/Rank2Data.purs+2
@@ -1,5 +1,7 @@
11module Rank2Data where
22
3+ import Prelude
4+
35 data Id = Id forall a. a -> a
46
57 runId = \id a -> case id of
examples/passing/Rank2Types.purs+2
@@ -1,5 +1,7 @@
11module Rank2Types where
22
3+ import Prelude
4+
35 test1 :: (forall a. (a -> a)) -> Number
46 test1 = \f -> f 0
57
examples/passing/Recursion.purs+2
@@ -1,5 +1,7 @@
11module Recursion where
22
3+ import Prelude
4+
35 fib = \n -> case n of
46 0 -> 1
57 1 -> 1
examples/passing/TailCall.purs+4
@@ -1,8 +1,12 @@
11module TailCall where
22
3+import Prelude
4+
5+test :: Number -> [Number] -> Number
36test n [] = n
47test n (x:xs) = test (n + x) xs
58
9+loop :: forall a. Number -> a
610loop x = loop (x + 1)
711
812notATailCall = \x ->
examples/passing/TopLevelCase.purs+2
@@ -1,5 +1,7 @@
11module TopLevelCase where
22
3+ import Prelude
4+
35 gcd :: Number -> Number -> Number
46 gcd 0 x = x
57 gcd x 0 = x
libraries/prelude/prelude.purs+162−42
@@ -40,7 +40,7 @@ module Prelude where
4040 show true = "true"
4141 show false = "false"
4242
43− foreign import showNumber "function numberToString(n) {\
43+ foreign import showNumber "function showNumber(n) {\
4444 \ return n.toString();\
4545 \}" :: Number -> String
4646
@@ -61,6 +61,13 @@ module Prelude where
6161 ret :: forall a. a -> m a
6262 (>>=) :: forall a b. m a -> (a -> m b) -> m b
6363
64+ infixl 5 *
65+ infixl 5 /
66+ infixl 5 %
67+
68+ infixl 7 -
69+ infixl 7 +
70+
6471 class Num a where
6572 (+) :: a -> a -> a
6673 (-) :: a -> a -> a
@@ -69,25 +76,50 @@ module Prelude where
6976 (%) :: a -> a -> a
7077 negate :: a -> a
7178
72− foreign import addNumber "" :: Number -> Number -> Number
79+ foreign import numAdd "function numAdd(n1) {\
80+ \ return function(n2) {\
81+ \ return n1 + n2;\
82+ \ };\
83+ \}" :: Number -> Number -> Number
7384
74− foreign import subNumber "" :: Number -> Number -> Number
85+ foreign import numSub "function numSub(n1) {\
86+ \ return function(n2) {\
87+ \ return n1 - n2;\
88+ \ };\
89+ \}" :: Number -> Number -> Number
7590
76− foreign import mulNumber "" :: Number -> Number -> Number
91+ foreign import numMul "function numMul(n1) {\
92+ \ return function(n2) {\
93+ \ return n1 * n2;\
94+ \ };\
95+ \}" :: Number -> Number -> Number
96+
97+ foreign import numDiv "function numDiv(n1) {\
98+ \ return function(n2) {\
99+ \ return n1 / n2;\
100+ \ };\
101+ \}" :: Number -> Number -> Number
77102
78− foreign import divNumber "" :: Number -> Number -> Number
103+ foreign import numMod "function numMod(n1) {\
104+ \ return function(n2) {\
105+ \ return n1 % n2;\
106+ \ };\
107+ \}" :: Number -> Number -> Number
79108
80− foreign import modNumber "" :: Number -> Number -> Number
81−
82− foreign import negateNumber "" :: Number -> Number
109+ foreign import numNegate "function numNegate(n) {\
110+ \ return -n;\
111+ \}" :: Number -> Number
83112
84113 instance Num Number where
85− (+) = addNumber
86− (-) = subNumber
87− (*) = mulNumber
88− (/) = divNumber
89− (%) = modNumber
90− negate = negateNumber
114+ (+) = numAdd
115+ (-) = numSub
116+ (*) = numMul
117+ (/) = numDiv
118+ (%) = numMod
119+ negate = numNegate
120+
121+ infixl 9 ==
122+ infixl 9 /=
91123
92124 class Eq a where
93125 (==) :: a -> a -> Boolean
@@ -96,13 +128,29 @@ module Prelude where
96128 -- Referential equality
97129 data Ref a = Ref a
98130
99− foreign import refEq "" :: forall a. Ref a -> Ref a -> Boolean
100−
101− foreign import refIneq "" :: forall a. Ref a -> Ref a -> Boolean
131+ foreign import refEq "function refEq(r1) {\
132+ \ return function(r2) {\
133+ \ return r1.value === r2.value;\
134+ \ };\
135+ \}" :: forall a. Ref a -> Ref a -> Boolean
136+
137+ foreign import refIneq "function refIneq(r1) {\
138+ \ return function(r2) {\
139+ \ return r1.value !== r2.value;\
140+ \ };\
141+ \}" :: forall a. Ref a -> Ref a -> Boolean
102142
103− foreign import unsafeRefEq "" :: forall a. a -> a -> Boolean
104−
105− foreign import unsafeRefIneq "" :: forall a. a -> a -> Boolean
143+ foreign import unsafeRefEq "function unsafeRefEq(r1) {\
144+ \ return function(r2) {\
145+ \ return r1 === r2;\
146+ \ };\
147+ \}" :: forall a. a -> a -> Boolean
148+
149+ foreign import unsafeRefIneq "function unsafeRefIneq(r1) {\
150+ \ return function(r2) {\
151+ \ return r1 !== r2;\
152+ \ };\
153+ \}" :: forall a. a -> a -> Boolean
106154
107155 instance Eq (Ref a) where
108156 (==) = refEq
@@ -124,26 +172,55 @@ module Prelude where
124172 (==) = unsafeRefEq
125173 (/=) = unsafeRefIneq
126174
175+ infixl 3 <
176+ infixl 3 >
177+ infixl 3 <=
178+ infixl 3 >=
179+
127180 class Ord a where
128181 (<) :: a -> a -> Boolean
129182 (>) :: a -> a -> Boolean
130183 (<=) :: a -> a -> Boolean
131184 (>=) :: a -> a -> Boolean
132185
133− foreign import numLess "" :: Number -> Number -> Boolean
186+ foreign import numLess "function numLess(n1) {\
187+ \ return function(n2) {\
188+ \ return n1 < n2;\
189+ \ };\
190+ \}" :: Number -> Number -> Boolean
191+
192+ foreign import numLessEq "function numLessEq(n1) {\
193+ \ return function(n2) {\
194+ \ return n1 <= n2;\
195+ \ };\
196+ \}" :: Number -> Number -> Boolean
197+
198+ foreign import numGreater "function numGreater(n1) {\
199+ \ return function(n2) {\
200+ \ return n1 > n2;\
201+ \ };\
202+ \}" :: Number -> Number -> Boolean
134203
135− foreign import numLessEq "" :: Number -> Number -> Boolean
136−
137− foreign import numGreater "" :: Number -> Number -> Boolean
204+ foreign import numGreaterEq "function numGreaterEq(n1) {\
205+ \ return function(n2) {\
206+ \ return n1 >= n2;\
207+ \ };\
208+ \}" :: Number -> Number -> Boolean
138209
139− foreign import numGreaterEq "" :: Number -> Number -> Boolean
140−
141210 instance Ord Number where
142211 (<) = numLess
143212 (>) = numGreater
144213 (<=) = numLessEq
145214 (>=) = numGreaterEq
146215
216+ infixl 8 <<
217+ infixl 8 >>
218+ infixl 8 >>>
219+
220+ infixl 10 &
221+ infixl 10 |
222+ infixl 10 ^
223+
147224 class Bits b where
148225 (<<) :: b -> Number -> b
149226 (>>) :: b -> Number -> b
@@ -153,20 +230,46 @@ module Prelude where
153230 (^) :: b -> b -> b
154231 complement :: b -> b
155232
156− foreign import numShl "" :: Number -> Number -> Number
157−
158− foreign import numShr "" :: Number -> Number -> Number
159−
160− foreign import numZfShr "" :: Number -> Number -> Number
233+ foreign import numShl "function numShl(n1) {\
234+ \ return function(n2) {\
235+ \ return n1 << n2;\
236+ \ };\
237+ \}" :: Number -> Number -> Number
238+
239+ foreign import numShr "function numShr(n1) {\
240+ \ return function(n2) {\
241+ \ return n1 >> n2;\
242+ \ };\
243+ \}" :: Number -> Number -> Number
244+
245+ foreign import numZfShr "function numZfShr(n1) {\
246+ \ return function(n2) {\
247+ \ return n1 >>> n2;\
248+ \ };\
249+ \}" :: Number -> Number -> Number
250+
251+ foreign import numAnd "function numAnd(n1) {\
252+ \ return function(n2) {\
253+ \ return n1 & n2;\
254+ \ };\
255+ \}" :: Number -> Number -> Number
256+
257+ foreign import numOr "function numOr(n1) {\
258+ \ return function(n2) {\
259+ \ return n1 | n2;\
260+ \ };\
261+ \}" :: Number -> Number -> Number
161262
162− foreign import numAnd "" :: Number -> Number -> Number
263+ foreign import numXor "function numXor(n1) {\
264+ \ return function(n2) {\
265+ \ return n1 ^ n2;\
266+ \ };\
267+ \}" :: Number -> Number -> Number
163268
164− foreign import numOr "" :: Number -> Number -> Number
269+ foreign import numComplement "function numComplement(n) {\
270+ \ return ~n;\
271+ \}" :: Number -> Number
165272
166− foreign import numXor "" :: Number -> Number -> Number
167−
168− foreign import numComplement "" :: Number -> Number
169−
170273 instance Bits Number where
171274 (<<) = numShl
172275 (>>) = numShr
@@ -176,28 +279,45 @@ module Prelude where
176279 (^) = numXor
177280 complement = numComplement
178281
282+ infixl 4 !!
283+
179284 foreign import (!!) "function $bang$bang(xs) {\
180285 \ return function(n) {\
181286 \ return xs[n];\
182287 \ };\
183288 \}" :: forall a. [a] -> Number -> a
184289
290+ infixr 11 ||
291+ infixr 11 &&
292+
185293 class BoolLike b where
186294 (&&) :: b -> b -> b
187295 (||) :: b -> b -> b
188296 not :: b -> b
189297
190− foreign import boolAnd "" :: Boolean -> Boolean -> Boolean
191−
192− foreign import boolOr "" :: Boolean -> Boolean -> Boolean
298+ foreign import boolAnd "function boolAnd(b1) {\
299+ \ return function(b2) {\
300+ \ return b1 && b2;\
301+ \ };\
302+ \}" :: Boolean -> Boolean -> Boolean
303+
304+ foreign import boolOr "function boolOr(b1) {\
305+ \ return function(b2) {\
306+ \ return b1 || b2;\
307+ \ };\
308+ \}" :: Boolean -> Boolean -> Boolean
309+
310+ foreign import boolNot "function boolNot(b) {\
311+ \ return !b;\
312+ \}" :: Boolean -> Boolean
193313
194− foreign import boolNot "" :: Boolean -> Boolean
195−
196314 instance BoolLike Boolean where
197315 (&&) = boolAnd
198316 (||) = boolOr
199317 not = boolNot
200318
319+ infixr 6 ++
320+
201321 foreign import (++) "function $plus$plus(s1) {\
202322 \ return function(s2) {\
203323 \ return s1 + s2;\