Skip to content

Instantly share code, notes, and snippets.

@CodaFi
Last active August 17, 2016 22:01
Show Gist options
  • Save CodaFi/fe42d673f1a37395ffd1 to your computer and use it in GitHub Desktop.
Save CodaFi/fe42d673f1a37395ffd1 to your computer and use it in GitHub Desktop.
Like BrainFuck and LISP had a baby... An ugly, useless, hard to use baby.
struct ProgramState {
var inner : [UnicodeScalar]
var ptr : Int
init() {
self.ptr = 0
self.inner = Array<UnicodeScalar>(repeating: UnicodeScalar(0), count: 30000)
}
}
struct ChainFuck {
var f : (BrainFuck) -> BrainFuck
init() {
f = { (_ : BrainFuck) in
return BrainFuck()
}
}
init(f : @escaping (BrainFuck) -> BrainFuck) {
self.f = f
}
func eval() -> (BrainFuck, ChainFuck) {
return (f(BrainFuck()), self)
}
subscript(y: ChainFuck) -> ChainFuck {
return ChainFuck(f: { (x : BrainFuck) -> BrainFuck in
var t : (BrainFuck, ChainFuck)
repeat {
t = y.eval()
} while (t.0.inner[t.0.ptr].value == 0)
return self.f(x)
})
}
}
struct BrainFuck : CustomStringConvertible /*, ArrayLiteralConvertible*/ {
typealias Element = BrainFuck
static var state : ProgramState = ProgramState()
var inner : [UnicodeScalar] {
return BrainFuck.state.inner
}
var ptr : Int {
get {
return BrainFuck.state.ptr
}
}
var editedIndex : Int {
set {
self.maxEditedIndex = max(editedIndex, newValue)
} get {
return self.maxEditedIndex
}
}
var maxEditedIndex : Int = 0
var description: String {
get {
return inner[0..<maxEditedIndex].description
}
}
init() {}
init(inner: [UnicodeScalar], ptr: Int) {
BrainFuck.state.ptr = ptr
BrainFuck.state.inner = inner
}
subscript (x: ChainFuck) -> BrainFuck {
var t : (BrainFuck, ChainFuck)
repeat {
t = x.eval()
} while (t.0.inner[t.0.ptr].value == 0)
return t.0
}
}
//postfix operator > {}
postfix operator <
postfix operator +
postfix operator -
postfix operator *
//operator postfix , {}
func clear() -> BrainFuck {
let x = Array<UnicodeScalar>(repeating: UnicodeScalar(0), count: 30000)
return BrainFuck(inner: x, ptr: 0)
}
//postfix func >(y : ChainFuck) -> ChainFuck {
// return ChainFuck(f: { (x : BrainFuck) -> BrainFuck in
// return y.f(x)>
// })
//}
postfix func <(y : ChainFuck) -> ChainFuck {
return ChainFuck(f: { (x : BrainFuck) -> BrainFuck in
return y.f(x)<
})
}
postfix func +(y : ChainFuck) -> ChainFuck {
return ChainFuck(f: { (x : BrainFuck) -> BrainFuck in
return y.f(x)+
})
}
postfix func -(y : ChainFuck) -> ChainFuck {
return ChainFuck(f: { (x : BrainFuck) -> BrainFuck in
return y.f(x)-
})
}
postfix func *(y : ChainFuck) -> ChainFuck {
return ChainFuck(f: { (x : BrainFuck) -> BrainFuck in
return y.f(x)*
})
}
//postfix func >(x : BrainFuck) -> BrainFuck {
// return BrainFuck(inner: x.inner, ptr: x.ptr + 1)
//}
postfix func <(x : BrainFuck) -> BrainFuck {
return BrainFuck(inner: x.inner, ptr: x.ptr - 1)
}
postfix func +(x : BrainFuck) -> BrainFuck {
var y = x.inner
y[x.ptr] = UnicodeScalar(x.inner[x.ptr].value + 1)!
return BrainFuck(inner: y, ptr: x.ptr)
}
postfix func -(x : BrainFuck) -> BrainFuck {
var y = x.inner
y[x.ptr] = UnicodeScalar(x.inner[x.ptr].value - UInt32(1))!
return BrainFuck(inner: y, ptr: x.ptr)
}
postfix func *(x : BrainFuck) -> BrainFuck {
print(x.inner[x.ptr])
return x
}
clear()
((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((BrainFuck()+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)*)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)*)+)+)+)+)+)+)+)*)*)+)+)+)*)-)-)-)-)-)-)-)-)-)-)-)-)-)-)-)-)-)-)-)-)-)-)-)-)-)-)-)-)-)-)-)-)-)-)-)-)-)-)-)-)-)-)-)-)-)-)-)-)-)-)-)-)-)-)-)-)-)-)-)-)-)-)-)-)-)-)-)*)-)-)-)-)-)-)-)-)-)-)-)-)*)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)*)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)+)*)+)+)+)*)-)-)-)-)-)-)*)-)-)-)-)-)-)-)-)*)-)-)-)-)-)-)-)-)-)-)-)-)-)-)-)-)-)-)-)-)-)-)-)-)-)-)-)-)-)-)-)-)-)-)-)-)-)-)-)-)-)-)-)-)-)-)-)-)-)-)-)-)-)-)-)-)-)-)-)-)-)-)-)-)-)-)-)*)
print("\n")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment