Skip to content

Commit a2f5708

Browse files
committed
swift[34]: merge eval_ast and macroexpand into EVAL, add DEBUG-EVAL
swift3/stepA: print *host-language* swift4: reduce differences between steps in spacing, ordering and so on. swift4/step5: remove a large comment containing non-printable characters
1 parent dfc67ee commit a2f5708

File tree

18 files changed

+418
-783
lines changed

18 files changed

+418
-783
lines changed

impls/swift3/Sources/step2_eval/main.swift

Lines changed: 12 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -7,44 +7,35 @@ func READ(_ str: String) throws -> MalVal {
77

88
// eval
99
func eval_ast(_ ast: MalVal, _ env: Dictionary<String, MalVal>) throws -> MalVal {
10+
/* print("EVAL: " + PRINT(ast)) */
1011
switch ast {
1112
case MalVal.MalSymbol(let sym):
1213
if env[sym] == nil {
1314
throw MalError.General(msg: "'\(sym)' not found")
1415
}
1516
return env[sym]!
16-
case MalVal.MalList(let lst, _):
17-
return list(try lst.map { try EVAL($0, env) })
1817
case MalVal.MalVector(let lst, _):
1918
return vector(try lst.map { try EVAL($0, env) })
2019
case MalVal.MalHashMap(let dict, _):
2120
var new_dict = Dictionary<String,MalVal>()
2221
for (k,v) in dict { new_dict[k] = try EVAL(v, env) }
2322
return hash_map(new_dict)
23+
case MalVal.MalList(let lst, _):
24+
if lst.count == 0 { return ast }
25+
26+
let raw_args = lst[1..<lst.count]
27+
switch try EVAL(lst[0], env) {
28+
case MalVal.MalFunc(let fn, nil, _, _, _, _):
29+
let args = raw_args.map { try EVAL($0, env) }
30+
return try fn(args)
31+
default:
32+
throw MalError.General(msg: "Cannot apply on '\(lst[0])'")
33+
}
2434
default:
2535
return ast
2636
}
2737
}
2838

29-
func EVAL(_ ast: MalVal, _ env: Dictionary<String, MalVal>) throws -> MalVal {
30-
switch ast {
31-
case MalVal.MalList(let lst, _): if lst.count == 0 { return ast }
32-
default: return try eval_ast(ast, env)
33-
}
34-
35-
switch try eval_ast(ast, env) {
36-
case MalVal.MalList(let elst, _):
37-
switch elst[0] {
38-
case MalVal.MalFunc(let fn,_,_,_,_,_):
39-
let args = Array(elst[1..<elst.count])
40-
return try fn(args)
41-
default:
42-
throw MalError.General(msg: "Cannot apply on '\(elst[0])'")
43-
}
44-
default: throw MalError.General(msg: "Invalid apply")
45-
}
46-
}
47-
4839
// print
4940
func PRINT(_ exp: MalVal) -> String {
5041
return pr_str(exp, true)

impls/swift3/Sources/step3_env/main.swift

Lines changed: 12 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -7,30 +7,22 @@ func READ(_ str: String) throws -> MalVal {
77

88
// eval
99
func eval_ast(_ ast: MalVal, _ env: Env) throws -> MalVal {
10+
switch try! env.find(MalVal.MalSymbol("DEBUG-EVAL")) {
11+
case MalVal.MalFalse, MalVal.MalNil:
12+
default:
13+
print("EVAL: " + PRINT(ast))
14+
}
1015
switch ast {
1116
case MalVal.MalSymbol:
1217
return try env.get(ast)
13-
case MalVal.MalList(let lst, _):
14-
return list(try lst.map { try EVAL($0, env) })
1518
case MalVal.MalVector(let lst, _):
1619
return vector(try lst.map { try EVAL($0, env) })
1720
case MalVal.MalHashMap(let dict, _):
1821
var new_dict = Dictionary<String,MalVal>()
1922
for (k,v) in dict { new_dict[k] = try EVAL(v, env) }
2023
return hash_map(new_dict)
21-
default:
22-
return ast
23-
}
24-
}
25-
26-
func EVAL(_ ast: MalVal, _ env: Env) throws -> MalVal {
27-
switch ast {
28-
case MalVal.MalList(let lst, _): if lst.count == 0 { return ast }
29-
default: return try eval_ast(ast, env)
30-
}
31-
32-
switch ast {
3324
case MalVal.MalList(let lst, _):
25+
if lst.count == 0 { return ast }
3426
switch lst[0] {
3527
case MalVal.MalSymbol("def!"):
3628
return try env.set(lst[1], try EVAL(lst[2], env))
@@ -51,20 +43,17 @@ func EVAL(_ ast: MalVal, _ env: Env) throws -> MalVal {
5143
}
5244
return try EVAL(lst[2], let_env)
5345
default:
54-
switch try eval_ast(ast, env) {
55-
case MalVal.MalList(let elst, _):
56-
switch elst[0] {
57-
case MalVal.MalFunc(let fn,_,_,_,_,_):
58-
let args = Array(elst[1..<elst.count])
46+
let raw_args = lst[1..<lst.count]
47+
switch try EVAL(lst[0], env) {
48+
case MalVal.MalFunc(let fn, nil, _, _, _, _):
49+
let args = raw_args.map { try EVAL($0, env) }
5950
return try fn(args)
6051
default:
61-
throw MalError.General(msg: "Cannot apply on '\(elst[0])'")
52+
throw MalError.General(msg: "Cannot apply on '\(lst[0])'")
6253
}
63-
default: throw MalError.General(msg: "Invalid apply")
64-
}
6554
}
6655
default:
67-
throw MalError.General(msg: "Invalid apply")
56+
return ast
6857
}
6958
}
7059

impls/swift3/Sources/step4_if_fn_do/main.swift

Lines changed: 16 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -7,30 +7,22 @@ func READ(_ str: String) throws -> MalVal {
77

88
// eval
99
func eval_ast(_ ast: MalVal, _ env: Env) throws -> MalVal {
10+
switch try! env.find(MalVal.MalSymbol("DEBUG-EVAL")) {
11+
case MalVal.MalFalse, MalVal.MalNil:
12+
default:
13+
print("EVAL: " + PRINT(ast))
14+
}
1015
switch ast {
1116
case MalVal.MalSymbol:
1217
return try env.get(ast)
13-
case MalVal.MalList(let lst, _):
14-
return list(try lst.map { try EVAL($0, env) })
1518
case MalVal.MalVector(let lst, _):
1619
return vector(try lst.map { try EVAL($0, env) })
1720
case MalVal.MalHashMap(let dict, _):
1821
var new_dict = Dictionary<String,MalVal>()
1922
for (k,v) in dict { new_dict[k] = try EVAL(v, env) }
2023
return hash_map(new_dict)
21-
default:
22-
return ast
23-
}
24-
}
25-
26-
func EVAL(_ ast: MalVal, _ env: Env) throws -> MalVal {
27-
switch ast {
28-
case MalVal.MalList(let lst, _): if lst.count == 0 { return ast }
29-
default: return try eval_ast(ast, env)
30-
}
31-
32-
switch ast {
3324
case MalVal.MalList(let lst, _):
25+
if lst.count == 0 { return ast }
3426
switch lst[0] {
3527
case MalVal.MalSymbol("def!"):
3628
return try env.set(lst[1], try EVAL(lst[2], env))
@@ -51,13 +43,11 @@ func EVAL(_ ast: MalVal, _ env: Env) throws -> MalVal {
5143
}
5244
return try EVAL(lst[2], let_env)
5345
case MalVal.MalSymbol("do"):
54-
let slc = lst[lst.index(after: lst.startIndex)..<lst.endIndex]
55-
switch try eval_ast(list(Array(slc)), env) {
56-
case MalVal.MalList(let elst, _):
57-
return elst[elst.index(before: elst.endIndex)]
58-
default:
59-
throw MalError.General(msg: "Invalid do form")
46+
let slc = lst[1..<lst.index(before: lst.endIndex)]
47+
for item in slc {
48+
_ = try EVAL(item, env)
6049
}
50+
return try EVAL(lst[lst.index(before: lst.endIndex)], env)
6151
case MalVal.MalSymbol("if"):
6252
switch try EVAL(lst[1], env) {
6353
case MalVal.MalFalse, MalVal.MalNil:
@@ -75,20 +65,17 @@ func EVAL(_ ast: MalVal, _ env: Env) throws -> MalVal {
7565
exprs: list($0)))
7666
})
7767
default:
78-
switch try eval_ast(ast, env) {
79-
case MalVal.MalList(let elst, _):
80-
switch elst[0] {
81-
case MalVal.MalFunc(let fn,_,_,_,_,_):
82-
let args = Array(elst[1..<elst.count])
68+
let raw_args = lst[1..<lst.count]
69+
switch try EVAL(lst[0], env) {
70+
case MalVal.MalFunc(let fn, nil, _, _, _, _):
71+
let args = raw_args.map { try EVAL($0, env) }
8372
return try fn(args)
8473
default:
85-
throw MalError.General(msg: "Cannot apply on '\(elst[0])'")
74+
throw MalError.General(msg: "Cannot apply on '\(lst[0])'")
8675
}
87-
default: throw MalError.General(msg: "Invalid apply")
88-
}
8976
}
9077
default:
91-
throw MalError.General(msg: "Invalid apply")
78+
return ast
9279
}
9380
}
9481

impls/swift3/Sources/step5_tco/main.swift

Lines changed: 19 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -6,33 +6,25 @@ func READ(_ str: String) throws -> MalVal {
66
}
77

88
// eval
9-
func eval_ast(_ ast: MalVal, _ env: Env) throws -> MalVal {
9+
func EVAL(_ orig_ast: MalVal, _ orig_env: Env) throws -> MalVal {
10+
var ast = orig_ast, env = orig_env
11+
while true {
12+
switch try! env.find(MalVal.MalSymbol("DEBUG-EVAL")) {
13+
case MalVal.MalFalse, MalVal.MalNil:
14+
default:
15+
print("EVAL: " + PRINT(ast))
16+
}
1017
switch ast {
1118
case MalVal.MalSymbol:
1219
return try env.get(ast)
13-
case MalVal.MalList(let lst, _):
14-
return list(try lst.map { try EVAL($0, env) })
1520
case MalVal.MalVector(let lst, _):
1621
return vector(try lst.map { try EVAL($0, env) })
1722
case MalVal.MalHashMap(let dict, _):
1823
var new_dict = Dictionary<String,MalVal>()
1924
for (k,v) in dict { new_dict[k] = try EVAL(v, env) }
2025
return hash_map(new_dict)
21-
default:
22-
return ast
23-
}
24-
}
25-
26-
func EVAL(_ orig_ast: MalVal, _ orig_env: Env) throws -> MalVal {
27-
var ast = orig_ast, env = orig_env
28-
while true {
29-
switch ast {
30-
case MalVal.MalList(let lst, _): if lst.count == 0 { return ast }
31-
default: return try eval_ast(ast, env)
32-
}
33-
34-
switch ast {
3526
case MalVal.MalList(let lst, _):
27+
if lst.count == 0 { return ast }
3628
switch lst[0] {
3729
case MalVal.MalSymbol("def!"):
3830
return try env.set(lst[1], try EVAL(lst[2], env))
@@ -55,7 +47,9 @@ func EVAL(_ orig_ast: MalVal, _ orig_env: Env) throws -> MalVal {
5547
ast = lst[2] // TCO
5648
case MalVal.MalSymbol("do"):
5749
let slc = lst[1..<lst.index(before: lst.endIndex)]
58-
try _ = eval_ast(list(Array(slc)), env)
50+
for item in slc {
51+
_ = try EVAL(item, env)
52+
}
5953
ast = lst[lst.index(before: lst.endIndex)] // TCO
6054
case MalVal.MalSymbol("if"):
6155
switch try EVAL(lst[1], env) {
@@ -74,25 +68,22 @@ func EVAL(_ orig_ast: MalVal, _ orig_env: Env) throws -> MalVal {
7468
exprs: list($0)))
7569
}, ast:[lst[2]], env:env, params:[lst[1]])
7670
default:
77-
switch try eval_ast(ast, env) {
78-
case MalVal.MalList(let elst, _):
79-
switch elst[0] {
80-
case MalVal.MalFunc(let fn, nil, _, _, _, _):
81-
let args = Array(elst[1..<elst.count])
71+
let raw_args = lst[1..<lst.count]
72+
switch try EVAL(lst[0], env) {
73+
case MalVal.MalFunc(let fn, nil, _, _, _, _):
74+
let args = raw_args.map { try EVAL($0, env) }
8275
return try fn(args)
8376
case MalVal.MalFunc(_, let a, let e, let p, _, _):
84-
let args = Array(elst[1..<elst.count])
77+
let args = raw_args.map { try EVAL($0, env) }
8578
env = try Env(e, binds: p![0],
8679
exprs: list(args)) // TCO
8780
ast = a![0] // TCO
8881
default:
89-
throw MalError.General(msg: "Cannot apply on '\(elst[0])'")
82+
throw MalError.General(msg: "Cannot apply on '\(lst[0])'")
9083
}
91-
default: throw MalError.General(msg: "Invalid apply")
92-
}
9384
}
9485
default:
95-
throw MalError.General(msg: "Invalid apply")
86+
return ast
9687
}
9788
}
9889
}

impls/swift3/Sources/step6_file/main.swift

Lines changed: 19 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -6,33 +6,25 @@ func READ(_ str: String) throws -> MalVal {
66
}
77

88
// eval
9-
func eval_ast(_ ast: MalVal, _ env: Env) throws -> MalVal {
9+
func EVAL(_ orig_ast: MalVal, _ orig_env: Env) throws -> MalVal {
10+
var ast = orig_ast, env = orig_env
11+
while true {
12+
switch try! env.find(MalVal.MalSymbol("DEBUG-EVAL")) {
13+
case MalVal.MalFalse, MalVal.MalNil:
14+
default:
15+
print("EVAL: " + PRINT(ast))
16+
}
1017
switch ast {
1118
case MalVal.MalSymbol:
1219
return try env.get(ast)
13-
case MalVal.MalList(let lst, _):
14-
return list(try lst.map { try EVAL($0, env) })
1520
case MalVal.MalVector(let lst, _):
1621
return vector(try lst.map { try EVAL($0, env) })
1722
case MalVal.MalHashMap(let dict, _):
1823
var new_dict = Dictionary<String,MalVal>()
1924
for (k,v) in dict { new_dict[k] = try EVAL(v, env) }
2025
return hash_map(new_dict)
21-
default:
22-
return ast
23-
}
24-
}
25-
26-
func EVAL(_ orig_ast: MalVal, _ orig_env: Env) throws -> MalVal {
27-
var ast = orig_ast, env = orig_env
28-
while true {
29-
switch ast {
30-
case MalVal.MalList(let lst, _): if lst.count == 0 { return ast }
31-
default: return try eval_ast(ast, env)
32-
}
33-
34-
switch ast {
3526
case MalVal.MalList(let lst, _):
27+
if lst.count == 0 { return ast }
3628
switch lst[0] {
3729
case MalVal.MalSymbol("def!"):
3830
return try env.set(lst[1], try EVAL(lst[2], env))
@@ -55,7 +47,9 @@ func EVAL(_ orig_ast: MalVal, _ orig_env: Env) throws -> MalVal {
5547
ast = lst[2] // TCO
5648
case MalVal.MalSymbol("do"):
5749
let slc = lst[1..<lst.index(before: lst.endIndex)]
58-
try _ = eval_ast(list(Array(slc)), env)
50+
for item in slc {
51+
_ = try EVAL(item, env)
52+
}
5953
ast = lst[lst.index(before: lst.endIndex)] // TCO
6054
case MalVal.MalSymbol("if"):
6155
switch try EVAL(lst[1], env) {
@@ -74,25 +68,22 @@ func EVAL(_ orig_ast: MalVal, _ orig_env: Env) throws -> MalVal {
7468
exprs: list($0)))
7569
}, ast:[lst[2]], env:env, params:[lst[1]])
7670
default:
77-
switch try eval_ast(ast, env) {
78-
case MalVal.MalList(let elst, _):
79-
switch elst[0] {
80-
case MalVal.MalFunc(let fn, nil, _, _, _, _):
81-
let args = Array(elst[1..<elst.count])
71+
let raw_args = lst[1..<lst.count]
72+
switch try EVAL(lst[0], env) {
73+
case MalVal.MalFunc(let fn, nil, _, _, _, _):
74+
let args = raw_args.map { try EVAL($0, env) }
8275
return try fn(args)
8376
case MalVal.MalFunc(_, let a, let e, let p, _, _):
84-
let args = Array(elst[1..<elst.count])
77+
let args = raw_args.map { try EVAL($0, env) }
8578
env = try Env(e, binds: p![0],
8679
exprs: list(args)) // TCO
8780
ast = a![0] // TCO
8881
default:
89-
throw MalError.General(msg: "Cannot apply on '\(elst[0])'")
82+
throw MalError.General(msg: "Cannot apply on '\(lst[0])'")
9083
}
91-
default: throw MalError.General(msg: "Invalid apply")
92-
}
9384
}
9485
default:
95-
throw MalError.General(msg: "Invalid apply")
86+
return ast
9687
}
9788
}
9889
}

0 commit comments

Comments
 (0)