Skip to content

Commit 30c8473

Browse files
authored
Merge pull request #125 from engboris/syntax-macros
Refactoring (use PPX) and separate files
2 parents 6a7e12e + 1ee2d46 commit 30c8473

File tree

17 files changed

+391
-478
lines changed

17 files changed

+391
-478
lines changed

README.md

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -75,10 +75,12 @@ automaton accepting words ending with 00
7575
#(if read 1 on q0 then q0)
7676
#(if read 0 on q1 then q2)})
7777
78-
<show kill exec { @#e #a1 }>
79-
<show kill exec { @#000 #a1 }>
80-
<show kill exec { @#010 #a1 }>
81-
<show kill exec { @#110 #a1 }>
78+
(:= kill (-a _ _))
79+
80+
<show exec { @(exec { @#e #a1 }) #kill }>
81+
<show exec { @(exec { @#000 #a1 }) #kill }>
82+
<show exec { @(exec { @#010 #a1 }) #kill }>
83+
<show exec { @(exec { @#110 #a1 }) #kill }>
8284
```
8385

8486
More examples can be found in `examples/`.

dune-project

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
(name stellogen)
2020
(synopsis "Stellogen is a minimalistic and logic-agnostic programming
2121
language based on term unification.")
22-
(depends base menhir (alcotest :with-test) sedlex)
22+
(depends base menhir (alcotest :with-test) sedlex ppx_deriving)
2323
(tags
2424
("transcendental syntax" "logic programming" "constraint programming" "resolution logic" "unification" "self-assembly")))
2525

examples/automata.sg

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,13 @@
2222
(:= 110 (+i [1 1 0]))
2323
(:: 110 binary)
2424

25-
'''
26-
automaton accepting words ending with 00
27-
'''
2825
(:= (initial Q) [(-i W) (+a W Q)])
2926
(:= (accept Q) [(-a [] Q) accept])
3027
(:= (if read C1 on Q1 then Q2) [(-a [C1|W] Q1) (+a W Q2)])
3128

29+
'''
30+
automaton accepting words ending with 00
31+
'''
3232
(:= a1 {
3333
#(initial q0)
3434
#(accept q2)
@@ -37,7 +37,9 @@ automaton accepting words ending with 00
3737
#(if read 1 on q0 then q0)
3838
#(if read 0 on q1 then q2)})
3939

40-
<show kill exec { @#e #a1 }>
41-
<show kill exec { @#000 #a1 }>
42-
<show kill exec { @#010 #a1 }>
43-
<show kill exec { @#110 #a1 }>
40+
(:= kill (-a _ _))
41+
42+
<show exec { @(exec { @#e #a1 }) #kill }>
43+
<show exec { @(exec { @#000 #a1 }) #kill }>
44+
<show exec { @(exec { @#010 #a1 }) #kill }>
45+
<show exec { @(exec { @#110 #a1 }) #kill }>

examples/binary4.sg

Lines changed: 33 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1,48 +1,38 @@
1-
'''
2-
(spec u4 [(-b 1 _) (-b 2 _) (-b 3 _) (-b 4 _) ok])
1+
(spec u4 [(-b _ 1 _) (-b _ 2 _) (-b _ 3 _) (-b _ 4 _) ok])
32

4-
(new-declaration (:: tested test)
5-
(:= test @(exec (process #test #test{b=>+b})))
6-
(== test ok))
3+
(new-declaration (:: Tested Test)
4+
(== @(exec (process #Test #Tested)) ok))
75

8-
(:= b1 [ [(b 1 1)] [(b 2 0)] [(b 3 0)] [(b 4 1)]])
9-
(:: b1 u4)
6+
(:= (make_bin Name X1 X2 X3 X4)
7+
{ [(+b Name 1 X1)] [(+b Name 2 X2)] [(+b Name 3 X3)] [(+b Name 4 X4)] })
108

11-
(:= b2 [ [(b 1 0)] [(b 2 0)] [(b 3 1)] [(b 4 1)]])
9+
(:= b1 #(make_bin b1 0 0 0 1))
1210
(:: b1 u4)
1311

14-
(:= and [
15-
[(-b1 arg 0) (-b2 arg X) (b arg 0)]
16-
[(-b1 arg 1) (-b2 arg X) (b arg X)]])
17-
18-
(:= or [
19-
[(-b1 arg 0) (-b2 arg X) (b arg X)]
20-
[(-b1 arg 1) (-b2 arg X) (b arg 1)]])
21-
22-
(:= xor [
23-
[(-b1 arg 1) (-b2 arg 0) (b arg 1)]
24-
[(-b1 arg 0) (-b2 arg 1) (b arg 1)]
25-
[(-b1 arg 0) (-b2 arg 0) (b arg 0)]
26-
[(-b1 arg 1) (-b2 arg 1) (b arg 0)]])
27-
28-
'logical AND
29-
<show exec (process
30-
#b1{b=>+b1}
31-
#and{arg=>1} #and{arg=>2} #and{arg=>3} #and{arg=>4}
32-
#b2{b=>+b2}
33-
kill)>
34-
35-
'logical OR
36-
<show exec (process
37-
#b1{b=>+b1}
38-
#or{arg=>1} #or{arg=>2} #or{arg=>3} #or{arg=>4}
39-
#b2{b=>+b2}
40-
kill)>
41-
42-
'logical XOR
43-
<show exec (process
44-
#b1{b=>+b1}
45-
#xor{arg=>1} #xor{arg=>2} #xor{arg=>3} #xor{arg=>4}
46-
#b2{b=>+b2}
47-
kill)>
48-
'''
12+
(:= b2 #(make_bin b2 0 0 1 1))
13+
(:: b2 u4)
14+
15+
(show #b1)
16+
(show #b2)
17+
18+
(:= (if A = X and B = Y then R = Z) [(-b A I X) (-b B I Y) (+b R I Z)])
19+
20+
'''
21+
'FIXME
22+
23+
(:= (and AA BB RR) {
24+
#(if AA = 0 and BB = XX then RR = 0)
25+
#(if AA = 1 and BB = XX then RR = XX) })
26+
(show #(and b1 b2 r1))
27+
(show (process #b1 #(and b1 b2 r1) #b2))
28+
29+
(:= (or A B R) {
30+
[(-b A I 0) (-b B I X) (+b R I X)]
31+
[(-b A I 1) (-b B I X) (+b R I 1)]})
32+
33+
(:= (xor A B R) {
34+
[(-b A I 1) (-b B I 0) (+b R I 1)]
35+
[(-b A I 0) (-b B I 1) (+b R I 1)]
36+
[(-b A I 0) (-b B I 0) (+b R I 0)]
37+
[(-b A I 1) (-b B I 1) (+b R I 0)]})
38+
'''

examples/circuits.sg

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,4 +36,3 @@ FIXME
3636
[(-c4 R) R]
3737
'apply semantics
3838
#semantics)>
39-
'&kill

examples/npda.sg

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,9 @@
3535
#(if read 0 with 0 on q1 then q1)
3636
#(if read 1 with 1 on q1 then q1)})
3737

38-
<show kill exec { @#e #a1 }>
39-
<show kill exec { @#0000 #a1 }>
40-
<show kill exec { @#0110 #a1 }>
41-
<show kill exec { @#1110 #a1 }>
38+
(:= kill (-a _ _ _))
39+
40+
<show exec { @(exec { @#e #a1 }) #kill }>
41+
<show exec { @(exec { @#0000 #a1 }) #kill }>
42+
<show exec { @(exec { @#0110 #a1 }) #kill }>
43+
<show exec { @(exec { @#1110 #a1 }) #kill }>

examples/turing.sg

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -29,12 +29,12 @@
2929
[(-m q3 L e R) (+m qr L e R)]
3030
[(-m qr L C R) reject]})
3131

32-
<show kill exec { @(+i [a e e]) #mt}>
33-
<show kill exec { @(+i [b e e]) #mt}>
34-
<show kill exec { @(+i [a b b e e]) #mt}>
32+
<show exec { @(+i [a e]) #mt}>
33+
<show exec { @(+i [b e]) #mt}>
34+
<show exec { @(+i [a b b e]) #mt}>
3535

36-
<show kill exec { @(+i [e e]) #mt}>
37-
<show kill exec { @(+i [a b e e]) #mt}>
38-
<show kill exec { @(+i [a a b b e e]) #mt}>
39-
<show kill exec { @(+i [a b b a e e]) #mt}>
40-
<show kill exec { @(+i [a b a b e e]) #mt}>
36+
<show exec { @(+i [e]) #mt}>
37+
<show exec { @(+i [a b e]) #mt}>
38+
<show exec { @(+i [a a b b e]) #mt}>
39+
<show exec { @(+i [a b b a e]) #mt}>
40+
<show exec { @(+i [a b a b e]) #mt}>

nvim/syntax/stellogen.vim

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
syn clear
22

3-
syn keyword sgKeyword new declaration kill clean eval slice show use exec spec linexec process
3+
syn keyword sgKeyword new declaration eval slice show use exec spec linexec process
44
syn match sgComment "\s*'[^'].*$"
55
syn match sgId "#\%(\l\|\d\)\w*"
66
syn region sgComment start="'''" end="'''" contains=NONE

src/dune

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
(name stellogen)
33
(libraries base menhirLib)
44
(preprocess
5-
(pps sedlex.ppx)))
5+
(pps sedlex.ppx ppx_deriving.show ppx_deriving.ord ppx_deriving.eq)))
66

77
(env
88
(dev

src/expr.ml

Lines changed: 12 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ type expr =
2323
| Symbol of string
2424
| Var of ident
2525
| List of expr list
26+
[@@derive eq]
2627

2728
let primitive = String.append "%"
2829

@@ -73,14 +74,6 @@ let rec expand_macro : Raw.t -> expr = function
7374
List.fold_left t ~init:(expand_macro h) ~f:(fun acc e ->
7475
List [ expand_macro e; acc ] )
7576

76-
let rec equal_expr x y =
77-
match (x, y) with
78-
| Var x1, Var x2 | Symbol x1, Symbol x2 -> equal_string x1 x2
79-
| List es1, List es2 -> begin
80-
try List.for_all2_exn es1 es2 ~f:equal_expr with _ -> false
81-
end
82-
| _ -> false
83-
8477
let rec replace_id (xfrom : ident) xto e =
8578
match e with
8679
| Var x when equal_string x xfrom -> xto
@@ -151,30 +144,31 @@ let rec raylist_of_expr (e : expr) : ray list =
151144
ray_of_expr h :: raylist_of_expr t
152145
| e -> failwith ("error: unhandled star " ^ to_string e)
153146

154-
let rec star_of_expr : expr -> marked_star = function
147+
let rec star_of_expr : expr -> Marked.star = function
155148
| List [ Symbol k; s ] when equal_string k focus_op ->
156-
star_of_expr s |> Lsc_ast.remove_mark |> Lsc_ast.mark
149+
star_of_expr s |> Marked.remove |> Marked.make_state
157150
| List [ Symbol k; s; List ps ] when equal_string k params_op ->
158-
Unmarked { content = raylist_of_expr s; bans = bans_of_expr ps }
159-
| 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 = [] }
160153

161-
let rec constellation_of_expr : expr -> marked_constellation = function
162-
| Symbol k when equal_string k nil_op -> []
163-
| Symbol s -> [ Unmarked { content = [ var (s, None) ]; bans = [] } ]
164-
| 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 = [] } ]
165157
| List [ Symbol s; h; t ] when equal_string s cons_op ->
166158
star_of_expr h :: constellation_of_expr t
167-
| List g -> [ Unmarked { content = [ ray_of_expr (List g) ]; bans = [] } ]
159+
| List g -> [ Action { content = [ ray_of_expr (List g) ]; bans = [] } ]
168160

169161
(* ---------------------------------------
170162
Stellogen expr of Expr
171163
--------------------------------------- *)
172164

173165
let rec sgen_expr_of_expr (e : expr) : sgen_expr =
174166
match e with
167+
| Symbol k when equal_string k nil_op ->
168+
Raw [ Action { content = []; bans = [] } ]
175169
(* ray *)
176170
| Var _ | Symbol _ ->
177-
Raw [ Unmarked { content = [ ray_of_expr e ]; bans = [] } ]
171+
Raw [ Action { content = [ ray_of_expr e ]; bans = [] } ]
178172
(* star *)
179173
| List (Symbol s :: _) when equal_string s params_op -> Raw [ star_of_expr e ]
180174
| List (Symbol s :: _) when equal_string s cons_op -> Raw [ star_of_expr e ]
@@ -188,10 +182,6 @@ let rec sgen_expr_of_expr (e : expr) : sgen_expr =
188182
Group (List.map ~f:sgen_expr_of_expr gs)
189183
(* process *)
190184
| List (Symbol "process" :: gs) -> Process (List.map ~f:sgen_expr_of_expr gs)
191-
(* kill *)
192-
| List [ Symbol "kill"; g ] -> Kill (sgen_expr_of_expr g)
193-
(* clean *)
194-
| List [ Symbol "clean"; g ] -> Clean (sgen_expr_of_expr g)
195185
(* exec *)
196186
| List [ Symbol "exec"; g ] -> Exec (false, sgen_expr_of_expr g)
197187
(* linear exec *)

0 commit comments

Comments
 (0)