blob: 9af307287c39e0f97d53a961d722deaa8f003264 (
plain)
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
|
(.module:
[lux (#- function)
["_" test (#+ Test)]
[abstract
[monad (#+ do)]]
[control
[pipe (#+ case>)]]
[data
["." maybe]
[number
["n" nat]]
[collection
["." list ("#@." functor)]]]
[math
["r" random (#+ Random) ("#@." monad)]]
[tool
[compiler
[analysis (#+ Arity)]
["." reference (#+ Register)]
["." synthesis (#+ Synthesis)]]]]
["." // #_
["#." case]
[//
[common (#+ Runner)]]])
(def: max-arity Arity 10)
(def: arity
(Random Arity)
(|> r.nat (r@map (|>> (n.% max-arity) (n.max 1)))))
(def: (local arity)
(-> Arity (Random Register))
(|> r.nat (r@map (|>> (n.% arity) inc))))
(def: function
(Random [Arity Register Synthesis])
(do r.monad
[arity ..arity
local (..local arity)]
(wrap [arity local
(synthesis.function/abstraction
{#synthesis.environment (list)
#synthesis.arity arity
#synthesis.body (synthesis.variable/local local)})])))
(def: #export (spec run)
(-> Runner Test)
(do r.monad
[[arity local functionS] ..function
partial-arity (|> r.nat (:: @ map (|>> (n.% arity) (n.max 1))))
inputs (r.list arity r.safe-frac)
#let [expectation (maybe.assume (list.nth (dec local) inputs))
inputsS (list@map (|>> synthesis.f64) inputs)]]
($_ _.and
(_.test "Can read arguments."
(|> (synthesis.function/apply {#synthesis.function functionS
#synthesis.arguments inputsS})
(run "with-local")
(//case.verify expectation)))
(_.test "Can partially apply functions."
(or (n.= 1 arity)
(let [preS (list.take partial-arity inputsS)
postS (list.drop partial-arity inputsS)
partialS (synthesis.function/apply {#synthesis.function functionS
#synthesis.arguments preS})]
(|> (synthesis.function/apply {#synthesis.function partialS
#synthesis.arguments postS})
(run "partial-application")
(//case.verify expectation)))))
(_.test "Can read environment."
(or (n.= 1 arity)
(let [environment (|> partial-arity
(list.n/range 1)
(list@map (|>> #reference.Local)))
variableS (if (n.<= partial-arity local)
(synthesis.variable/foreign (dec local))
(synthesis.variable/local (|> local (n.- partial-arity))))
inner-arity (n.- partial-arity arity)
innerS (synthesis.function/abstraction
{#synthesis.environment environment
#synthesis.arity inner-arity
#synthesis.body variableS})
outerS (synthesis.function/abstraction
{#synthesis.environment (list)
#synthesis.arity partial-arity
#synthesis.body innerS})]
(|> (synthesis.function/apply {#synthesis.function outerS
#synthesis.arguments inputsS})
(run "with-foreign")
(//case.verify expectation)))))
)))
|