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