import Darwin
#endif
-func IntOp(op: (Int, Int) -> Int, _ a: MalVal, _ b: MalVal) throws -> MalVal {
+func IntOp(_ op: (Int, Int) -> Int, _ a: MalVal, _ b: MalVal) throws -> MalVal {
switch (a, b) {
case (MV.MalInt(let i1), MV.MalInt(let i2)):
return MV.MalInt(op(i1, i2))
}
}
-func CmpOp(op: (Int, Int) -> Bool, _ a: MalVal, _ b: MalVal) throws -> MalVal {
+func CmpOp(_ op: (Int, Int) -> Bool, _ a: MalVal, _ b: MalVal) throws -> MalVal {
switch (a, b) {
case (MV.MalInt(let i1), MV.MalInt(let i2)):
return wraptf(op(i1, i2))
// let core_ns: [String: (Array<MalVal>) throws -> MalVal] = [
// ^
- let s = $0.map { pr_str($0,true) }.joinWithSeparator(" ")
+ let s = $0.map { pr_str($0,true) }.joined(separator: " ")
return MV.MalString(s)
},
"str": {
// The comment for "pr-str" applies here, too.
- let s = $0.map { pr_str($0,false) }.joinWithSeparator("")
+ let s = $0.map { pr_str($0,false) }.joined(separator: "")
return MV.MalString(s)
},
"prn": {
- print($0.map { pr_str($0,true) }.joinWithSeparator(" "))
+ print($0.map { pr_str($0,true) }.joined(separator: " "))
return MV.MalNil
},
"println": {
- print($0.map { pr_str($0,false) }.joinWithSeparator(" "))
+ print($0.map { pr_str($0,false) }.joined(separator: " "))
return MV.MalNil
},
"read-string": {
switch $0[0] {
case MV.MalString(let prompt):
print(prompt, terminator: "")
- let line = readLine(stripNewline: true)
+ let line = readLine(strippingNewline: true)
if line == nil { return MV.MalNil }
return MV.MalString(line!)
default: throw MalError.General(msg: "Invalid readline call")
"slurp": {
switch $0[0] {
case MV.MalString(let file):
- // TODO: replace with this when it is available
- // let data = try String(contentsOfFile: file, encoding: NSUTF8StringEncoding)
-
- let BUFSIZE = 1024
- var pp = popen("cat " + file, "r")
- var buf = [CChar](count:BUFSIZE, repeatedValue:CChar(0))
- var data = String()
-
- while fgets(&buf, Int32(BUFSIZE), pp) != nil {
- data = data + String.fromCString(buf)!;
- }
+ let data = try String(contentsOfFile: file, encoding: String.Encoding.utf8)
return MV.MalString(data)
default: throw MalError.General(msg: "Invalid slurp call")
}
"*": { try IntOp({ $0 * $1}, $0[0], $0[1]) },
"/": { try IntOp({ $0 / $1}, $0[0], $0[1]) },
"time-ms": {
- $0; // no parameters
+ let read = $0; // no parameters
// TODO: replace with something more like this
// return MV.MalInt(NSDate().timeIntervalSince1970 )
if $0.count < 1 { throw MalError.General(msg: "Invalid conj call") }
switch $0[0] {
case MV.MalList(let lst, _):
- let a = Array($0[1..<$0.endIndex]).reverse()
+ let a = Array($0[1..<$0.endIndex]).reversed()
return list(a + lst)
case MV.MalVector(let lst, _):
return vector(lst + $0[1..<$0.endIndex])
let b = bs[pos]
switch b {
case MalVal.MalSymbol("&"):
- switch bs[pos.successor()] {
+ switch bs[bs.index(after: pos)] {
case MalVal.MalSymbol(let sym):
if pos < es.endIndex {
let slc = es[pos..<es.endIndex]
default:
throw MalError.General(msg: "Env binds has non-symbol")
}
- pos = pos.successor()
+ pos = bs.index(after: pos)
}
}
}
- func find(key: MalVal) throws -> Env? {
+ func find(_ key: MalVal) throws -> Env? {
switch key {
case MalVal.MalSymbol(let str):
if data[str] != nil {
}
}
- func get(key: MalVal) throws -> MalVal {
+ func get(_ key: MalVal) throws -> MalVal {
switch key {
case MalVal.MalSymbol(let str):
let env = try self.find(key)
}
}
- func set(key: MalVal, _ val: MalVal) throws -> MalVal {
+ func set(_ key: MalVal, _ val: MalVal) throws -> MalVal {
switch key {
case MalVal.MalSymbol(let str):
data[str] = val
-func pr_str(obj: MalVal, _ print_readably: Bool = true) -> String {
+func pr_str(_ obj: MalVal, _ print_readably: Bool = true) -> String {
switch obj {
case MalVal.MalList(let lst, _):
let elems = lst.map { pr_str($0, print_readably) }
- return "(" + elems.joinWithSeparator(" ") + ")"
+ return "(" + elems.joined(separator: " ") + ")"
case MalVal.MalVector(let lst, _):
let elems = lst.map { pr_str($0, print_readably) }
- return "[" + elems.joinWithSeparator(" ") + "]"
+ return "[" + elems.joined(separator: " ") + "]"
case MalVal.MalHashMap(let dict, _):
let elems = dict.map {
pr_str(MalVal.MalString($0), print_readably) +
" " + pr_str($1, print_readably)
}
- return "{" + elems.joinWithSeparator(" ") + "}"
+ return "{" + elems.joined(separator: " ") + "}"
case MalVal.MalString(let str):
//print("kw: '\(str[str.startIndex])'")
if str.characters.count > 0 && str[str.startIndex] == "\u{029e}" {
- return ":" + str[str.startIndex.successor()..<str.endIndex]
+ return ":" + str[str.index(after: str.startIndex)..<str.endIndex]
} else if print_readably {
- let s1 = str.stringByReplacingOccurrencesOfString(
- "\\", withString: "\\\\")
- let s2 = s1.stringByReplacingOccurrencesOfString(
- "\"", withString: "\\\"")
- let s3 = s2.stringByReplacingOccurrencesOfString(
- "\n", withString: "\\n")
+ let s1 = str.replacingOccurrences(of: "\\", with: "\\\\")
+ let s2 = s1.replacingOccurrences(of: "\"", with: "\\\"")
+ let s3 = s2.replacingOccurrences(of: "\n", with: "\\n")
return "\"" + s3 + "\""
} else {
return str
self.str = str
pos = str.startIndex
}
- func next() { pos = pos.successor() }
+ func next() { pos = str.index(after: pos) }
}
-func read_int(rdr: Reader) -> MalVal {
+func read_int(_ rdr: Reader) -> MalVal {
let start = rdr.pos
- for cidx in rdr.pos..<rdr.str.endIndex {
- rdr.pos = cidx
+ var cidx = rdr.pos
+ while cidx < rdr.str.endIndex {
if !int_char.contains(rdr.str[cidx]) { break }
- rdr.pos = cidx.successor()
+ cidx = rdr.str.index(after: cidx)
+ rdr.pos = cidx
}
- let matchStr = rdr.str.substringWithRange(start..<rdr.pos)
+ let matchStr = rdr.str.substring(with: start..<rdr.pos)
if matchStr == "-" {
return MalVal.MalSymbol("-")
} else {
}
}
-func skip_whitespace_and_comments(rdr: Reader) {
+func skip_whitespace_and_comments(_ rdr: Reader) {
var in_comment = false
- for cidx in rdr.pos..<rdr.str.endIndex {
+ var cidx = rdr.pos
+ while cidx < rdr.str.endIndex {
rdr.pos = cidx
if in_comment {
if rdr.str[rdr.pos] == "\n" {
} else {
if !whitespace.contains(rdr.str[rdr.pos]) { break }
}
+ cidx = rdr.str.index(after: cidx)
}
}
-func read_string(rdr: Reader) throws -> MalVal {
+func read_string(_ rdr: Reader) throws -> MalVal {
let start = rdr.pos
var escaped = false
if rdr.str[rdr.pos] != "\"" {
throw MalError.Reader(msg: "read_string call on non-string")
}
- for cidx in rdr.pos.successor()..<rdr.str.endIndex {
- rdr.pos = cidx.successor()
+ var cidx = rdr.str.index(after: rdr.pos)
+ while cidx < rdr.str.endIndex {
+ rdr.pos = rdr.str.index(after: cidx)
if escaped {
escaped = false
+ cidx = rdr.pos
continue
}
if rdr.str[cidx] == "\\" { escaped = true }
if rdr.str[cidx] == "\"" { break }
+ cidx = rdr.pos
}
if rdr.pos > rdr.str.endIndex {
throw MalError.Reader(msg: "Expected '\"', got EOF")
}
- let matchStr = rdr.str.substringWithRange(
- start.successor()..<rdr.pos.predecessor())
- let s1 = matchStr.stringByReplacingOccurrencesOfString(
- "\\\"", withString: "\"")
- let s2 = s1.stringByReplacingOccurrencesOfString(
- "\\n", withString: "\n")
- let s3 = s2.stringByReplacingOccurrencesOfString(
- "\\\\", withString: "\\")
+ let matchStr = rdr.str.substring(with:
+ rdr.str.index(after: start)..<rdr.str.index(before: rdr.pos))
+ let s1 = matchStr.replacingOccurrences(of: "\\\"", with: "\"")
+ let s2 = s1.replacingOccurrences(of: "\\n", with: "\n")
+ let s3 = s2.replacingOccurrences(of: "\\\\", with: "\\")
return MalVal.MalString(s3)
}
-func read_token(rdr: Reader) -> String {
+func read_token(_ rdr: Reader) -> String {
let start = rdr.pos
- for cidx in rdr.pos..<rdr.str.endIndex {
+ var cidx = rdr.pos
+ while cidx < rdr.str.endIndex {
rdr.pos = cidx
if token_delim.contains(rdr.str[cidx]) { break }
- rdr.pos = cidx.successor()
+ cidx = rdr.str.index(after: cidx)
+ rdr.pos = cidx
}
- return rdr.str.substringWithRange(start..<rdr.pos)
+ return rdr.str.substring(with: start..<rdr.pos)
}
-func read_symbol(rdr: Reader) throws -> MalVal {
+func read_symbol(_ rdr: Reader) throws -> MalVal {
let tok = read_token(rdr)
switch tok {
case "nil": return MalVal.MalNil
}
}
-func read_atom(rdr: Reader) throws -> MalVal {
+func read_atom(_ rdr: Reader) throws -> MalVal {
if rdr.str.characters.count == 0 {
throw MalError.Reader(msg: "Empty string passed to read_atom")
}
switch rdr.str[rdr.pos] {
- case "-" where !int_char.contains(rdr.str[rdr.pos.successor()]):
+ case "-" where !int_char.contains(rdr.str[rdr.str.index(after: rdr.pos)]):
return try read_symbol(rdr)
case let c where int_char.contains(c):
return read_int(rdr)
}
}
-func read_list(rdr: Reader, start: Character = "(", end: Character = ")") throws -> Array<MalVal> {
+func read_list(_ rdr: Reader, start: Character = "(", end: Character = ")") throws -> Array<MalVal> {
if rdr.str[rdr.pos] != start {
throw MalError.Reader(msg: "expected '\(start)'")
}
return lst
}
-func read_form(rdr: Reader) throws -> MalVal {
+func read_form(_ rdr: Reader) throws -> MalVal {
if rdr.str.characters.count == 0 {
throw MalError.Reader(msg: "Empty string passed to read_form")
}
rdr.next()
return list([MalVal.MalSymbol("quasiquote"), try read_form(rdr)])
case "~":
- switch rdr.str[rdr.pos.successor()] {
+ switch rdr.str[rdr.str.index(after: rdr.pos)] {
case "@":
rdr.next()
rdr.next()
return res
}
-func read_str(str: String) throws -> MalVal {
+func read_str(_ str: String) throws -> MalVal {
return try read_form(Reader(str))
}
while true {
print("user> ", terminator: "")
- let line = readLine(stripNewline: true)
+ let line = readLine(strippingNewline: true)
if line == nil { break }
if line == "" { continue }
import Foundation
// read
-func READ(str: String) throws -> MalVal {
+func READ(_ str: String) throws -> MalVal {
return try read_str(str)
}
// eval
-func EVAL(ast: MalVal, _ env: String) throws -> MalVal {
+func EVAL(_ ast: MalVal, _ env: String) throws -> MalVal {
return ast
}
// print
-func PRINT(exp: MalVal) -> String {
+func PRINT(_ exp: MalVal) -> String {
return pr_str(exp, true)
}
// repl
-func rep(str:String) throws -> String {
+func rep(_ str:String) throws -> String {
return PRINT(try EVAL(try READ(str), ""))
}
while true {
print("user> ", terminator: "")
- let line = readLine(stripNewline: true)
+ let line = readLine(strippingNewline: true)
if line == nil { break }
if line == "" { continue }
import Foundation
// read
-func READ(str: String) throws -> MalVal {
+func READ(_ str: String) throws -> MalVal {
return try read_str(str)
}
// eval
-func eval_ast(ast: MalVal, _ env: Dictionary<String, MalVal>) throws -> MalVal {
+func eval_ast(_ ast: MalVal, _ env: Dictionary<String, MalVal>) throws -> MalVal {
switch ast {
case MalVal.MalSymbol(let sym):
if env[sym] == nil {
}
}
-func EVAL(ast: MalVal, _ env: Dictionary<String, MalVal>) throws -> MalVal {
+func EVAL(_ ast: MalVal, _ env: Dictionary<String, MalVal>) throws -> MalVal {
switch ast {
case MalVal.MalList(let lst, _): if lst.count == 0 { return ast }
default: return try eval_ast(ast, env)
}
// print
-func PRINT(exp: MalVal) -> String {
+func PRINT(_ exp: MalVal) -> String {
return pr_str(exp, true)
}
// repl
-func rep(str:String) throws -> String {
+func rep(_ str:String) throws -> String {
return PRINT(try EVAL(try READ(str), repl_env))
}
-func IntOp(op: (Int, Int) -> Int, _ a: MalVal, _ b: MalVal) throws -> MalVal {
+func IntOp(_ op: (Int, Int) -> Int, _ a: MalVal, _ b: MalVal) throws -> MalVal {
switch (a, b) {
case (MalVal.MalInt(let i1), MalVal.MalInt(let i2)):
return MalVal.MalInt(op(i1, i2))
while true {
print("user> ", terminator: "")
- let line = readLine(stripNewline: true)
+ let line = readLine(strippingNewline: true)
if line == nil { break }
if line == "" { continue }
import Foundation
// read
-func READ(str: String) throws -> MalVal {
+func READ(_ str: String) throws -> MalVal {
return try read_str(str)
}
// eval
-func eval_ast(ast: MalVal, _ env: Env) throws -> MalVal {
+func eval_ast(_ ast: MalVal, _ env: Env) throws -> MalVal {
switch ast {
case MalVal.MalSymbol:
return try env.get(ast)
}
}
-func EVAL(ast: MalVal, _ env: Env) throws -> MalVal {
+func EVAL(_ ast: MalVal, _ env: Env) throws -> MalVal {
switch ast {
case MalVal.MalList(let lst, _): if lst.count == 0 { return ast }
default: return try eval_ast(ast, env)
}
var idx = binds.startIndex
while idx < binds.endIndex {
- let v = try EVAL(binds[idx.successor()], let_env)
+ let v = try EVAL(binds[binds.index(after: idx)], let_env)
try let_env.set(binds[idx], v)
- idx = idx.successor().successor()
+ idx = binds.index(idx, offsetBy: 2)
}
return try EVAL(lst[2], let_env)
default:
}
// print
-func PRINT(exp: MalVal) -> String {
+func PRINT(_ exp: MalVal) -> String {
return pr_str(exp, true)
}
// repl
-func rep(str:String) throws -> String {
+func rep(_ str:String) throws -> String {
return PRINT(try EVAL(try READ(str), repl_env))
}
-func IntOp(op: (Int, Int) -> Int, _ a: MalVal, _ b: MalVal) throws -> MalVal {
+func IntOp(_ op: (Int, Int) -> Int, _ a: MalVal, _ b: MalVal) throws -> MalVal {
switch (a, b) {
case (MalVal.MalInt(let i1), MalVal.MalInt(let i2)):
return MalVal.MalInt(op(i1, i2))
while true {
print("user> ", terminator: "")
- let line = readLine(stripNewline: true)
+ let line = readLine(strippingNewline: true)
if line == nil { break }
if line == "" { continue }
import Foundation
// read
-func READ(str: String) throws -> MalVal {
+func READ(_ str: String) throws -> MalVal {
return try read_str(str)
}
// eval
-func eval_ast(ast: MalVal, _ env: Env) throws -> MalVal {
+func eval_ast(_ ast: MalVal, _ env: Env) throws -> MalVal {
switch ast {
case MalVal.MalSymbol:
return try env.get(ast)
}
}
-func EVAL(ast: MalVal, _ env: Env) throws -> MalVal {
+func EVAL(_ ast: MalVal, _ env: Env) throws -> MalVal {
switch ast {
case MalVal.MalList(let lst, _): if lst.count == 0 { return ast }
default: return try eval_ast(ast, env)
}
var idx = binds.startIndex
while idx < binds.endIndex {
- let v = try EVAL(binds[idx.successor()], let_env)
+ let v = try EVAL(binds[binds.index(after: idx)], let_env)
try let_env.set(binds[idx], v)
- idx = idx.successor().successor()
+ idx = binds.index(idx, offsetBy: 2)
}
return try EVAL(lst[2], let_env)
case MalVal.MalSymbol("do"):
- let slc = lst[lst.startIndex.successor()..<lst.endIndex]
+ let slc = lst[lst.index(after: lst.startIndex)..<lst.endIndex]
switch try eval_ast(list(Array(slc)), env) {
case MalVal.MalList(let elst, _):
- return elst[elst.endIndex.predecessor()]
+ return elst[elst.index(before: elst.endIndex)]
default:
throw MalError.General(msg: "Invalid do form")
}
}
// print
-func PRINT(exp: MalVal) -> String {
+func PRINT(_ exp: MalVal) -> String {
return pr_str(exp, true)
}
// repl
-func rep(str:String) throws -> String {
+func rep(_ str:String) throws -> String {
return PRINT(try EVAL(try READ(str), repl_env))
}
while true {
print("user> ", terminator: "")
- let line = readLine(stripNewline: true)
+ let line = readLine(strippingNewline: true)
if line == nil { break }
if line == "" { continue }
import Foundation
// read
-func READ(str: String) throws -> MalVal {
+func READ(_ str: String) throws -> MalVal {
return try read_str(str)
}
// eval
-func eval_ast(ast: MalVal, _ env: Env) throws -> MalVal {
+func eval_ast(_ ast: MalVal, _ env: Env) throws -> MalVal {
switch ast {
case MalVal.MalSymbol:
return try env.get(ast)
}
}
-func EVAL(orig_ast: MalVal, _ orig_env: Env) throws -> MalVal {
+func EVAL(_ orig_ast: MalVal, _ orig_env: Env) throws -> MalVal {
var ast = orig_ast, env = orig_env
while true {
switch ast {
}
var idx = binds.startIndex
while idx < binds.endIndex {
- let v = try EVAL(binds[idx.successor()], let_env)
+ let v = try EVAL(binds[binds.index(after: idx)], let_env)
try let_env.set(binds[idx], v)
- idx = idx.successor().successor()
+ idx = binds.index(idx, offsetBy: 2)
}
env = let_env
ast = lst[2] // TCO
case MalVal.MalSymbol("do"):
- let slc = lst[1..<lst.endIndex.predecessor()]
+ let slc = lst[1..<lst.index(before: lst.endIndex)]
try eval_ast(list(Array(slc)), env)
- ast = lst[lst.endIndex.predecessor()] // TCO
+ ast = lst[lst.index(before: lst.endIndex)] // TCO
case MalVal.MalSymbol("if"):
switch try EVAL(lst[1], env) {
case MalVal.MalFalse, MalVal.MalNil:
}
// print
-func PRINT(exp: MalVal) -> String {
+func PRINT(_ exp: MalVal) -> String {
return pr_str(exp, true)
}
// repl
-func rep(str:String) throws -> String {
+func rep(_ str:String) throws -> String {
return PRINT(try EVAL(try READ(str), repl_env))
}
while true {
print("user> ", terminator: "")
- let line = readLine(stripNewline: true)
+ let line = readLine(strippingNewline: true)
if line == nil { break }
if line == "" { continue }
import Foundation
// read
-func READ(str: String) throws -> MalVal {
+func READ(_ str: String) throws -> MalVal {
return try read_str(str)
}
// eval
-func eval_ast(ast: MalVal, _ env: Env) throws -> MalVal {
+func eval_ast(_ ast: MalVal, _ env: Env) throws -> MalVal {
switch ast {
case MalVal.MalSymbol:
return try env.get(ast)
}
}
-func EVAL(orig_ast: MalVal, _ orig_env: Env) throws -> MalVal {
+func EVAL(_ orig_ast: MalVal, _ orig_env: Env) throws -> MalVal {
var ast = orig_ast, env = orig_env
while true {
switch ast {
}
var idx = binds.startIndex
while idx < binds.endIndex {
- let v = try EVAL(binds[idx.successor()], let_env)
+ let v = try EVAL(binds[binds.index(after: idx)], let_env)
try let_env.set(binds[idx], v)
- idx = idx.successor().successor()
+ idx = binds.index(idx, offsetBy: 2)
}
env = let_env
ast = lst[2] // TCO
case MalVal.MalSymbol("do"):
- let slc = lst[1..<lst.endIndex.predecessor()]
+ let slc = lst[1..<lst.index(before: lst.endIndex)]
try eval_ast(list(Array(slc)), env)
- ast = lst[lst.endIndex.predecessor()] // TCO
+ ast = lst[lst.index(before: lst.endIndex)] // TCO
case MalVal.MalSymbol("if"):
switch try EVAL(lst[1], env) {
case MalVal.MalFalse, MalVal.MalNil:
}
// print
-func PRINT(exp: MalVal) -> String {
+func PRINT(_ exp: MalVal) -> String {
return pr_str(exp, true)
}
// repl
-func rep(str:String) throws -> String {
+func rep(_ str:String) throws -> String {
return PRINT(try EVAL(try READ(str), repl_env))
}
let pargs = Process.arguments.map { MalVal.MalString($0) }
// TODO: weird way to get empty list, fix this
var args = pargs[pargs.startIndex..<pargs.startIndex]
-if pargs.startIndex.advancedBy(2) < pargs.endIndex {
- args = pargs[pargs.startIndex.advancedBy(2)..<pargs.endIndex]
+if pargs.index(pargs.startIndex, offsetBy:2) < pargs.endIndex {
+ args = pargs[pargs.index(pargs.startIndex, offsetBy:2)..<pargs.endIndex]
}
try repl_env.set(MalVal.MalSymbol("*ARGV*"), list(Array(args)))
while true {
print("user> ", terminator: "")
- let line = readLine(stripNewline: true)
+ let line = readLine(strippingNewline: true)
if line == nil { break }
if line == "" { continue }
import Foundation
// read
-func READ(str: String) throws -> MalVal {
+func READ(_ str: String) throws -> MalVal {
return try read_str(str)
}
// eval
-func is_pair(ast: MalVal) -> Bool {
+func is_pair(_ ast: MalVal) -> Bool {
switch ast {
case MalVal.MalList(let lst, _): return lst.count > 0
case MalVal.MalVector(let lst, _): return lst.count > 0
}
}
-func quasiquote(ast: MalVal) -> MalVal {
+func quasiquote(_ ast: MalVal) -> MalVal {
if !is_pair(ast) {
return list([MalVal.MalSymbol("quote"), ast])
}
quasiquote(try! rest(ast))])
}
-func eval_ast(ast: MalVal, _ env: Env) throws -> MalVal {
+func eval_ast(_ ast: MalVal, _ env: Env) throws -> MalVal {
switch ast {
case MalVal.MalSymbol:
return try env.get(ast)
}
}
-func EVAL(orig_ast: MalVal, _ orig_env: Env) throws -> MalVal {
+func EVAL(_ orig_ast: MalVal, _ orig_env: Env) throws -> MalVal {
var ast = orig_ast, env = orig_env
while true {
switch ast {
}
var idx = binds.startIndex
while idx < binds.endIndex {
- let v = try EVAL(binds[idx.successor()], let_env)
+ let v = try EVAL(binds[binds.index(after: idx)], let_env)
try let_env.set(binds[idx], v)
- idx = idx.successor().successor()
+ idx = binds.index(idx, offsetBy: 2)
}
env = let_env
ast = lst[2] // TCO
case MalVal.MalSymbol("quasiquote"):
ast = quasiquote(lst[1]) // TCO
case MalVal.MalSymbol("do"):
- let slc = lst[1..<lst.endIndex.predecessor()]
+ let slc = lst[1..<lst.index(before: lst.endIndex)]
try eval_ast(list(Array(slc)), env)
- ast = lst[lst.endIndex.predecessor()] // TCO
+ ast = lst[lst.index(before: lst.endIndex)] // TCO
case MalVal.MalSymbol("if"):
switch try EVAL(lst[1], env) {
case MalVal.MalFalse, MalVal.MalNil:
}
// print
-func PRINT(exp: MalVal) -> String {
+func PRINT(_ exp: MalVal) -> String {
return pr_str(exp, true)
}
// repl
-func rep(str:String) throws -> String {
+func rep(_ str:String) throws -> String {
return PRINT(try EVAL(try READ(str), repl_env))
}
let pargs = Process.arguments.map { MalVal.MalString($0) }
// TODO: weird way to get empty list, fix this
var args = pargs[pargs.startIndex..<pargs.startIndex]
-if pargs.startIndex.advancedBy(2) < pargs.endIndex {
- args = pargs[pargs.startIndex.advancedBy(2)..<pargs.endIndex]
+if pargs.index(pargs.startIndex, offsetBy:2) < pargs.endIndex {
+ args = pargs[pargs.index(pargs.startIndex, offsetBy:2)..<pargs.endIndex]
}
try repl_env.set(MalVal.MalSymbol("*ARGV*"), list(Array(args)))
while true {
print("user> ", terminator: "")
- let line = readLine(stripNewline: true)
+ let line = readLine(strippingNewline: true)
if line == nil { break }
if line == "" { continue }
import Foundation
// read
-func READ(str: String) throws -> MalVal {
+func READ(_ str: String) throws -> MalVal {
return try read_str(str)
}
// eval
-func is_pair(ast: MalVal) -> Bool {
+func is_pair(_ ast: MalVal) -> Bool {
switch ast {
case MalVal.MalList(let lst, _): return lst.count > 0
case MalVal.MalVector(let lst, _): return lst.count > 0
}
}
-func quasiquote(ast: MalVal) -> MalVal {
+func quasiquote(_ ast: MalVal) -> MalVal {
if !is_pair(ast) {
return list([MalVal.MalSymbol("quote"), ast])
}
quasiquote(try! rest(ast))])
}
-func is_macro(ast: MalVal, _ env: Env) -> Bool {
+func is_macro(_ ast: MalVal, _ env: Env) -> Bool {
switch ast {
case MalVal.MalList(let lst, _) where lst.count > 0:
let a0 = lst[lst.startIndex]
}
}
-func macroexpand(orig_ast: MalVal, _ env: Env) throws -> MalVal {
+func macroexpand(_ orig_ast: MalVal, _ env: Env) throws -> MalVal {
var ast: MalVal = orig_ast
while is_macro(ast, env) {
switch try! env.get(try! _nth(ast, 0)) {
return ast
}
-func eval_ast(ast: MalVal, _ env: Env) throws -> MalVal {
+func eval_ast(_ ast: MalVal, _ env: Env) throws -> MalVal {
switch ast {
case MalVal.MalSymbol:
return try env.get(ast)
}
}
-func EVAL(orig_ast: MalVal, _ orig_env: Env) throws -> MalVal {
+func EVAL(_ orig_ast: MalVal, _ orig_env: Env) throws -> MalVal {
var ast = orig_ast, env = orig_env
while true {
switch ast {
}
var idx = binds.startIndex
while idx < binds.endIndex {
- let v = try EVAL(binds[idx.successor()], let_env)
+ let v = try EVAL(binds[binds.index(after: idx)], let_env)
try let_env.set(binds[idx], v)
- idx = idx.successor().successor()
+ idx = binds.index(idx, offsetBy: 2)
}
env = let_env
ast = lst[2] // TCO
case MalVal.MalSymbol("macroexpand"):
return try macroexpand(lst[1], env)
case MalVal.MalSymbol("do"):
- let slc = lst[1..<lst.endIndex.predecessor()]
+ let slc = lst[1..<lst.index(before: lst.endIndex)]
try eval_ast(list(Array(slc)), env)
- ast = lst[lst.endIndex.predecessor()] // TCO
+ ast = lst[lst.index(before: lst.endIndex)] // TCO
case MalVal.MalSymbol("if"):
switch try EVAL(lst[1], env) {
case MalVal.MalFalse, MalVal.MalNil:
}
// print
-func PRINT(exp: MalVal) -> String {
+func PRINT(_ exp: MalVal) -> String {
return pr_str(exp, true)
}
// repl
-func rep(str:String) throws -> String {
+func rep(_ str:String) throws -> String {
return PRINT(try EVAL(try READ(str), repl_env))
}
let pargs = Process.arguments.map { MalVal.MalString($0) }
// TODO: weird way to get empty list, fix this
var args = pargs[pargs.startIndex..<pargs.startIndex]
-if pargs.startIndex.advancedBy(2) < pargs.endIndex {
- args = pargs[pargs.startIndex.advancedBy(2)..<pargs.endIndex]
+if pargs.index(pargs.startIndex, offsetBy:2) < pargs.endIndex {
+ args = pargs[pargs.index(pargs.startIndex, offsetBy:2)..<pargs.endIndex]
}
try repl_env.set(MalVal.MalSymbol("*ARGV*"), list(Array(args)))
while true {
print("user> ", terminator: "")
- let line = readLine(stripNewline: true)
+ let line = readLine(strippingNewline: true)
if line == nil { break }
if line == "" { continue }
import Foundation
// read
-func READ(str: String) throws -> MalVal {
+func READ(_ str: String) throws -> MalVal {
return try read_str(str)
}
// eval
-func is_pair(ast: MalVal) -> Bool {
+func is_pair(_ ast: MalVal) -> Bool {
switch ast {
case MalVal.MalList(let lst, _): return lst.count > 0
case MalVal.MalVector(let lst, _): return lst.count > 0
}
}
-func quasiquote(ast: MalVal) -> MalVal {
+func quasiquote(_ ast: MalVal) -> MalVal {
if !is_pair(ast) {
return list([MalVal.MalSymbol("quote"), ast])
}
quasiquote(try! rest(ast))])
}
-func is_macro(ast: MalVal, _ env: Env) -> Bool {
+func is_macro(_ ast: MalVal, _ env: Env) -> Bool {
switch ast {
case MalVal.MalList(let lst, _) where lst.count > 0:
let a0 = lst[lst.startIndex]
}
}
-func macroexpand(orig_ast: MalVal, _ env: Env) throws -> MalVal {
+func macroexpand(_ orig_ast: MalVal, _ env: Env) throws -> MalVal {
var ast: MalVal = orig_ast
while is_macro(ast, env) {
switch try! env.get(try! _nth(ast, 0)) {
return ast
}
-func eval_ast(ast: MalVal, _ env: Env) throws -> MalVal {
+func eval_ast(_ ast: MalVal, _ env: Env) throws -> MalVal {
switch ast {
case MalVal.MalSymbol:
return try env.get(ast)
}
}
-func EVAL(orig_ast: MalVal, _ orig_env: Env) throws -> MalVal {
+func EVAL(_ orig_ast: MalVal, _ orig_env: Env) throws -> MalVal {
var ast = orig_ast, env = orig_env
while true {
switch ast {
}
var idx = binds.startIndex
while idx < binds.endIndex {
- let v = try EVAL(binds[idx.successor()], let_env)
+ let v = try EVAL(binds[binds.index(after: idx)], let_env)
try let_env.set(binds[idx], v)
- idx = idx.successor().successor()
+ idx = binds.index(idx, offsetBy: 2)
}
env = let_env
ast = lst[2] // TCO
throw exc
}
case MalVal.MalSymbol("do"):
- let slc = lst[1..<lst.endIndex.predecessor()]
+ let slc = lst[1..<lst.index(before: lst.endIndex)]
try eval_ast(list(Array(slc)), env)
- ast = lst[lst.endIndex.predecessor()] // TCO
+ ast = lst[lst.index(before: lst.endIndex)] // TCO
case MalVal.MalSymbol("if"):
switch try EVAL(lst[1], env) {
case MalVal.MalFalse, MalVal.MalNil:
}
// print
-func PRINT(exp: MalVal) -> String {
+func PRINT(_ exp: MalVal) -> String {
return pr_str(exp, true)
}
// repl
-func rep(str:String) throws -> String {
+func rep(_ str:String) throws -> String {
return PRINT(try EVAL(try READ(str), repl_env))
}
let pargs = Process.arguments.map { MalVal.MalString($0) }
// TODO: weird way to get empty list, fix this
var args = pargs[pargs.startIndex..<pargs.startIndex]
-if pargs.startIndex.advancedBy(2) < pargs.endIndex {
- args = pargs[pargs.startIndex.advancedBy(2)..<pargs.endIndex]
+if pargs.index(pargs.startIndex, offsetBy:2) < pargs.endIndex {
+ args = pargs[pargs.index(pargs.startIndex, offsetBy:2)..<pargs.endIndex]
}
try repl_env.set(MalVal.MalSymbol("*ARGV*"), list(Array(args)))
while true {
print("user> ", terminator: "")
- let line = readLine(stripNewline: true)
+ let line = readLine(strippingNewline: true)
if line == nil { break }
if line == "" { continue }
import Foundation
// read
-func READ(str: String) throws -> MalVal {
+func READ(_ str: String) throws -> MalVal {
return try read_str(str)
}
// eval
-func is_pair(ast: MalVal) -> Bool {
+func is_pair(_ ast: MalVal) -> Bool {
switch ast {
case MalVal.MalList(let lst, _): return lst.count > 0
case MalVal.MalVector(let lst, _): return lst.count > 0
}
}
-func quasiquote(ast: MalVal) -> MalVal {
+func quasiquote(_ ast: MalVal) -> MalVal {
if !is_pair(ast) {
return list([MalVal.MalSymbol("quote"), ast])
}
quasiquote(try! rest(ast))])
}
-func is_macro(ast: MalVal, _ env: Env) -> Bool {
+func is_macro(_ ast: MalVal, _ env: Env) -> Bool {
switch ast {
case MalVal.MalList(let lst, _) where lst.count > 0:
let a0 = lst[lst.startIndex]
}
}
-func macroexpand(orig_ast: MalVal, _ env: Env) throws -> MalVal {
+func macroexpand(_ orig_ast: MalVal, _ env: Env) throws -> MalVal {
var ast: MalVal = orig_ast
while is_macro(ast, env) {
switch try! env.get(try! _nth(ast, 0)) {
return ast
}
-func eval_ast(ast: MalVal, _ env: Env) throws -> MalVal {
+func eval_ast(_ ast: MalVal, _ env: Env) throws -> MalVal {
switch ast {
case MalVal.MalSymbol:
return try env.get(ast)
}
}
-func EVAL(orig_ast: MalVal, _ orig_env: Env) throws -> MalVal {
+func EVAL(_ orig_ast: MalVal, _ orig_env: Env) throws -> MalVal {
var ast = orig_ast, env = orig_env
while true {
switch ast {
}
var idx = binds.startIndex
while idx < binds.endIndex {
- let v = try EVAL(binds[idx.successor()], let_env)
+ let v = try EVAL(binds[binds.index(after: idx)], let_env)
try let_env.set(binds[idx], v)
- idx = idx.successor().successor()
+ idx = binds.index(idx, offsetBy: 2)
}
env = let_env
ast = lst[2] // TCO
throw exc
}
case MalVal.MalSymbol("do"):
- let slc = lst[1..<lst.endIndex.predecessor()]
+ let slc = lst[1..<lst.index(before: lst.endIndex)]
try eval_ast(list(Array(slc)), env)
- ast = lst[lst.endIndex.predecessor()] // TCO
+ ast = lst[lst.index(before: lst.endIndex)] // TCO
case MalVal.MalSymbol("if"):
switch try EVAL(lst[1], env) {
case MalVal.MalFalse, MalVal.MalNil:
}
// print
-func PRINT(exp: MalVal) -> String {
+func PRINT(_ exp: MalVal) -> String {
return pr_str(exp, true)
}
// repl
-func rep(str:String) throws -> String {
+func rep(_ str:String) throws -> String {
return PRINT(try EVAL(try READ(str), repl_env))
}
let pargs = Process.arguments.map { MalVal.MalString($0) }
// TODO: weird way to get empty list, fix this
var args = pargs[pargs.startIndex..<pargs.startIndex]
-if pargs.startIndex.advancedBy(2) < pargs.endIndex {
- args = pargs[pargs.startIndex.advancedBy(2)..<pargs.endIndex]
+if pargs.index(pargs.startIndex, offsetBy:2) < pargs.endIndex {
+ args = pargs[pargs.index(pargs.startIndex, offsetBy:2)..<pargs.endIndex]
}
try repl_env.set(MalVal.MalSymbol("*ARGV*"), list(Array(args)))
while true {
print("user> ", terminator: "")
- let line = readLine(stripNewline: true)
+ let line = readLine(strippingNewline: true)
if line == nil { break }
if line == "" { continue }
-enum MalError: ErrorType {
+enum MalError: ErrorProtocol {
case Reader(msg: String)
case General(msg: String)
case MalException(obj: MalVal)
// General functions
-func wraptf(a: Bool) -> MalVal {
+func wraptf(_ a: Bool) -> MalVal {
return a ? MV.MalTrue : MV.MalFalse
}
// equality functions
-func cmp_seqs(a: Array<MalVal>, _ b: Array<MalVal>) -> Bool {
+func cmp_seqs(_ a: Array<MalVal>, _ b: Array<MalVal>) -> Bool {
if a.count != b.count { return false }
var idx = a.startIndex
while idx < a.endIndex {
if !equal_Q(a[idx], b[idx]) { return false }
- idx = idx.successor()
+ idx = a.index(after:idx)
}
return true
}
-func cmp_maps(a: Dictionary<String,MalVal>,
+func cmp_maps(_ a: Dictionary<String,MalVal>,
_ b: Dictionary<String,MalVal>) -> Bool {
if a.count != b.count { return false }
for (k,v1) in a {
return true
}
-func equal_Q(a: MalVal, _ b: MalVal) -> Bool {
+func equal_Q(_ a: MalVal, _ b: MalVal) -> Bool {
switch (a, b) {
case (MV.MalNil, MV.MalNil): return true
case (MV.MalFalse, MV.MalFalse): return true
}
// list and vector functions
-func list(lst: Array<MalVal>) -> MalVal {
+func list(_ lst: Array<MalVal>) -> MalVal {
return MV.MalList(lst, meta:nil)
}
-func list(lst: Array<MalVal>, meta: MalVal) -> MalVal {
+func list(_ lst: Array<MalVal>, meta: MalVal) -> MalVal {
return MV.MalList(lst, meta:[meta])
}
-func vector(lst: Array<MalVal>) -> MalVal {
+func vector(_ lst: Array<MalVal>) -> MalVal {
return MV.MalVector(lst, meta:nil)
}
-func vector(lst: Array<MalVal>, meta: MalVal) -> MalVal {
+func vector(_ lst: Array<MalVal>, meta: MalVal) -> MalVal {
return MV.MalVector(lst, meta:[meta])
}
// hash-map functions
-func _assoc(src: Dictionary<String,MalVal>, _ mvs: Array<MalVal>)
+func _assoc(_ src: Dictionary<String,MalVal>, _ mvs: Array<MalVal>)
throws -> Dictionary<String,MalVal> {
var d = src
if mvs.count % 2 != 0 {
return d
}
-func _dissoc(src: Dictionary<String,MalVal>, _ mvs: Array<MalVal>)
+func _dissoc(_ src: Dictionary<String,MalVal>, _ mvs: Array<MalVal>)
throws -> Dictionary<String,MalVal> {
var d = src
for mv in mvs {
switch mv {
- case MV.MalString(let k): d.removeValueForKey(k)
+ case MV.MalString(let k): d.removeValue(forKey: k)
default: throw MalError.General(msg: "Invalid _dissoc call")
}
}
}
-func hash_map(dict: Dictionary<String,MalVal>) -> MalVal {
+func hash_map(_ dict: Dictionary<String,MalVal>) -> MalVal {
return MV.MalHashMap(dict, meta:nil)
}
-func hash_map(dict: Dictionary<String,MalVal>, meta:MalVal) -> MalVal {
+func hash_map(_ dict: Dictionary<String,MalVal>, meta:MalVal) -> MalVal {
return MV.MalHashMap(dict, meta:[meta])
}
-func hash_map(arr: Array<MalVal>) throws -> MalVal {
+func hash_map(_ arr: Array<MalVal>) throws -> MalVal {
let d = Dictionary<String,MalVal>();
return MV.MalHashMap(try _assoc(d, arr), meta:nil)
}
// function functions
-func malfunc(fn: (Array<MalVal>) throws -> MalVal) -> MalVal {
+func malfunc(_ fn: (Array<MalVal>) throws -> MalVal) -> MalVal {
return MV.MalFunc(fn, ast: nil, env: nil, params: nil,
macro: false, meta: nil)
}
-func malfunc(fn: (Array<MalVal>) throws -> MalVal,
+func malfunc(_ fn: (Array<MalVal>) throws -> MalVal,
ast: Array<MalVal>?,
env: Env?,
params: Array<MalVal>?) -> MalVal {
return MV.MalFunc(fn, ast: ast, env: env, params: params,
macro: false, meta: nil)
}
-func malfunc(fn: (Array<MalVal>) throws -> MalVal,
+func malfunc(_ fn: (Array<MalVal>) throws -> MalVal,
ast: Array<MalVal>?,
env: Env?,
params: Array<MalVal>?,
return MV.MalFunc(fn, ast: ast, env: env, params: params,
macro: macro, meta: meta != nil ? [meta!] : nil)
}
-func malfunc(fn: (Array<MalVal>) throws -> MalVal,
+func malfunc(_ fn: (Array<MalVal>) throws -> MalVal,
ast: Array<MalVal>?,
env: Env?,
params: Array<MalVal>?,
// sequence functions
-func _rest(a: MalVal) throws -> Array<MalVal> {
+func _rest(_ a: MalVal) throws -> Array<MalVal> {
switch a {
case MV.MalList(let lst,_):
- let slc = lst[lst.startIndex.successor()..<lst.endIndex]
+ let start = lst.index(after: lst.startIndex)
+ let slc = lst[start..<lst.endIndex]
return Array(slc)
case MV.MalVector(let lst,_):
- let slc = lst[lst.startIndex.successor()..<lst.endIndex]
+ let start = lst.index(after: lst.startIndex)
+ let slc = lst[start..<lst.endIndex]
return Array(slc)
default:
throw MalError.General(msg: "Invalid rest call")
}
}
-func rest(a: MalVal) throws -> MalVal {
+func rest(_ a: MalVal) throws -> MalVal {
return list(try _rest(a))
}
-func _nth(a: MalVal, _ idx: Int) throws -> MalVal {
+func _nth(_ a: MalVal, _ idx: Int) throws -> MalVal {
switch a {
- case MV.MalList(let l,_): return l[l.startIndex.advancedBy(idx)]
- case MV.MalVector(let l,_): return l[l.startIndex.advancedBy(idx)]
+ case MV.MalList(let l,_): return l[l.startIndex.advanced(by: idx)]
+ case MV.MalVector(let l,_): return l[l.startIndex.advanced(by: idx)]
default: throw MalError.General(msg: "Invalid nth call")
}
}