Skip to content

Commit a2bf7e8

Browse files
committed
Use modules for marked stars and constellations and refactoring
1 parent 0e72ad0 commit a2bf7e8

File tree

6 files changed

+77
-70
lines changed

6 files changed

+77
-70
lines changed

src/expr.ml

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -144,19 +144,19 @@ let rec raylist_of_expr (e : expr) : ray list =
144144
ray_of_expr h :: raylist_of_expr t
145145
| e -> failwith ("error: unhandled star " ^ to_string e)
146146

147-
let rec star_of_expr : expr -> marked_star = function
147+
let rec star_of_expr : expr -> Marked.star = function
148148
| List [ Symbol k; s ] when equal_string k focus_op ->
149-
star_of_expr s |> Lsc_ast.remove_mark |> Lsc_ast.mark
149+
star_of_expr s |> Marked.remove |> Marked.make_state
150150
| List [ Symbol k; s; List ps ] when equal_string k params_op ->
151-
Unmarked { content = raylist_of_expr s; bans = bans_of_expr ps }
152-
| e -> Unmarked { content = raylist_of_expr e; bans = [] }
151+
Action { content = raylist_of_expr s; bans = bans_of_expr ps }
152+
| e -> Action { content = raylist_of_expr e; bans = [] }
153153

154-
let rec constellation_of_expr : expr -> marked_constellation = function
155-
| Symbol s -> [ Unmarked { content = [ var (s, None) ]; bans = [] } ]
156-
| Var x -> [ Unmarked { content = [ var (x, None) ]; bans = [] } ]
154+
let rec constellation_of_expr : expr -> Marked.constellation = function
155+
| Symbol s -> [ Action { content = [ var (s, None) ]; bans = [] } ]
156+
| Var x -> [ Action { content = [ var (x, None) ]; bans = [] } ]
157157
| List [ Symbol s; h; t ] when equal_string s cons_op ->
158158
star_of_expr h :: constellation_of_expr t
159-
| List g -> [ Unmarked { content = [ ray_of_expr (List g) ]; bans = [] } ]
159+
| List g -> [ Action { content = [ ray_of_expr (List g) ]; bans = [] } ]
160160

161161
(* ---------------------------------------
162162
Stellogen expr of Expr
@@ -165,10 +165,10 @@ let rec constellation_of_expr : expr -> marked_constellation = function
165165
let rec sgen_expr_of_expr (e : expr) : sgen_expr =
166166
match e with
167167
| Symbol k when equal_string k nil_op ->
168-
Raw [ Unmarked { content = []; bans = [] } ]
168+
Raw [ Action { content = []; bans = [] } ]
169169
(* ray *)
170170
| Var _ | Symbol _ ->
171-
Raw [ Unmarked { content = [ ray_of_expr e ]; bans = [] } ]
171+
Raw [ Action { content = [ ray_of_expr e ]; bans = [] } ]
172172
(* star *)
173173
| List (Symbol s :: _) when equal_string s params_op -> Raw [ star_of_expr e ]
174174
| List (Symbol s :: _) when equal_string s cons_op -> Raw [ star_of_expr e ]

src/lsc_ast.ml

Lines changed: 37 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -48,13 +48,15 @@ type ban =
4848
| Incomp of ray * ray
4949
[@@deriving eq]
5050

51-
type star =
52-
{ content : ray list
53-
; bans : ban list
54-
}
55-
[@@deriving eq]
56-
57-
type constellation = star list [@@deriving eq]
51+
module Raw = struct
52+
type star =
53+
{ content : ray list
54+
; bans : ban list
55+
}
56+
[@@deriving eq]
57+
58+
type constellation = star list [@@deriving eq]
59+
end
5860

5961
let to_var x = Var (x, None)
6062

@@ -104,25 +106,42 @@ let fresh_var vars =
104106
Operation on marked stars
105107
--------------------------------------- *)
106108

107-
type marked_star =
108-
| Marked of star
109-
| Unmarked of star
110-
[@@deriving eq]
109+
module Marked = struct
110+
type star =
111+
| State of Raw.star
112+
| Action of Raw.star
113+
[@@deriving eq]
114+
115+
type constellation = star list [@@deriving eq]
111116

112-
type marked_constellation = marked_star list [@@deriving eq]
117+
let map ~f : star -> star = function
118+
| State s -> State { content = List.map ~f s.content; bans = s.bans }
119+
| Action s -> Action { content = List.map ~f s.content; bans = s.bans }
113120

114-
let map_mstar ~f : marked_star -> marked_star = function
115-
| Marked s -> Marked { content = List.map ~f s.content; bans = s.bans }
116-
| Unmarked s -> Unmarked { content = List.map ~f s.content; bans = s.bans }
121+
let make_action s = Action s
122+
let make_state s = State s
117123

118-
let subst_all_vars sub = List.map ~f:(map_mstar ~f:(subst sub))
124+
let make_action_all = List.map ~f:make_action
125+
126+
let make_state_all = List.map ~f:make_state
127+
128+
let remove : star -> Raw.star = function
129+
| State s -> s
130+
| Action s -> s
131+
132+
let remove_all = List.map ~f:remove
133+
134+
let normalize_all x = x |> remove_all |> make_action_all
135+
end
136+
137+
let subst_all_vars sub = List.map ~f:(Marked.map ~f:(subst sub))
119138

120139
let all_vars mcs : StellarSig.idvar list =
121-
List.map mcs ~f:(function Marked s | Unmarked s ->
140+
List.map mcs ~f:(function Marked.State s | Marked.Action s ->
122141
List.map s.content ~f:StellarRays.vars |> List.concat )
123142
|> List.concat
124143

125-
let normalize_vars (mcs : marked_constellation) =
144+
let normalize_vars (mcs : Marked.constellation) =
126145
let vars = all_vars mcs in
127146
let new_x, new_i = fresh_var vars in
128147
let new_vars =
@@ -131,18 +150,3 @@ let normalize_vars (mcs : marked_constellation) =
131150
in
132151
let sub = List.zip_exn vars new_vars in
133152
subst_all_vars sub mcs
134-
135-
let unmark = function s -> Unmarked s
136-
137-
let mark = function s -> Marked s
138-
139-
let focus = List.map ~f:(fun r -> mark r)
140-
141-
let remove_mark : marked_star -> star = function
142-
| Marked s -> s
143-
| Unmarked s -> s
144-
145-
let unmark_all = List.map ~f:(fun s -> Unmarked s)
146-
147-
let remove_mark_all : marked_constellation -> constellation =
148-
List.map ~f:remove_mark

src/lsc_eval.ml

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,19 @@
11
open Base
22
open Lsc_ast
33
open Lsc_ast.StellarRays
4+
open Lsc_ast.Raw
45

56
let ( let* ) x f = Result.bind x ~f
67

78
type configuration = constellation * constellation
89

9-
let unpolarized_star s = List.for_all ~f:(Fn.compose not is_polarised) s.content
10+
let unpolarized_star s =
11+
let open Raw in
12+
List.for_all ~f:(Fn.compose not is_polarised) s.content
1013

11-
let kill : constellation -> constellation = List.filter ~f:unpolarized_star
14+
let kill = List.filter ~f:unpolarized_star
1215

13-
let clean : constellation -> constellation =
16+
let clean =
1417
List.filter ~f:(fun s -> List.is_empty s.content)
1518

1619
let fmap_ban ~f = function
@@ -53,18 +56,18 @@ let ident_counter = ref 0
5356
let classify =
5457
let rec aux (cs, space) = function
5558
| [] -> (List.rev cs, List.rev space)
56-
| Marked s :: t -> aux (cs, s :: space) t
57-
| Unmarked s :: t -> aux (s :: cs, space) t
59+
| Marked.State s :: t -> aux (cs, s :: space) t
60+
| Marked.Action s :: t -> aux (s :: cs, space) t
5861
in
5962
aux ([], [])
6063

61-
let extract_intspace (mcs : marked_constellation) =
64+
let extract_intspace (mcs : Marked.constellation) =
6265
ident_counter := 0;
6366
classify mcs
6467

6568
(* interaction between one selected ray and one selected action *)
6669
let rec interaction ~queue repl1 repl2 (selected_action, other_actions)
67-
(selected_ray, other_rays, bans) : star list =
70+
(selected_ray, other_rays, bans) : constellation =
6871
match selected_action.content with
6972
| [] -> []
7073
| r' :: s' when not (is_polarised r') ->

src/lsc_pretty.ml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
open Base
22
open Lsc_ast
33
open Lsc_ast.StellarRays
4+
open Lsc_ast.Raw
45

56
let string_of_polarity = function Pos -> "+" | Neg -> "-" | Null -> ""
67

src/sgen_ast.ml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ type idvar = string * int option
88
type idfunc = polarity * string
99

1010
type sgen_expr =
11-
| Raw of marked_constellation
11+
| Raw of Marked.constellation
1212
| Id of ident
1313
| Exec of bool * sgen_expr
1414
| Group of sgen_expr list
@@ -19,7 +19,7 @@ type sgen_expr =
1919
| Eval of sgen_expr
2020

2121
type err =
22-
| ExpectError of marked_constellation * marked_constellation * ident
22+
| ExpectError of Marked.constellation * Marked.constellation * ident
2323
| UnknownID of string
2424

2525
type env = { objs : (ident * sgen_expr) list }

src/sgen_eval.ml

Lines changed: 17 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -58,8 +58,8 @@ let pp_err e : (string, err) Result.t =
5858
match e with
5959
| ExpectError (x, e, Func ((Null, f), [])) when equal_string f "default" ->
6060
sprintf "%s:\n* expected: %s\n* got: %s\n" (red "Expect Error")
61-
(e |> remove_mark_all |> string_of_constellation)
62-
(x |> remove_mark_all |> string_of_constellation)
61+
(e |> Marked.remove_all |> string_of_constellation)
62+
(x |> Marked.remove_all |> string_of_constellation)
6363
|> Result.return
6464
| ExpectError (_x, _e, Func ((Null, f), [ t ])) when equal_string f "error" ->
6565
sprintf "%s: %s\n" (red "Expect Error") (string_of_ray t) |> Result.return
@@ -70,7 +70,7 @@ let pp_err e : (string, err) Result.t =
7070
|> Result.return
7171

7272
let rec eval_sgen_expr (env : env) :
73-
sgen_expr -> (marked_constellation, err) Result.t = function
73+
sgen_expr -> (Marked.constellation, err) Result.t = function
7474
| Raw mcs -> Ok mcs
7575
| Id x -> begin
7676
match get_obj env x with
@@ -88,43 +88,43 @@ let rec eval_sgen_expr (env : env) :
8888
Ok (List.concat mcs)
8989
| Exec (b, e) ->
9090
let* eval_e = eval_sgen_expr env e in
91-
Ok (exec ~linear:b eval_e |> unmark_all)
91+
Ok (exec ~linear:b eval_e |> Marked.make_action_all)
9292
| Focus e ->
9393
let* eval_e = eval_sgen_expr env e in
94-
eval_e |> remove_mark_all |> focus |> Result.return
94+
eval_e |> Marked.remove_all |> Marked.make_state_all |> Result.return
9595
| Kill e ->
9696
let* eval_e = eval_sgen_expr env e in
97-
eval_e |> remove_mark_all |> kill |> focus |> Result.return
97+
eval_e |> Marked.remove_all |> kill |> Marked.make_state_all |> Result.return
9898
| Clean e ->
9999
let* eval_e = eval_sgen_expr env e in
100-
eval_e |> remove_mark_all |> clean |> focus |> Result.return
100+
eval_e |> Marked.remove_all |> clean |> Marked.make_state_all |> Result.return
101101
| Process [] -> Ok []
102102
| Process (h :: t) ->
103103
let* eval_e = eval_sgen_expr env h in
104-
let init = eval_e |> remove_mark_all |> focus in
104+
let init = eval_e |> Marked.remove_all |> Marked.make_state_all in
105105
let* res =
106106
List.fold_left t ~init:(Ok init) ~f:(fun acc x ->
107107
let* acc = acc in
108108
match x with
109109
| Id (Func ((Null, "&kill"), [])) ->
110-
acc |> remove_mark_all |> kill |> focus |> Result.return
110+
acc |> Marked.remove_all |> kill |> Marked.make_state_all |> Result.return
111111
| Id (Func ((Null, "&clean"), [])) ->
112-
acc |> remove_mark_all |> clean |> focus |> Result.return
112+
acc |> Marked.remove_all |> clean |> Marked.make_state_all |> Result.return
113113
| _ ->
114-
let origin = acc |> remove_mark_all |> focus in
114+
let origin = acc |> Marked.remove_all |> Marked.make_state_all in
115115
eval_sgen_expr env (Focus (Exec (false, Group [ x; Raw origin ]))) )
116116
in
117117
res |> Result.return
118118
| Eval e -> (
119119
let* eval_e = eval_sgen_expr env e in
120120
match eval_e with
121-
| [ Marked { content = [ r ]; bans = _ } ]
122-
| [ Unmarked { content = [ r ]; bans = _ } ] ->
121+
| [ State { content = [ r ]; bans = _ } ]
122+
| [ Action { content = [ r ]; bans = _ } ] ->
123123
r |> expr_of_ray |> Expr.sgen_expr_of_expr |> eval_sgen_expr env
124124
| e ->
125125
failwith
126126
( "eval error: "
127-
^ string_of_constellation (remove_mark_all e)
127+
^ string_of_constellation (Marked.remove_all e)
128128
^ " is not a ray." ) )
129129

130130
and expr_of_ray = function
@@ -139,13 +139,13 @@ let rec eval_decl env : declaration -> (env, err) Result.t = function
139139
let env = { objs = add_obj env x e } in
140140
Ok env
141141
| Show (Raw mcs) ->
142-
mcs |> remove_mark_all |> string_of_constellation |> Stdlib.print_string;
142+
mcs |> Marked.remove_all |> string_of_constellation |> Stdlib.print_string;
143143
Stdlib.print_newline ();
144144
Stdlib.flush Stdlib.stdout;
145145
Ok env
146146
| Show e ->
147147
let* eval_e = eval_sgen_expr env e in
148-
List.map eval_e ~f:remove_mark
148+
List.map eval_e ~f:Marked.remove
149149
|> string_of_constellation |> Stdlib.print_string;
150150
Stdlib.print_newline ();
151151
Ok env
@@ -155,8 +155,7 @@ let rec eval_decl env : declaration -> (env, err) Result.t = function
155155
| Expect (e1, e2, message) ->
156156
let* eval_e1 = eval_sgen_expr env e1 in
157157
let* eval_e2 = eval_sgen_expr env e2 in
158-
let normalize x = x |> remove_mark_all |> unmark_all in
159-
if not @@ equal_marked_constellation (normalize eval_e1) (normalize eval_e2)
158+
if not @@ Marked.equal_constellation (Marked.normalize_all eval_e1) (Marked.normalize_all eval_e2)
160159
then Error (ExpectError (eval_e1, eval_e2, message))
161160
else Ok env
162161
| Use path ->

0 commit comments

Comments
 (0)