Plaster
New
List
Login
text
apl
aspx
asterisk
brainfuck
c
c++hdr
c++src
cassandra
ceylon
clojure
clojurescript
cmake
cobol
coffeescript
common-lisp
crystal
csharp
css
cypher-query
cython
d
dart
diff
django
dockerfile
dylan
ebnf
ecl
ecmascript
edn
eiffel
ejs
elm
erb
erlang
ez80
factor
fcl
feature
forth
fortran
fragment
gfm
go
gql
groovy
gss
haml
handlebars-template
haskell
haxe
hive
html
http
httpd-php
httpd-php-open
hxml
ini
java
javascript
json
jsp
jsx
julia
kotlin
latex
less
literate-haskell
lua
mariadb
markdown
mbox
mirc
mscgen
msgenny
mssql
mumps
mysql
n-triples
nesc
nginx-conf
nsis
objectivec
octave
oz
pascal
perl
pgp
pgp-keys
pgp-signature
pgsql
php
pig
plsql
properties
protobuf
puppet
python
q
rpm-changes
rpm-spec
rsrc
ruby
rustsrc
sas
sass
scala
scheme
scss
sieve
slim
smarty
solr
soy
sparql-query
spreadsheet
sql
squirrel
stex
styl
swift
systemverilog
tcl
textile
tiddlywiki
tiki
tlv
tornado
ttcn-asn
ttcn-cfg
turtle
twig
typescript
typescript-jsx
vb
vbscript
velocity
verilog
vertex
vhdl
vue
webidl
xml
xml-dtd
xquery
xu
yaml
z80
default
Visibility:
public
unlisted
private
(declaim (optimize (speed 3) (safety 1) (debug 3))) (defun peek-for-multiple-characters (stream character character-weight op-name start-value) (list op-name (+ start-value (loop while (eql (peek-char nil stream nil nil) character) sum character-weight do (read-char stream))))) (defun read-bf-program (stream) (loop for char = (read-char stream nil nil) until (or (null char) (char= char #\])) when (case char (#\+ (peek-for-multiple-characters stream #\+ 1 'tape-inc 1)) (#\- (peek-for-multiple-characters stream #\- -1 'tape-inc -1)) (#\> (peek-for-multiple-characters stream #\> 1 'tape-move 1)) (#\< (peek-for-multiple-characters stream #\< -1 'tape-move -1)) (#\. '(tape-print)) (#\[ (list 'tape-loop (read-bf-program stream)))) collect it)) (defun compile-bf-program (program) `(lambda () (declare (optimize (speed 3) (safety 0) (debug 1))) (let ((tape (make-array 4096 :element-type 'fixnum)) (position 2048)) (declare (fixnum position) ((simple-array fixnum (*)) tape)) ,@(%compile-bf-program program)))) (defun %compile-bf-program (program) (loop for op in program collect (ecase (first op) (tape-inc `(incf (aref tape position) ,(second op))) (tape-move `(incf position ,(second op))) (tape-print `(write-char (code-char (aref tape position)))) (tape-loop `(loop while (plusp (aref tape position)) do (progn ,@(%compile-bf-program (second op)))))))) (defun run (program) (funcall (compile 'nil (compile-bf-program program)))) (defun bench (&key (file "./bench.b")) (with-open-file (stream file) (time (run (read-bf-program stream)))))