author | Tony Garnock-Jones <tonyg@lshift.net> |
Sat, 15 Apr 2006 09:57:12 +1200 | |
changeset 51 | e9fafa149b08 |
child 52 | e8c6861a3e40 |
permissions | -rw-r--r-- |
51
e9fafa149b08
Muck about with yet /another/ experimental syntax
Tony Garnock-Jones <tonyg@lshift.net>
parents:
diff
changeset
|
1 |
"Basic idea: all symbols are really variables. They're bound to their |
e9fafa149b08
Muck about with yet /another/ experimental syntax
Tony Garnock-Jones <tonyg@lshift.net>
parents:
diff
changeset
|
2 |
underpinning GUID objects. Quoting isn't needed to get literals - it's |
e9fafa149b08
Muck about with yet /another/ experimental syntax
Tony Garnock-Jones <tonyg@lshift.net>
parents:
diff
changeset
|
3 |
just convention. Identifiers are not symbols." |
e9fafa149b08
Muck about with yet /another/ experimental syntax
Tony Garnock-Jones <tonyg@lshift.net>
parents:
diff
changeset
|
4 |
|
e9fafa149b08
Muck about with yet /another/ experimental syntax
Tony Garnock-Jones <tonyg@lshift.net>
parents:
diff
changeset
|
5 |
define map [ |
e9fafa149b08
Muck about with yet /another/ experimental syntax
Tony Garnock-Jones <tonyg@lshift.net>
parents:
diff
changeset
|
6 |
(_ +f): [(+lp [Hd: +h Tl: +t]) : [Hd: f h Tl: lp t] |
e9fafa149b08
Muck about with yet /another/ experimental syntax
Tony Garnock-Jones <tonyg@lshift.net>
parents:
diff
changeset
|
7 |
(+lp x) : x] |
e9fafa149b08
Muck about with yet /another/ experimental syntax
Tony Garnock-Jones <tonyg@lshift.net>
parents:
diff
changeset
|
8 |
];; |
e9fafa149b08
Muck about with yet /another/ experimental syntax
Tony Garnock-Jones <tonyg@lshift.net>
parents:
diff
changeset
|
9 |
|
e9fafa149b08
Muck about with yet /another/ experimental syntax
Tony Garnock-Jones <tonyg@lshift.net>
parents:
diff
changeset
|
10 |
define map [ |
e9fafa149b08
Muck about with yet /another/ experimental syntax
Tony Garnock-Jones <tonyg@lshift.net>
parents:
diff
changeset
|
11 |
\+f: [(+lp [First: +h Rest: +t] : [First: f h Tl: lp t]) |
e9fafa149b08
Muck about with yet /another/ experimental syntax
Tony Garnock-Jones <tonyg@lshift.net>
parents:
diff
changeset
|
12 |
\+x: x]] |
e9fafa149b08
Muck about with yet /another/ experimental syntax
Tony Garnock-Jones <tonyg@lshift.net>
parents:
diff
changeset
|
13 |
|
e9fafa149b08
Muck about with yet /another/ experimental syntax
Tony Garnock-Jones <tonyg@lshift.net>
parents:
diff
changeset
|
14 |
[(_ +x): x] |
e9fafa149b08
Muck about with yet /another/ experimental syntax
Tony Garnock-Jones <tonyg@lshift.net>
parents:
diff
changeset
|
15 |
[\+x: x] |
e9fafa149b08
Muck about with yet /another/ experimental syntax
Tony Garnock-Jones <tonyg@lshift.net>
parents:
diff
changeset
|
16 |
\+x: x |
e9fafa149b08
Muck about with yet /another/ experimental syntax
Tony Garnock-Jones <tonyg@lshift.net>
parents:
diff
changeset
|
17 |
[\+x: x-1] |
e9fafa149b08
Muck about with yet /another/ experimental syntax
Tony Garnock-Jones <tonyg@lshift.net>
parents:
diff
changeset
|
18 |
\Nil: Nil |
e9fafa149b08
Muck about with yet /another/ experimental syntax
Tony Garnock-Jones <tonyg@lshift.net>
parents:
diff
changeset
|
19 |
[Hd: +h Tl: +t]:[Hd: f h Tl: map f t] |
e9fafa149b08
Muck about with yet /another/ experimental syntax
Tony Garnock-Jones <tonyg@lshift.net>
parents:
diff
changeset
|
20 |
|
e9fafa149b08
Muck about with yet /another/ experimental syntax
Tony Garnock-Jones <tonyg@lshift.net>
parents:
diff
changeset
|
21 |
let diff r1 r2 = |
e9fafa149b08
Muck about with yet /another/ experimental syntax
Tony Garnock-Jones <tonyg@lshift.net>
parents:
diff
changeset
|
22 |
let collect [First: +fieldName Rest: +rest] diffs = |
e9fafa149b08
Muck about with yet /another/ experimental syntax
Tony Garnock-Jones <tonyg@lshift.net>
parents:
diff
changeset
|
23 |
let v1 = r1 At: fieldName IfAbsent: Absent, |
e9fafa149b08
Muck about with yet /another/ experimental syntax
Tony Garnock-Jones <tonyg@lshift.net>
parents:
diff
changeset
|
24 |
v2 = r2 At: fieldName IfAbsent: Absent, |
e9fafa149b08
Muck about with yet /another/ experimental syntax
Tony Garnock-Jones <tonyg@lshift.net>
parents:
diff
changeset
|
25 |
collect1 +type +old +new = |
e9fafa149b08
Muck about with yet /another/ experimental syntax
Tony Garnock-Jones <tonyg@lshift.net>
parents:
diff
changeset
|
26 |
collect rest [First: [fieldName, type, old, new] Rest: diffs] |
e9fafa149b08
Muck about with yet /another/ experimental syntax
Tony Garnock-Jones <tonyg@lshift.net>
parents:
diff
changeset
|
27 |
in cond ((v1 == v2) -> collect rest differences, |
e9fafa149b08
Muck about with yet /another/ experimental syntax
Tony Garnock-Jones <tonyg@lshift.net>
parents:
diff
changeset
|
28 |
(v1 == Absent) -> collect1 Added [] v2, |
e9fafa149b08
Muck about with yet /another/ experimental syntax
Tony Garnock-Jones <tonyg@lshift.net>
parents:
diff
changeset
|
29 |
(v2 == Absent) -> collect1 Removed v1 [], |
e9fafa149b08
Muck about with yet /another/ experimental syntax
Tony Garnock-Jones <tonyg@lshift.net>
parents:
diff
changeset
|
30 |
True -> collect1 Changed v1 v2) |
e9fafa149b08
Muck about with yet /another/ experimental syntax
Tony Garnock-Jones <tonyg@lshift.net>
parents:
diff
changeset
|
31 |
collect [] +diffs = diffs |
e9fafa149b08
Muck about with yet /another/ experimental syntax
Tony Garnock-Jones <tonyg@lshift.net>
parents:
diff
changeset
|
32 |
in |
e9fafa149b08
Muck about with yet /another/ experimental syntax
Tony Garnock-Jones <tonyg@lshift.net>
parents:
diff
changeset
|
33 |
(r1 Class == r2 Class) && collect (r1 Class FieldNames) [] |
e9fafa149b08
Muck about with yet /another/ experimental syntax
Tony Garnock-Jones <tonyg@lshift.net>
parents:
diff
changeset
|
34 |
;; |
e9fafa149b08
Muck about with yet /another/ experimental syntax
Tony Garnock-Jones <tonyg@lshift.net>
parents:
diff
changeset
|
35 |
|
e9fafa149b08
Muck about with yet /another/ experimental syntax
Tony Garnock-Jones <tonyg@lshift.net>
parents:
diff
changeset
|
36 |
let diff r1 r2 = |
e9fafa149b08
Muck about with yet /another/ experimental syntax
Tony Garnock-Jones <tonyg@lshift.net>
parents:
diff
changeset
|
37 |
(r1 Class == r2 Class) && |
e9fafa149b08
Muck about with yet /another/ experimental syntax
Tony Garnock-Jones <tonyg@lshift.net>
parents:
diff
changeset
|
38 |
filterMap [\+fieldName: |
e9fafa149b08
Muck about with yet /another/ experimental syntax
Tony Garnock-Jones <tonyg@lshift.net>
parents:
diff
changeset
|
39 |
let v1 = r1 At: fieldName IfAbsent: Absent, |
e9fafa149b08
Muck about with yet /another/ experimental syntax
Tony Garnock-Jones <tonyg@lshift.net>
parents:
diff
changeset
|
40 |
v2 = r2 At: fieldName IfAbsent: Absent |
e9fafa149b08
Muck about with yet /another/ experimental syntax
Tony Garnock-Jones <tonyg@lshift.net>
parents:
diff
changeset
|
41 |
in cond [(v1 == v2) -> Nothing, |
e9fafa149b08
Muck about with yet /another/ experimental syntax
Tony Garnock-Jones <tonyg@lshift.net>
parents:
diff
changeset
|
42 |
(v1 == Absent) -> [Just: [fieldName, Added, [], v2]] |
e9fafa149b08
Muck about with yet /another/ experimental syntax
Tony Garnock-Jones <tonyg@lshift.net>
parents:
diff
changeset
|
43 |
(v2 == Absent) -> [Just: [fieldName, Removed, v1, []]], |
e9fafa149b08
Muck about with yet /another/ experimental syntax
Tony Garnock-Jones <tonyg@lshift.net>
parents:
diff
changeset
|
44 |
True -> [Just: [fieldName, Changed, v1, v2]]]] |
e9fafa149b08
Muck about with yet /another/ experimental syntax
Tony Garnock-Jones <tonyg@lshift.net>
parents:
diff
changeset
|
45 |
(r1 Class FieldNames);; |
e9fafa149b08
Muck about with yet /another/ experimental syntax
Tony Garnock-Jones <tonyg@lshift.net>
parents:
diff
changeset
|
46 |
|
e9fafa149b08
Muck about with yet /another/ experimental syntax
Tony Garnock-Jones <tonyg@lshift.net>
parents:
diff
changeset
|
47 |
" |
e9fafa149b08
Muck about with yet /another/ experimental syntax
Tony Garnock-Jones <tonyg@lshift.net>
parents:
diff
changeset
|
48 |
let +a +b = c in d ... |
e9fafa149b08
Muck about with yet /another/ experimental syntax
Tony Garnock-Jones <tonyg@lshift.net>
parents:
diff
changeset
|
49 |
--> |
e9fafa149b08
Muck about with yet /another/ experimental syntax
Tony Garnock-Jones <tonyg@lshift.net>
parents:
diff
changeset
|
50 |
[\+a: d ...] [(+a +b): c] |
e9fafa149b08
Muck about with yet /another/ experimental syntax
Tony Garnock-Jones <tonyg@lshift.net>
parents:
diff
changeset
|
51 |
|
e9fafa149b08
Muck about with yet /another/ experimental syntax
Tony Garnock-Jones <tonyg@lshift.net>
parents:
diff
changeset
|
52 |
let +v = w in x ... |
e9fafa149b08
Muck about with yet /another/ experimental syntax
Tony Garnock-Jones <tonyg@lshift.net>
parents:
diff
changeset
|
53 |
--> |
e9fafa149b08
Muck about with yet /another/ experimental syntax
Tony Garnock-Jones <tonyg@lshift.net>
parents:
diff
changeset
|
54 |
[\+v: x ...] w |
e9fafa149b08
Muck about with yet /another/ experimental syntax
Tony Garnock-Jones <tonyg@lshift.net>
parents:
diff
changeset
|
55 |
" |
e9fafa149b08
Muck about with yet /another/ experimental syntax
Tony Garnock-Jones <tonyg@lshift.net>
parents:
diff
changeset
|
56 |
|
e9fafa149b08
Muck about with yet /another/ experimental syntax
Tony Garnock-Jones <tonyg@lshift.net>
parents:
diff
changeset
|
57 |
let +diff +r1 +r2 = (r1 Class == r2 Class) && |
e9fafa149b08
Muck about with yet /another/ experimental syntax
Tony Garnock-Jones <tonyg@lshift.net>
parents:
diff
changeset
|
58 |
filterMap [\+fieldName: |
e9fafa149b08
Muck about with yet /another/ experimental syntax
Tony Garnock-Jones <tonyg@lshift.net>
parents:
diff
changeset
|
59 |
let +v1 = r1 At: fieldName IfAbsent: Absent, |
e9fafa149b08
Muck about with yet /another/ experimental syntax
Tony Garnock-Jones <tonyg@lshift.net>
parents:
diff
changeset
|
60 |
+v2 = r2 At: fieldName IfAbsent: Absent |
e9fafa149b08
Muck about with yet /another/ experimental syntax
Tony Garnock-Jones <tonyg@lshift.net>
parents:
diff
changeset
|
61 |
in cond [(v1 == v2) -> Nothing, |
e9fafa149b08
Muck about with yet /another/ experimental syntax
Tony Garnock-Jones <tonyg@lshift.net>
parents:
diff
changeset
|
62 |
(v1 == Absent) -> [Just: [fieldName, Added, [], v2]] |
e9fafa149b08
Muck about with yet /another/ experimental syntax
Tony Garnock-Jones <tonyg@lshift.net>
parents:
diff
changeset
|
63 |
(v2 == Absent) -> [Just: [fieldName, Removed, v1, []]], |
e9fafa149b08
Muck about with yet /another/ experimental syntax
Tony Garnock-Jones <tonyg@lshift.net>
parents:
diff
changeset
|
64 |
True -> [Just: [fieldName, Changed, v1, v2]]]] |
e9fafa149b08
Muck about with yet /another/ experimental syntax
Tony Garnock-Jones <tonyg@lshift.net>
parents:
diff
changeset
|
65 |
(r1 Class FieldNames) |
e9fafa149b08
Muck about with yet /another/ experimental syntax
Tony Garnock-Jones <tonyg@lshift.net>
parents:
diff
changeset
|
66 |
;; |
e9fafa149b08
Muck about with yet /another/ experimental syntax
Tony Garnock-Jones <tonyg@lshift.net>
parents:
diff
changeset
|
67 |
|
e9fafa149b08
Muck about with yet /another/ experimental syntax
Tony Garnock-Jones <tonyg@lshift.net>
parents:
diff
changeset
|
68 |
let filterMap +fn = [ |
e9fafa149b08
Muck about with yet /another/ experimental syntax
Tony Garnock-Jones <tonyg@lshift.net>
parents:
diff
changeset
|
69 |
(+loop [First: +f Rest: +r]): maybe (loop r) id (fn f) |
e9fafa149b08
Muck about with yet /another/ experimental syntax
Tony Garnock-Jones <tonyg@lshift.net>
parents:
diff
changeset
|
70 |
(+loop x): x |
e9fafa149b08
Muck about with yet /another/ experimental syntax
Tony Garnock-Jones <tonyg@lshift.net>
parents:
diff
changeset
|
71 |
];; |