It turns out that I think my assumption about how the BF interpreter works 
is wrong, but I want to continue this discussion because while my 
interpreter may be bad, I still don't know the answer to my Elixir 
question. :) 

Torben - thanks for the idea! I did try it with function pattern matching. 
However, the actual command is dataptr - 1 , so that needs to run first. 
*Then* if the dataptr is less than 0, the other check runs.  The way you've 
suggested it in the first command assumes that the < command has already 
been run. :) 

Here's what I tried with pattern matching, which is even less 
comprehensible than that simple little if statement at the top.

  def command("<", state = %{data: data, dataptr: dataptr}) when is_list(
data) and is_integer(dataptr) and dataptr >= 0 do
    do_trim(%{state | dataptr: dataptr - 1})
  end

  def do_trim(state = %{data: data, dataptr: dataptr}) when dataptr < 0 do 
    %{state | dataptr: 0, data: tl(data) }
  end

  def do_trim(state = %{data: data, dataptr: dataptr}), do: state

Having been a programmer for 23 years, I'm a huge fan of writing code that 
my tired, burned out, working-on-the-weekend-because-release-date-is-Monday 
future self won't have to think about too hard to understand. 

Nothing I've come up with so far is as clear as that simple little if 
statement.



On Tuesday, August 23, 2016 at 8:24:51 AM UTC-5, Torben Hoffmann wrote:
>
> Hi Brian,
>
> How about this?
>
>   def command("<", state= %{dataprt: 0}) do
>     {:ok, %{state | data: tl(data)}}
>   end
>
>   def command("<", state) do
>     {:ok, %{state | dataprt: state.dataptr - 1}}
>   end
>
> By using the pattern matching in the function clauses you get code that 
> reads like your description of the problem.
> I.e., if the dataptr is zero pop the data stack otherwise decrement the 
> dataptr.
>
> Cheers,
> Torben
>
> On 23 August 2016 at 15:08, Brian Bugh <brai...@gmail.com <javascript:>> 
> wrote:
>
>> Here's another ugly one I came up with (with the complete function for 
>> reference) that is even worse. 
>>
>> def command("<", state = %{data: data, dataptr: dataptr}) when is_list(
>> data) and is_integer(dataptr) and dataptr >= 0 do
>>   dataptr = dataptr - 1
>>
>>   state = case state do
>>     %{dataptr: dataptr} when dataptr < 0 -> %{state | dataptr: 0, data: 
>> tl(data) }
>>     _ -> state
>>   end
>>
>>   {:ok, %{state | dataptr: dataptr, data: data}}
>> end
>>
>> Usually when I get stuck like this it means I'm overthinking something. 
>>
>> Any suggestions?
>>
>>
>> On Tuesday, August 23, 2016 at 7:51:22 AM UTC-5, Brian Bugh wrote:
>>>
>>> For fun and profit, I am writing a Brainf**k interpreter in Elixir.
>>>
>>> In one particular case, a data pointer should be decremented, and if 
>>> it's less than 0, it should be set to 0 and the top of the data stack 
>>> should be popped off.
>>>
>>> I assumed that I should write something like this (which passes my :
>>>
>>> dataptr = dataptr - 1
>>>
>>> if dataptr < 0 do
>>>   dataptr = 0
>>>   data = tl data
>>> end
>>>
>>> but I get a compiler warning when I do this. It suggested that I use the 
>>> assignment form of *if*, which is fine, but I can't find an elegant way 
>>> to write the code now. This is what I came up with, which seems uglier and 
>>> unnecessarily verbose for future readers. The first form above is much more 
>>> readable.
>>>
>>> [dataptr | data] = if dataptr < 0 do
>>>   [0 | tl data]
>>> else
>>>   [dataptr | data]
>>> end
>>>
>>> Is there a better Elixir-way to write this?
>>>
>> -- 
>> You received this message because you are subscribed to the Google Groups 
>> "elixir-lang-talk" group.
>> To unsubscribe from this group and stop receiving emails from it, send an 
>> email to elixir-lang-ta...@googlegroups.com <javascript:>.
>> To view this discussion on the web visit 
>> https://groups.google.com/d/msgid/elixir-lang-talk/bfcb8bdf-aede-4955-ac50-a6ac6dde3e5a%40googlegroups.com
>>  
>> <https://groups.google.com/d/msgid/elixir-lang-talk/bfcb8bdf-aede-4955-ac50-a6ac6dde3e5a%40googlegroups.com?utm_medium=email&utm_source=footer>
>> .
>>
>> For more options, visit https://groups.google.com/d/optout.
>>
>
>
>
> -- 
> http://www.linkedin.com/in/torbenhoffmann
> @LeHoff
>

-- 
You received this message because you are subscribed to the Google Groups 
"elixir-lang-talk" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to elixir-lang-talk+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/elixir-lang-talk/743c6c3e-0def-4cf6-8dee-2338a19c0ef6%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to