Skip to content

Commit 7a69b60

Browse files
committed
fix inadequacy of representation. shit. did I have this before? c.c
1 parent cb2dabe commit 7a69b60

File tree

1 file changed

+15
-14
lines changed

1 file changed

+15
-14
lines changed

‎lisp.sml‎

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ exception Cant_happen;
44
exception Not_found;
55
exception Bad_key;
66

7-
datatype sexp_i = NIL_I
8-
| TRUE_I
7+
datatype sexp_i =
8+
TRUE_I
99
(* No dotted lists. Because fuck you, that's why. *)
1010
| LIST_I of sdata list
1111
| NUM_I of int
@@ -20,16 +20,16 @@ withtype map = (key * sexp_i) list
2020
(* (globalenv * localenv) * heap * ctr *)
2121
and context = ((map * map) * map * int)
2222

23-
datatype input_sexp = NIL
24-
| TRUE
23+
datatype input_sexp =
24+
TRUE
2525
| LIST of input_sexp list
2626
| NUM of int
2727
| SYM of string
2828

29-
fun to_sdata NIL = EXP NIL_I
30-
| to_sdata TRUE = EXP TRUE_I
29+
fun to_sdata TRUE = EXP TRUE_I
3130
| to_sdata (NUM n) = EXP (NUM_I n)
3231
| to_sdata (SYM s) = EXP (SYM_I s)
32+
| to_sdata (LIST []) = EXP (LIST_I [])
3333
| to_sdata (LIST (x::xs)) =
3434
let val (EXP (LIST_I rest)) = to_sdata (LIST xs)
3535
in EXP (LIST_I ((to_sdata x) :: rest)) end
@@ -38,13 +38,14 @@ fun make_key (SYM_I s) = SYM_K s
3838
| make_key (GENSYM_I n) = GENSYM_K n
3939
| make_key _ = raise Bad_key;
4040

41-
fun sexp_eq NIL_I NIL_I = true
42-
| sexp_eq TRUE_I TRUE_I = true
41+
fun sexp_eq TRUE_I TRUE_I = true
4342
| sexp_eq (NUM_I m) (NUM_I n) = m = n
4443
| sexp_eq (SYM_I r) (SYM_I s) = r = s
4544
| sexp_eq (GENSYM_I m) (GENSYM_I n) = m = n
45+
| sexp_eq (LIST_I []) (LIST_I []) = true
4646
| sexp_eq (LIST_I ((VAL x) :: rest1)) (LIST_I ((VAL y) :: rest2)) =
4747
(sexp_eq x y) andalso (sexp_eq (LIST_I rest1) (LIST_I rest2))
48+
| sexp_eq _ _ = false
4849

4950
(* map_lookup : map -> sexp_i -> sexp_i option *)
5051
fun map_lookup [] k = NONE
@@ -165,9 +166,9 @@ and smallstep ctx (VAL x) = raise Already_done
165166
| smallstep ctx (EXP (FUNC_I f)) = raise Cant_happen
166167
| smallstep ctx (EXP (NUM_I x)) = (ctx, (VAL (NUM_I x)))
167168
| smallstep ctx (EXP (SYM_I s)) = (ctx, env_lookup ctx (SYM_I s))
168-
| smallstep ctx (EXP NIL_I) = (ctx, VAL NIL_I)
169+
| smallstep ctx (EXP (LIST_I [])) = (ctx, VAL (LIST_I []))
169170

170-
| smallstep ctx (EXP (LIST_I [EXP (SYM_I "progn")])) = (ctx, VAL NIL_I)
171+
| smallstep ctx (EXP (LIST_I [EXP (SYM_I "progn")])) = (ctx, VAL (LIST_I []))
171172
| smallstep ctx (EXP (LIST_I [EXP (SYM_I "progn"), EXP x])) = (ctx, EXP x)
172173
| smallstep ctx (EXP (LIST_I ((EXP (SYM_I "progn")) :: EXP x :: xs))) =
173174
let val (ctx', result) = (smallstep ctx (EXP x)) in
@@ -187,16 +188,16 @@ and smallstep ctx (VAL x) = raise Already_done
187188
(do_define ctx (SYM_I name) value, VAL value)
188189

189190
| smallstep ctx (EXP (LIST_I ( (EXP (SYM_I "define")) :: (EXP (LIST_I ( (EXP (SYM_I name)) :: params))) :: body))) =
190-
(do_define_func ctx (SYM_I name) params body, VAL NIL_I)
191+
(do_define_func ctx (SYM_I name) params body, VAL (LIST_I []))
191192

192193
| smallstep ctx (EXP (LIST_I [EXP (SYM_I "quote"), EXP x])) = (ctx, VAL x)
193194

194-
| smallstep ctx (EXP (LIST_I [EXP (SYM_I "cond")])) = (ctx, VAL NIL_I)
195+
| smallstep ctx (EXP (LIST_I [EXP (SYM_I "cond")])) = (ctx, VAL (LIST_I []))
195196
| smallstep ctx (EXP (LIST_I ( (EXP (SYM_I "cond")) :: (EXP (LIST_I [EXP c, EXP r])) :: rest))) =
196197
let val (ctx', result) = (smallstep ctx (EXP c)) in
197198
(ctx', (EXP (LIST_I ( (EXP (SYM_I "cond")) :: (EXP (LIST_I [result, EXP r])) :: rest))))
198199
end
199-
| smallstep ctx (EXP (LIST_I ( (EXP (SYM_I "cond")) :: (EXP (LIST_I [VAL NIL_I, EXP r])) :: rest))) =
200+
| smallstep ctx (EXP (LIST_I ( (EXP (SYM_I "cond")) :: (EXP (LIST_I [VAL (LIST_I []), EXP r])) :: rest))) =
200201
(ctx, (EXP (LIST_I ( (EXP (SYM_I "cond")) :: rest ))))
201202
| smallstep ctx (EXP (LIST_I ( (EXP (SYM_I "cond")) :: (EXP (LIST_I [VAL _, EXP r])) :: rest))) =
202203
(ctx, EXP r)
@@ -219,7 +220,7 @@ and smallstep ctx (VAL x) = raise Already_done
219220
(* prim_xxx : ctx -> sdata list -> (ctx * sdata) *)
220221
fun prim_car ctx [VAL (LIST_I (x::xs))] = (ctx, x)
221222
fun prim_cdr ctx [VAL (LIST_I (x::xs))] = (ctx, VAL (LIST_I xs))
222-
fun prim_eq ctx [VAL a, VAL b] = (ctx, if (sexp_eq a b) then VAL TRUE_I else VAL NIL_I)
223+
fun prim_eq ctx [VAL a, VAL b] = (ctx, if (sexp_eq a b) then VAL TRUE_I else VAL (LIST_I []))
223224
fun prim_cons ctx [VAL a, VAL (LIST_I b)] = (ctx, VAL (LIST_I ((VAL a) :: b)))
224225
fun prim_set ctx [VAL a, VAL b] = (env_set ctx a b, VAL b)
225226

0 commit comments

Comments
 (0)