Skip to content

Commit ce7bb3e

Browse files
authored
Merge pull request #47 from jakerockland/race-conditions-and-swift-4
Fix potential race conditions and finish update for Swift 4
2 parents 86ffc0c + c4779cb commit ce7bb3e

File tree

5 files changed

+324
-301
lines changed

5 files changed

+324
-301
lines changed

Sources/SwispFramework/Environment.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -441,7 +441,7 @@ private struct Library {
441441
case let (val as Bool):
442442
return !val
443443
case let (val as NSNumber):
444-
return !Bool(val)
444+
return !Bool(truncating: val)
445445
case let (val as String):
446446
if let bool = Bool(val) {
447447
return !bool
@@ -691,7 +691,7 @@ private struct Math {
691691
}
692692
switch (args[safe: 0], args[safe: 1]) {
693693
case let (val as Double, exp as Int):
694-
return Foundation.ldexp(val, exp)
694+
return Foundation.scalbn(val, exp)
695695
default:
696696
throw SwispError.SyntaxError(message: "invalid procedure input")
697697
}

Sources/SwispFramework/Interpreter.swift

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ public struct Interpreter {
5252
/// Calls the given procedure
5353
public func call(_ args: [Any]) throws -> Any? {
5454
var inner = Env(parms, args, outer: env)
55-
return try Interpreter.eval(&body, with: &inner)
55+
return try Interpreter.eval(body, with: &inner)
5656
}
5757

5858
}
@@ -184,7 +184,7 @@ public struct Interpreter {
184184

185185
- Returns: The evaluated statement
186186
*/
187-
static func eval(_ x: inout Any, with env: inout Env) throws -> Any? {
187+
static func eval(_ x: Any, with env: inout Env) throws -> Any? {
188188
if let x = x as? Symbol { // variable reference
189189
guard let ref = env.find(x)?[x] else {
190190
return x
@@ -210,25 +210,25 @@ public struct Interpreter {
210210
}
211211
return lis
212212
} else if x.first as? Symbol == "if" { // conditional
213-
guard var test = x[safe: 1], let conseq = x[safe: 2], let alt = x[safe: 3] else {
213+
guard let test = x[safe: 1], let conseq = x[safe: 2], let alt = x[safe: 3] else {
214214
throw SwispError.SyntaxError(message: "invalid conditional statement")
215215
}
216-
guard let bool = try eval(&test, with: &env) as? Bool else {
216+
guard let bool = try eval(test, with: &env) as? Bool else {
217217
throw SwispError.SyntaxError(message: "invalid conditional statement")
218218
}
219-
var exp = bool ? conseq : alt
220-
return try eval(&exp, with: &env)
219+
let exp = bool ? conseq : alt
220+
return try eval(exp, with: &env)
221221
} else if x.first as? Symbol == "define" { // definition
222-
guard let `var` = x[safe: 1] as? Symbol, var exp = x[safe: 2] else {
222+
guard let `var` = x[safe: 1] as? Symbol, let exp = x[safe: 2] else {
223223
throw SwispError.SyntaxError(message: "invalid definition")
224224
}
225-
env[`var`] = try eval(&exp, with: &env)
225+
env[`var`] = try eval(exp, with: &env)
226226
return nil
227227
} else if x.first as? Symbol == "set!" { // assignment
228-
guard let `var` = x[safe: 1] as? Symbol, var exp = x[safe: 2], let outer = env.find(`var`) else {
228+
guard let `var` = x[safe: 1] as? Symbol, let exp = x[safe: 2], let outer = env.find(`var`) else {
229229
throw SwispError.SyntaxError(message: "invalid assignment")
230230
}
231-
outer[`var`] = try eval(&exp, with: &env)
231+
outer[`var`] = try eval(exp, with: &env)
232232
return nil
233233
} else if x.first as? Symbol == "lambda" { // lambda
234234
guard let parms = x[safe: 1] as? [Symbol], let body = x[safe: 2] as? [Any] else {
@@ -237,15 +237,15 @@ public struct Interpreter {
237237
return Lambda(parms, body, env)
238238
} else { // procedure call
239239
var args: [Any] = []
240-
guard var exp = x[safe: 0] else {
240+
guard let exp = x[safe: 0] else {
241241
throw SwispError.SyntaxError(message: "invalid procedure called")
242242
}
243243

244-
let proc = try eval(&exp, with: &env)
244+
let proc = try eval(exp, with: &env)
245245

246246
for element in x.dropFirst() {
247-
var element = element
248-
guard let arg = try eval(&element, with: &env) else {
247+
let element = element
248+
guard let arg = try eval(element, with: &env) else {
249249
throw SwispError.SyntaxError(message: "invalid procedure called")
250250
}
251251
args.append(arg)
@@ -287,8 +287,8 @@ public struct Interpreter {
287287
}
288288

289289
do {
290-
var parsed = try Interpreter.parse(input)
291-
if var val = try Interpreter.eval(&parsed, with: &globalEnv) {
290+
let parsed = try Interpreter.parse(input)
291+
if var val = try Interpreter.eval(parsed, with: &globalEnv) {
292292
print(Interpreter.schemeString(&val))
293293
}
294294
} catch let error as SwispError {

Swisp.xcodeproj/project.pbxproj

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,9 +48,9 @@
4848
OBJ_15 /* EnvironmentTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EnvironmentTests.swift; sourceTree = "<group>"; };
4949
OBJ_16 /* InterpreterTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InterpreterTests.swift; sourceTree = "<group>"; };
5050
OBJ_17 /* XCTestManifests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = XCTestManifests.swift; sourceTree = "<group>"; };
51-
OBJ_19 /* Swisp */ = {isa = PBXFileReference; lastKnownFileType = text; path = Swisp; sourceTree = BUILT_PRODUCTS_DIR; };
51+
OBJ_19 /* Swisp */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; path = Swisp; sourceTree = BUILT_PRODUCTS_DIR; };
5252
OBJ_20 /* SwispFramework.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = SwispFramework.framework; sourceTree = BUILT_PRODUCTS_DIR; };
53-
OBJ_21 /* SwispTests.xctest */ = {isa = PBXFileReference; lastKnownFileType = file; path = SwispTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
53+
OBJ_21 /* SwispTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; path = SwispTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
5454
OBJ_6 /* Package.swift */ = {isa = PBXFileReference; explicitFileType = sourcecode.swift; path = Package.swift; sourceTree = "<group>"; };
5555
OBJ_9 /* main.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = main.swift; sourceTree = "<group>"; };
5656
/* End PBXFileReference section */
@@ -215,6 +215,17 @@
215215
isa = PBXProject;
216216
attributes = {
217217
LastUpgradeCheck = 9999;
218+
TargetAttributes = {
219+
OBJ_22 = {
220+
LastSwiftMigration = 1000;
221+
};
222+
OBJ_31 = {
223+
LastSwiftMigration = 1000;
224+
};
225+
OBJ_39 = {
226+
LastSwiftMigration = 1000;
227+
};
228+
};
218229
};
219230
buildConfigurationList = OBJ_2 /* Build configuration list for PBXProject "Swisp" */;
220231
compatibilityVersion = "Xcode 3.2";
@@ -295,6 +306,8 @@
295306
OTHER_SWIFT_FLAGS = "$(inherited)";
296307
SWIFT_FORCE_DYNAMIC_LINK_STDLIB = YES;
297308
SWIFT_FORCE_STATIC_LINK_STDLIB = NO;
309+
SWIFT_SWIFT3_OBJC_INFERENCE = Default;
310+
SWIFT_VERSION = 4.2;
298311
TARGET_NAME = Swisp;
299312
};
300313
name = Debug;
@@ -313,6 +326,8 @@
313326
OTHER_SWIFT_FLAGS = "$(inherited)";
314327
SWIFT_FORCE_DYNAMIC_LINK_STDLIB = YES;
315328
SWIFT_FORCE_STATIC_LINK_STDLIB = NO;
329+
SWIFT_SWIFT3_OBJC_INFERENCE = Default;
330+
SWIFT_VERSION = 4.2;
316331
TARGET_NAME = Swisp;
317332
};
318333
name = Release;
@@ -355,6 +370,8 @@
355370
PRODUCT_BUNDLE_IDENTIFIER = SwispFramework;
356371
PRODUCT_MODULE_NAME = "$(TARGET_NAME:c99extidentifier)";
357372
PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
373+
SWIFT_SWIFT3_OBJC_INFERENCE = Default;
374+
SWIFT_VERSION = 4.2;
358375
TARGET_NAME = SwispFramework;
359376
};
360377
name = Debug;
@@ -375,6 +392,8 @@
375392
PRODUCT_BUNDLE_IDENTIFIER = SwispFramework;
376393
PRODUCT_MODULE_NAME = "$(TARGET_NAME:c99extidentifier)";
377394
PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
395+
SWIFT_SWIFT3_OBJC_INFERENCE = Default;
396+
SWIFT_VERSION = 4.2;
378397
TARGET_NAME = SwispFramework;
379398
};
380399
name = Release;
@@ -412,6 +431,8 @@
412431
LD_RUNPATH_SEARCH_PATHS = "@loader_path/../Frameworks";
413432
OTHER_LDFLAGS = "$(inherited)";
414433
OTHER_SWIFT_FLAGS = "$(inherited)";
434+
SWIFT_SWIFT3_OBJC_INFERENCE = Default;
435+
SWIFT_VERSION = 4.2;
415436
TARGET_NAME = SwispTests;
416437
};
417438
name = Debug;
@@ -429,6 +450,8 @@
429450
LD_RUNPATH_SEARCH_PATHS = "@loader_path/../Frameworks";
430451
OTHER_LDFLAGS = "$(inherited)";
431452
OTHER_SWIFT_FLAGS = "$(inherited)";
453+
SWIFT_SWIFT3_OBJC_INFERENCE = Default;
454+
SWIFT_VERSION = 4.2;
432455
TARGET_NAME = SwispTests;
433456
};
434457
name = Release;

0 commit comments

Comments
 (0)