Last active
August 17, 2016 22:01
-
-
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.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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