-
Notifications
You must be signed in to change notification settings - Fork 104
Expand file tree
/
Copy pathExpr.fs
More file actions
98 lines (73 loc) · 3.63 KB
/
Expr.fs
File metadata and controls
98 lines (73 loc) · 3.63 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
namespace FSharpPlus.Tests
open System
open NUnit.Framework
open FSharpPlus
open FSharpPlus.Tests.Helpers
module Expr =
let quotseval x =
#if NETSTANDARD
FSharp.Quotations.Evaluator.QuotationEvaluator.EvaluateUntyped x
#else
Swensen.Unquote.Operators.evalRaw x
#endif
let unquote x = Swensen.Unquote.Operators.evalRaw x
let powerpack x = Microsoft.FSharp.Linq.QuotationEvaluator.EvaluateUntyped x
let ``Simple quotation combination`` evaluator =
let one = <@ 1 @>
let add10AndToString x =
let a = string (x + 10)
<@ a @>
let expr = one >>= add10AndToString
let res = Expr.run evaluator expr
areEqual "11" res
let [<Test>] ``Simple quotation combination [QuotationEvaluator]`` () = ``Simple quotation combination`` quotseval
let [<Test>] ``Simple quotation combination [Unquote]`` () = ``Simple quotation combination`` unquote
let [<Test>] ``Simple quotation combination [PowerPack]`` () = ``Simple quotation combination`` powerpack
let ``2-layers quotation combination`` evaluator =
let expr =
<@ 4 + 5 @>
>>= (fun x ->
let a = x + 10
<@ (a, a*a) @>
>>= fun (x, y) ->
<@ ([x + y], x, y, [|x; y|]) @>)
let res = Expr.run evaluator expr
areEqual ([380], 19, 361, [|19; 361|]) res
let [<Test>] ``2-layers quotation combination [QuotationEvaluator]`` () = ``2-layers quotation combination`` quotseval
let [<Test>] ``2-layers quotation combination [Unquote]`` () = ``2-layers quotation combination`` unquote
let [<Test>] ``2-layers quotation combination [PowerPack]`` () = ``2-layers quotation combination`` powerpack
let ``2-layers quot comb associative`` evaluator =
let expr =
(<@ 4 + 5 @>
>>= fun x ->
let a = x + 10
<@ (a, a*a) @>)
>>= fun (x, y) ->
<@ ([x + y], x, y, [|x; y|]) @>
let res = Expr.run evaluator expr
areEqual ([380], 19, 361, [|19; 361|]) res
let [<Test>] ``2-layers quot comb associative [QuotationEvaluator]`` () = ``2-layers quot comb associative`` quotseval
let [<Test>] ``2-layers quot comb associative [Unquote]`` () = ``2-layers quot comb associative`` unquote
let [<Test>] ``2-layers quot comb associative [PowerPack]`` () = ``2-layers quot comb associative`` powerpack
let ``simple CE same type`` evaluator =
let expr = monad {
let! x = <@ 1 @>
let! y = <@ 2 @>
return! <@ x + y @>
}
let res = Expr.run evaluator expr
areEqual 3 res
let [<Test>] ``simple CE same type [QuotationEvaluator]`` () = ``simple CE same type`` quotseval
let [<Test>] ``simple CE same type [Unquote]`` () = ``simple CE same type`` unquote
let [<Test>] ``simple CE same type [PowerPack]`` () = ``simple CE same type`` powerpack
let ``simple CE different types`` evaluator =
let expr = monad {
let! x = <@ 1 @>
let! y = <@ "2" @>
return! <@ string x + y @>
}
let res = Expr.run evaluator expr
areEqual "12" res
let [<Test>] ``simple CE different types [QuotationEvaluator]`` () = ``simple CE different types`` quotseval
let [<Test>] ``simple CE different types [Unquote]`` () = ``simple CE different types`` unquote
let [<Test>] ``simple CE different types [PowerPack]`` () = ``simple CE different types`` powerpack