Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- (defun brfk (i)
- (let ((s (coerce i'list)))
- (labels((lbf ()
- (do(r x)((or x(not s))(reverse r))
- (push (case (pop s)
- (#\> 'right)
- (#\< `left)
- (#\+ `inc)
- (#\- `dec)
- (#\. `print)
- (#\, `read)
- (#\[ `(bracketed ,@(lbf)))
- (#\] (setf x t) (go /))
- (t (go /)))
- r)/)))
- `(brainfuck
- ,@(lbf)))))
- (defun simplify (bf)
- (optima:match bf
- ((cons 'brainfuck rest) `(brainfuck ,@(simplify rest)))
- ((list* (list 'add n) 'inc rest) (simplify (cons `(add ,(1+ n)) rest)))
- ((list* (list 'add n) 'dec rest) (simplify (cons `(add ,(1- n)) rest)))
- ((list* (list 'add n) x rest) `((add ,n) ,@(simplify (cons x rest))))
- ((cons 'inc rest) (simplify (cons '(add 1) rest)))
- ((cons 'dec rest) (simplify (cons '(add -1) rest)))
- ((list* (list 'move n) 'left rest) (simplify (cons `(move ,(1- n)) rest)))
- ((list* (list 'move n) 'right rest) (simplify (cons `(move ,(1+ n)) rest)))
- ((list* (list 'move n) x rest) `((move ,n) ,@(simplify (cons x rest))))
- ((cons 'left rest) (simplify (cons '(move -1) rest)))
- ((cons 'right rest) (simplify (cons '(move 1) rest)))
- ((cons (cons 'bracketed sub) rest) `((bracketed ,@(simplify sub)) ,@(simplify rest)))
- ((cons a rest) `(,a ,@(simplify rest)))
- (nil nil)))
- (defun as-ps(bf)
- (optima:match bf
- (nil nil)
- ((cons 'brainfuck rest) `(let ((a (make-array)) (p 0)) ,@(as-ps rest)))
- ((cons (list 'add 0) rest) (as-ps rest))
- ((cons (list 'add x) rest) (cons`(setf(aref a p)(+(or (aref a p)0),x)) (as-ps rest)))
- ((cons (list 'move 0) rest) (as-ps rest))
- ((cons (list 'move x) rest) (cons`(incf p ,x)(as-ps rest)))
- ((cons 'print rest) (cons`((ps:@ console log)((ps:@ *String from-char-code) (or(aref a p)0))) (as-ps rest)))
- ((cons 'read rest) (cons `(setf(aref a p) ((ps:@ (prompt) char-code-at) 0)) (as-ps rest)))
- ((cons (cons 'bracketed sub) rest)
- (cons `(loop until (= 0 (or (aref a p)0)) do ,@(as-ps sub))
- (as-ps rest)))))
- (ps:ps* (as-ps (simplify (brfk "++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.") )))
- "(function () {
- var a = new Array();
- var p = 0;
- a[p] = (a[p] || 0) + 10;
- while (0 !== (a[p] || 0)) {
- ++p;
- a[p] = (a[p] || 0) + 7;
- ++p;
- a[p] = (a[p] || 0) + 10;
- ++p;
- a[p] = (a[p] || 0) + 3;
- ++p;
- a[p] = (a[p] || 0) + 1;
- p += -4;
- a[p] = (a[p] || 0) + -1;
- };
- ++p;
- a[p] = (a[p] || 0) + 2;
- console.log(String.fromCharCode(a[p] || 0));
- ++p;
- a[p] = (a[p] || 0) + 1;
- console.log(String.fromCharCode(a[p] || 0));
- a[p] = (a[p] || 0) + 7;
- console.log(String.fromCharCode(a[p] || 0));
- console.log(String.fromCharCode(a[p] || 0));
- a[p] = (a[p] || 0) + 3;
- console.log(String.fromCharCode(a[p] || 0));
- ++p;
- a[p] = (a[p] || 0) + 2;
- console.log(String.fromCharCode(a[p] || 0));
- p += -2;
- a[p] = (a[p] || 0) + 15;
- console.log(String.fromCharCode(a[p] || 0));
- ++p;
- console.log(String.fromCharCode(a[p] || 0));
- a[p] = (a[p] || 0) + 3;
- console.log(String.fromCharCode(a[p] || 0));
- a[p] = (a[p] || 0) + -6;
- console.log(String.fromCharCode(a[p] || 0));
- a[p] = (a[p] || 0) + -8;
- console.log(String.fromCharCode(a[p] || 0));
- ++p;
- a[p] = (a[p] || 0) + 1;
- console.log(String.fromCharCode(a[p] || 0));
- ++p;
- return console.log(String.fromCharCode(a[p] || 0));
- })();"
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement