Manually merging: - README.md: I added the description from universe/README.md into the heading of dotfiles/README.md. - .envrc: dotfiles/.envrc was a superset of universe/.envrc - .gitignore: Adding some of the ignored patterns from universe/.gitignore to dotfiles/.gitignore Everything else here should be a simple rename.
		
			
				
	
	
		
			50 lines
		
	
	
	
		
			1.5 KiB
		
	
	
	
		
			Elixir
		
	
	
	
	
	
			
		
		
	
	
			50 lines
		
	
	
	
		
			1.5 KiB
		
	
	
	
		
			Elixir
		
	
	
	
	
	
| defmodule Interpretter do
 | |
|   def interpret_param({mode, x}, xs) do
 | |
|     case mode do
 | |
|       :positional -> Enum.at(xs, x)
 | |
|       :immediate  -> x
 | |
|     end
 | |
|   end
 | |
| 
 | |
|   # Perhaps I can model the intepretter after Forth and make it a stack-based
 | |
|   # interpretter with an emphasis on debugability, introspection.
 | |
|   def interpret(i, xs) do
 | |
|     stack = []
 | |
|     op = Enum.at(xs, i)
 | |
| 
 | |
|     # map instructions into an intermediate representation (i.e. IR) where the
 | |
|     # opcodes are mapped into atoms and the arguments are mapped into references
 | |
|     # or literals.
 | |
| 
 | |
|     instructions =
 | |
|       %{'01' => :add,
 | |
|         '02' => :multiply,
 | |
|         '03' => :input,
 | |
|         '04' => :output,
 | |
|         '05' => :jump_if_true,
 | |
|         '06' => :jump_if_false,
 | |
|         '07' => :less_than,
 | |
|         '08' => :equal_to,
 | |
|         '99' => :return}
 | |
| 
 | |
|     case xs do
 | |
|       [:add, a, b, {:positional, out} | rest] ->
 | |
|         a = interpret_param(a, xs)
 | |
|         b = interpret_param(b, xs)
 | |
|         Interpretter.interpret(i + 3, List.insert_at(xs, out, a + b))
 | |
| 
 | |
|       [:multiply, a, b, {:positional, out} | rest] ->
 | |
|         a = interpret_param(a, xs)
 | |
|         b = interpret_param(b, xs)
 | |
|         Interpretter.interpret(i + 3, List.insert_at(xs, out, a * b))
 | |
| 
 | |
|       [:input, a | rest] -> nil
 | |
|       [:output, a | rest] -> nil
 | |
|       [:jump_if_true, a, b | rest] -> nil
 | |
|       [:jump_if_false, a, b | rest] -> nil
 | |
|       [:less_than, a, b, out | rest] -> nil
 | |
|       [:equal_to, a, b, out | rest] -> nil
 | |
|       [:return | _rest] -> nil
 | |
|     end
 | |
|   end
 | |
| end
 |