From 7f45954d6dabff1448342beecb1788cee1c82ee2 Mon Sep 17 00:00:00 2001 From: Nicolas Boulenguez Date: Sat, 9 Nov 2024 00:31:45 +0100 Subject: [PATCH] fix --- impls/swift3/Sources/env.swift | 30 ++++--------------- impls/swift3/Sources/step2_eval/main.swift | 5 ++-- impls/swift3/Sources/step3_env/main.swift | 17 +++++++---- .../swift3/Sources/step4_if_fn_do/main.swift | 17 +++++++---- impls/swift3/Sources/step5_tco/main.swift | 17 +++++++---- impls/swift3/Sources/step6_file/main.swift | 17 +++++++---- impls/swift3/Sources/step7_quote/main.swift | 17 +++++++---- impls/swift3/Sources/step8_macros/main.swift | 17 +++++++---- impls/swift3/Sources/step9_try/main.swift | 17 +++++++---- impls/swift3/Sources/stepA_mal/main.swift | 17 +++++++---- impls/swift4/Sources/step2_eval/main.swift | 2 +- impls/swift4/Sources/step3_env/main.swift | 2 +- .../swift4/Sources/step4_if_fn_do/main.swift | 2 +- impls/swift4/Sources/step5_tco/main.swift | 2 +- impls/swift4/Sources/step6_file/main.swift | 2 +- impls/swift4/Sources/step7_quote/main.swift | 2 +- impls/swift4/Sources/step8_macros/main.swift | 2 +- impls/swift4/Sources/stepA_mal/main.swift | 2 +- 18 files changed, 104 insertions(+), 83 deletions(-) diff --git a/impls/swift3/Sources/env.swift b/impls/swift3/Sources/env.swift index f080dce800..41326b3105 100644 --- a/impls/swift3/Sources/env.swift +++ b/impls/swift3/Sources/env.swift @@ -48,31 +48,11 @@ class Env { } } - func find(_ key: MalVal) throws -> Env? { - switch key { - case MalVal.MalSymbol(let str): - if data[str] != nil { - return self - } else if outer != nil { - return try outer!.find(key) - } else { - return nil - } - default: - throw MalError.General(msg: "invalid Env.find call") - } - } - - func get(_ key: MalVal) throws -> MalVal { - switch key { - case MalVal.MalSymbol(let str): - let env = try self.find(key) - if env == nil { - throw MalError.General(msg: "'\(str)' not found") - } - return env!.data[str]! - default: - throw MalError.General(msg: "invalid Env.find call") + func get(_ str: String) -> Env? { + if let value = data[str] { + return value + } else { + return outer?.get(str) } } diff --git a/impls/swift3/Sources/step2_eval/main.swift b/impls/swift3/Sources/step2_eval/main.swift index 25aeed0109..acee857be7 100644 --- a/impls/swift3/Sources/step2_eval/main.swift +++ b/impls/swift3/Sources/step2_eval/main.swift @@ -10,10 +10,11 @@ func EVAL(_ ast: MalVal, _ env: Dictionary) throws -> MalVal { /* print("EVAL: " + PRINT(ast)) */ switch ast { case MalVal.MalSymbol(let sym): - if env[sym] == nil { + if let value = env[sym] { + return value + } else { throw MalError.General(msg: "'\(sym)' not found") } - return env[sym]! case MalVal.MalVector(let lst, _): return vector(try lst.map { try EVAL($0, env) }) case MalVal.MalHashMap(let dict, _): diff --git a/impls/swift3/Sources/step3_env/main.swift b/impls/swift3/Sources/step3_env/main.swift index 3fe6fd494d..8ee7e3be48 100644 --- a/impls/swift3/Sources/step3_env/main.swift +++ b/impls/swift3/Sources/step3_env/main.swift @@ -7,14 +7,19 @@ func READ(_ str: String) throws -> MalVal { // eval func EVAL(_ ast: MalVal, _ env: Env) throws -> MalVal { - switch try! env.find(MalVal.MalSymbol("DEBUG-EVAL")) { - case MalVal.MalFalse, MalVal.MalNil: - default: - print("EVAL: " + PRINT(ast)) + if let dbgeval = env.get("DEBUG-EVAL") { + switch dbgeval { + case MalVal.MalFalse, MalVal.MalNil: break + default: print("EVAL: " + PRINT(ast)) + } } switch ast { - case MalVal.MalSymbol: - return try env.get(ast) + case MalVal.MalSymbol(let sym): + if let value = env.get(sym) { + return value + } else { + throw MalError.General(msg: "'\(sym)' not found") + } case MalVal.MalVector(let lst, _): return vector(try lst.map { try EVAL($0, env) }) case MalVal.MalHashMap(let dict, _): diff --git a/impls/swift3/Sources/step4_if_fn_do/main.swift b/impls/swift3/Sources/step4_if_fn_do/main.swift index df59ee3c25..19410ac311 100644 --- a/impls/swift3/Sources/step4_if_fn_do/main.swift +++ b/impls/swift3/Sources/step4_if_fn_do/main.swift @@ -7,14 +7,19 @@ func READ(_ str: String) throws -> MalVal { // eval func EVAL(_ ast: MalVal, _ env: Env) throws -> MalVal { - switch try! env.find(MalVal.MalSymbol("DEBUG-EVAL")) { - case MalVal.MalFalse, MalVal.MalNil: - default: - print("EVAL: " + PRINT(ast)) + if let dbgeval = env.get("DEBUG-EVAL") { + switch dbgeval { + case MalVal.MalFalse, MalVal.MalNil: break + default: print("EVAL: " + PRINT(ast)) + } } switch ast { - case MalVal.MalSymbol: - return try env.get(ast) + case MalVal.MalSymbol(let sym): + if let value = env.get(sym) { + return value + } else { + throw MalError.General(msg: "'\(sym)' not found") + } case MalVal.MalVector(let lst, _): return vector(try lst.map { try EVAL($0, env) }) case MalVal.MalHashMap(let dict, _): diff --git a/impls/swift3/Sources/step5_tco/main.swift b/impls/swift3/Sources/step5_tco/main.swift index 7575b5751d..80dce52e46 100644 --- a/impls/swift3/Sources/step5_tco/main.swift +++ b/impls/swift3/Sources/step5_tco/main.swift @@ -9,14 +9,19 @@ func READ(_ str: String) throws -> MalVal { func EVAL(_ orig_ast: MalVal, _ orig_env: Env) throws -> MalVal { var ast = orig_ast, env = orig_env while true { - switch try! env.find(MalVal.MalSymbol("DEBUG-EVAL")) { - case MalVal.MalFalse, MalVal.MalNil: - default: - print("EVAL: " + PRINT(ast)) + if let dbgeval = env.get("DEBUG-EVAL") { + switch dbgeval { + case MalVal.MalFalse, MalVal.MalNil: break + default: print("EVAL: " + PRINT(ast)) + } } switch ast { - case MalVal.MalSymbol: - return try env.get(ast) + case MalVal.MalSymbol(let sym): + if let value = env.get(sym) { + return value + } else { + throw MalError.General(msg: "'\(sym)' not found") + } case MalVal.MalVector(let lst, _): return vector(try lst.map { try EVAL($0, env) }) case MalVal.MalHashMap(let dict, _): diff --git a/impls/swift3/Sources/step6_file/main.swift b/impls/swift3/Sources/step6_file/main.swift index 2050c678bc..4724e13518 100644 --- a/impls/swift3/Sources/step6_file/main.swift +++ b/impls/swift3/Sources/step6_file/main.swift @@ -9,14 +9,19 @@ func READ(_ str: String) throws -> MalVal { func EVAL(_ orig_ast: MalVal, _ orig_env: Env) throws -> MalVal { var ast = orig_ast, env = orig_env while true { - switch try! env.find(MalVal.MalSymbol("DEBUG-EVAL")) { - case MalVal.MalFalse, MalVal.MalNil: - default: - print("EVAL: " + PRINT(ast)) + if let dbgeval = env.get("DEBUG-EVAL") { + switch dbgeval { + case MalVal.MalFalse, MalVal.MalNil: break + default: print("EVAL: " + PRINT(ast)) + } } switch ast { - case MalVal.MalSymbol: - return try env.get(ast) + case MalVal.MalSymbol(let sym): + if let value = env.get(sym) { + return value + } else { + throw MalError.General(msg: "'\(sym)' not found") + } case MalVal.MalVector(let lst, _): return vector(try lst.map { try EVAL($0, env) }) case MalVal.MalHashMap(let dict, _): diff --git a/impls/swift3/Sources/step7_quote/main.swift b/impls/swift3/Sources/step7_quote/main.swift index f774acbdbb..057ea500f5 100644 --- a/impls/swift3/Sources/step7_quote/main.swift +++ b/impls/swift3/Sources/step7_quote/main.swift @@ -54,14 +54,19 @@ func quasiquote(_ ast: MalVal) -> MalVal { func EVAL(_ orig_ast: MalVal, _ orig_env: Env) throws -> MalVal { var ast = orig_ast, env = orig_env while true { - switch try! env.find(MalVal.MalSymbol("DEBUG-EVAL")) { - case MalVal.MalFalse, MalVal.MalNil: - default: - print("EVAL: " + PRINT(ast)) + if let dbgeval = env.get("DEBUG-EVAL") { + switch dbgeval { + case MalVal.MalFalse, MalVal.MalNil: break + default: print("EVAL: " + PRINT(ast)) + } } switch ast { - case MalVal.MalSymbol: - return try env.get(ast) + case MalVal.MalSymbol(let sym): + if let value = env.get(sym) { + return value + } else { + throw MalError.General(msg: "'\(sym)' not found") + } case MalVal.MalVector(let lst, _): return vector(try lst.map { try EVAL($0, env) }) case MalVal.MalHashMap(let dict, _): diff --git a/impls/swift3/Sources/step8_macros/main.swift b/impls/swift3/Sources/step8_macros/main.swift index d184c098de..0255bd61d7 100644 --- a/impls/swift3/Sources/step8_macros/main.swift +++ b/impls/swift3/Sources/step8_macros/main.swift @@ -54,14 +54,19 @@ func quasiquote(_ ast: MalVal) -> MalVal { func EVAL(_ orig_ast: MalVal, _ orig_env: Env) throws -> MalVal { var ast = orig_ast, env = orig_env while true { - switch try! env.find(MalVal.MalSymbol("DEBUG-EVAL")) { - case MalVal.MalFalse, MalVal.MalNil: - default: - print("EVAL: " + PRINT(ast)) + if let dbgeval = env.get("DEBUG-EVAL") { + switch dbgeval { + case MalVal.MalFalse, MalVal.MalNil: break + default: print("EVAL: " + PRINT(ast)) + } } switch ast { - case MalVal.MalSymbol: - return try env.get(ast) + case MalVal.MalSymbol(let sym): + if let value = env.get(sym) { + return value + } else { + throw MalError.General(msg: "'\(sym)' not found") + } case MalVal.MalVector(let lst, _): return vector(try lst.map { try EVAL($0, env) }) case MalVal.MalHashMap(let dict, _): diff --git a/impls/swift3/Sources/step9_try/main.swift b/impls/swift3/Sources/step9_try/main.swift index 937dbbae0b..b1138efba9 100644 --- a/impls/swift3/Sources/step9_try/main.swift +++ b/impls/swift3/Sources/step9_try/main.swift @@ -54,14 +54,19 @@ func quasiquote(_ ast: MalVal) -> MalVal { func EVAL(_ orig_ast: MalVal, _ orig_env: Env) throws -> MalVal { var ast = orig_ast, env = orig_env while true { - switch try! env.find(MalVal.MalSymbol("DEBUG-EVAL")) { - case MalVal.MalFalse, MalVal.MalNil: - default: - print("EVAL: " + PRINT(ast)) + if let dbgeval = env.get("DEBUG-EVAL") { + switch dbgeval { + case MalVal.MalFalse, MalVal.MalNil: break + default: print("EVAL: " + PRINT(ast)) + } } switch ast { - case MalVal.MalSymbol: - return try env.get(ast) + case MalVal.MalSymbol(let sym): + if let value = env.get(sym) { + return value + } else { + throw MalError.General(msg: "'\(sym)' not found") + } case MalVal.MalVector(let lst, _): return vector(try lst.map { try EVAL($0, env) }) case MalVal.MalHashMap(let dict, _): diff --git a/impls/swift3/Sources/stepA_mal/main.swift b/impls/swift3/Sources/stepA_mal/main.swift index e215def75f..e9c6f63454 100644 --- a/impls/swift3/Sources/stepA_mal/main.swift +++ b/impls/swift3/Sources/stepA_mal/main.swift @@ -54,14 +54,19 @@ func quasiquote(_ ast: MalVal) -> MalVal { func EVAL(_ orig_ast: MalVal, _ orig_env: Env) throws -> MalVal { var ast = orig_ast, env = orig_env while true { - switch try! env.find(MalVal.MalSymbol("DEBUG-EVAL")) { - case MalVal.MalFalse, MalVal.MalNil: - default: - print("EVAL: " + PRINT(ast)) + if let dbgeval = env.get("DEBUG-EVAL") { + switch dbgeval { + case MalVal.MalFalse, MalVal.MalNil: break + default: print("EVAL: " + PRINT(ast)) + } } switch ast { - case MalVal.MalSymbol: - return try env.get(ast) + case MalVal.MalSymbol(let sym): + if let value = env.get(sym) { + return value + } else { + throw MalError.General(msg: "'\(sym)' not found") + } case MalVal.MalVector(let lst, _): return vector(try lst.map { try EVAL($0, env) }) case MalVal.MalHashMap(let dict, _): diff --git a/impls/swift4/Sources/step2_eval/main.swift b/impls/swift4/Sources/step2_eval/main.swift index 6f56e2f105..a5174cac58 100644 --- a/impls/swift4/Sources/step2_eval/main.swift +++ b/impls/swift4/Sources/step2_eval/main.swift @@ -15,7 +15,7 @@ func EVAL(_ ast: MalData, env: [String: MalData]) throws -> MalData { throw MalError.SymbolNotFound(list[0] as? Symbol ?? Symbol("Symbol")) } let raw_args = list.dropFirst() - let args = raw_args.map { try EVAL($0, env: env) } + let args = try raw_args.map { try EVAL($0, env: env) } return try function.fn(args) case .Vector: let vector = ast as! ContiguousArray diff --git a/impls/swift4/Sources/step3_env/main.swift b/impls/swift4/Sources/step3_env/main.swift index 53287ac66b..44945cdaee 100644 --- a/impls/swift4/Sources/step3_env/main.swift +++ b/impls/swift4/Sources/step3_env/main.swift @@ -39,7 +39,7 @@ func EVAL(_ ast: MalData, env: Env) throws -> MalData { throw MalError.SymbolNotFound(list[0] as? Symbol ?? Symbol("Symbol")) } let raw_args = list.dropFirst() - let args = raw_args.map { try EVAL($0, env: env) } + let args = try raw_args.map { try EVAL($0, env: env) } return try function.fn(args) case .Vector: let vector = ast as! ContiguousArray diff --git a/impls/swift4/Sources/step4_if_fn_do/main.swift b/impls/swift4/Sources/step4_if_fn_do/main.swift index a3c2c7a533..0c3f809aa9 100644 --- a/impls/swift4/Sources/step4_if_fn_do/main.swift +++ b/impls/swift4/Sources/step4_if_fn_do/main.swift @@ -54,7 +54,7 @@ func EVAL(_ ast: MalData, env: Env) throws -> MalData { throw MalError.SymbolNotFound(list[0] as? Symbol ?? Symbol("Symbol")) } let raw_args = list.dropFirst() - let args = raw_args.map { try EVAL($0, env: env) } + let args = try raw_args.map { try EVAL($0, env: env) } return try function.fn(args) case .Vector: let vector = ast as! ContiguousArray diff --git a/impls/swift4/Sources/step5_tco/main.swift b/impls/swift4/Sources/step5_tco/main.swift index 59ea7fe205..f42ffa53ba 100644 --- a/impls/swift4/Sources/step5_tco/main.swift +++ b/impls/swift4/Sources/step5_tco/main.swift @@ -62,7 +62,7 @@ func EVAL(_ anAst: MalData, env anEnv: Env) throws -> MalData { throw MalError.SymbolNotFound(list[0] as? Symbol ?? Symbol("Symbol")) } let raw_args = list.dropFirst() - let args = raw_args.map { try EVAL($0, env: env) } + let args = try raw_args.map { try EVAL($0, env: env) } if let fnAst = function.ast { // a full fn ast = fnAst env = Env(binds: function.params!, exprs: args, outer: function.env!) diff --git a/impls/swift4/Sources/step6_file/main.swift b/impls/swift4/Sources/step6_file/main.swift index 2fdc4ab2ea..c9b636fc4d 100644 --- a/impls/swift4/Sources/step6_file/main.swift +++ b/impls/swift4/Sources/step6_file/main.swift @@ -62,7 +62,7 @@ func EVAL(_ anAst: MalData, env anEnv: Env) throws -> MalData { throw MalError.SymbolNotFound(list[0] as? Symbol ?? Symbol("Symbol")) } let raw_args = list.dropFirst() - let args = raw_args.map { try EVAL($0, env: env) } + let args = try raw_args.map { try EVAL($0, env: env) } if let fnAst = function.ast { // a full fn ast = fnAst env = Env(binds: function.params!, exprs: args, outer: function.env!) diff --git a/impls/swift4/Sources/step7_quote/main.swift b/impls/swift4/Sources/step7_quote/main.swift index a272101a12..2a926b04a1 100644 --- a/impls/swift4/Sources/step7_quote/main.swift +++ b/impls/swift4/Sources/step7_quote/main.swift @@ -108,7 +108,7 @@ func EVAL(_ anAst: MalData, env anEnv: Env) throws -> MalData { throw MalError.SymbolNotFound(list[0] as? Symbol ?? Symbol("Symbol")) } let raw_args = list.dropFirst() - let args = raw_args.map { try EVAL($0, env: env) } + let args = try raw_args.map { try EVAL($0, env: env) } if let fnAst = function.ast { // a full fn ast = fnAst env = Env(binds: function.params!, exprs: args, outer: function.env!) diff --git a/impls/swift4/Sources/step8_macros/main.swift b/impls/swift4/Sources/step8_macros/main.swift index 45dc96430e..6dfc3c8774 100644 --- a/impls/swift4/Sources/step8_macros/main.swift +++ b/impls/swift4/Sources/step8_macros/main.swift @@ -117,7 +117,7 @@ func EVAL(_ anAst: MalData, env anEnv: Env) throws -> MalData { ast = function.fn(raw_args) continue } - let args = raw_args.map { try EVAL($0, env: env) } + let args = try raw_args.map { try EVAL($0, env: env) } if let fnAst = function.ast { // a full fn ast = fnAst env = Env(binds: function.params!, exprs: args, outer: function.env!) diff --git a/impls/swift4/Sources/stepA_mal/main.swift b/impls/swift4/Sources/stepA_mal/main.swift index 4aa129a891..42310a39a2 100644 --- a/impls/swift4/Sources/stepA_mal/main.swift +++ b/impls/swift4/Sources/stepA_mal/main.swift @@ -129,7 +129,7 @@ func EVAL(_ anAst: MalData, env anEnv: Env) throws -> MalData { ast = function.fn(raw_args) continue } - let args = raw_args.map { try EVAL($0, env: env) } + let args = try raw_args.map { try EVAL($0, env: env) } if let fnAst = function.ast { // a full fn ast = fnAst env = Env(binds: function.params!, exprs: args, outer: function.env!)