@@ -4,8 +4,8 @@ exception Cant_happen;
44exception Not_found;
55exception 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 *)
2121and 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 *)
5051fun 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) *)
220221fun prim_car ctx [VAL (LIST_I (x::xs))] = (ctx, x)
221222fun 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 []) )
223224fun prim_cons ctx [VAL a, VAL (LIST_I b)] = (ctx, VAL (LIST_I ((VAL a) :: b)))
224225fun prim_set ctx [VAL a, VAL b] = (env_set ctx a b, VAL b)
225226
0 commit comments