Skip to content

Commit

Permalink
Refactor <bf> interface
Browse files Browse the repository at this point in the history
Delegate memory creation to run!
Split program pointer advance from execute
  • Loading branch information
fraya committed May 13, 2024
1 parent d2bf94a commit 1ad9f10
Showing 1 changed file with 18 additions and 10 deletions.
28 changes: 18 additions & 10 deletions sources/brainfuck.dylan
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,7 @@ define sealed class <bf> (<object>)
init-keyword: memory-pointer:;
constant slot bf-program :: <program>,
required-init-keyword: program:;
constant slot bf-memory :: <memory>
= make(<memory>, fill: 0, size: $default-memory-size),
constant slot bf-memory :: <memory>,
init-keyword: memory:;
end;

Expand All @@ -36,27 +35,36 @@ define generic bf-memory
define generic execute
(instruction :: <instruction>, bf :: <bf>) => ();

define generic run!
(object :: <object>) => (bf :: <bf>);
define inline function forth!
(bf :: <bf>) => (pp :: <program-pointer>)
bf.bf-pp := bf.bf-pp + 1;
end;

define inline function perform!
(bf :: <bf>) => (bf :: <bf>)
execute(bf.bf-program[bf.bf-pp], bf);
bf
end;

////////////////////////////////////////////////////////////////////////
//
// 'run' methods to execute a program in a brainfuck machine
//
////////////////////////////////////////////////////////////////////////

define generic run!
(object :: <object>) => (bf :: <bf>);

define method run!
(program :: <program>)
=> (bf :: <bf>)
let bf = make(<bf>, program: program);
run!(bf)
(program :: <program>) => (bf :: <bf>)
let memory = make(<memory>, size: $default-memory-size);
run!(make(<bf>, program: program, memory: memory))
end;

define method run!
(bf :: <bf>) => (bf :: <bf>)
while (bf.bf-pp < bf.bf-program.size)
execute(bf.bf-program[bf.bf-pp], bf);
bf.bf-pp := bf.bf-pp + 1
forth!(perform!(bf))
end;
bf
end;
Expand Down

0 comments on commit 1ad9f10

Please sign in to comment.