From fdca256d6d68fae6cb8048f6edf0c6e8c36d97b7 Mon Sep 17 00:00:00 2001 From: DualFroz Date: Wed, 26 Aug 2026 20:00:00 +0200 Subject: [PATCH] feat(cli): add repl and file runner entry point --- Sources/kite/main.swift | 67 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 Sources/kite/main.swift diff --git a/Sources/kite/main.swift b/Sources/kite/main.swift new file mode 100644 index 0000000..3a2bf66 --- /dev/null +++ b/Sources/kite/main.swift @@ -0,0 +1,67 @@ +import Foundation +import KiteCore + +func runFile(_ path: String) -> Int32 { + guard let source = try? String(contentsOfFile: path, encoding: .utf8) else { + FileHandle.standardError.write(Data("kite: cannot read file: \(path)\n".utf8)) + return 1 + } + let interp = Interpreter() + do { + try interp.evalString(source) + return 0 + } catch let error as SchemeError { + FileHandle.standardError.write(Data("error: \(error.description)\n".utf8)) + return 1 + } catch { + FileHandle.standardError.write(Data("error: \(error)\n".utf8)) + return 1 + } +} + +func runRepl() { + let interp = Interpreter() + print("kite - a Scheme interpreter. Ctrl-D to exit.") + var buffer = "" + while true { + if buffer.isEmpty { + print("kite> ", terminator: "") + } else { + print("... ", terminator: "") + } + guard let line = readLine(strippingNewline: false) else { + print("") + break + } + buffer += line + let forms: [Value] + do { + forms = try Reader(buffer).readProgram() + } catch { + continue + } + buffer = "" + for form in forms { + do { + let result = try interp.evalTop(form) + switch result { + case .unspecified: + break + default: + print(writeString(result)) + } + } catch let error as SchemeError { + print("error: \(error.description)") + } catch { + print("error: \(error)") + } + } + } +} + +let arguments = CommandLine.arguments +if arguments.count > 1 { + exit(runFile(arguments[1])) +} else { + runRepl() +}