/var/log/messages

Jan 28, 2019 - 1 minute read - Comments - programming

プログラミング Elixir (12)

StringsAndBinaries-1 がよく分からんので、直前にある Parse の動作確認をしてみることに。

iex(1)> c "parse.exs"
[Parse]
iex(2)> Parse.number('123')
123
iex(3)> Parse.number('-123')
-123
iex(4)> Parse.number('+123')
123
iex(5)> Parse.number('a')   
** (RuntimeError) Invalud digit 'a'
    parse.exs:12: Parse._number_digits/2

なるほど。実装は以下なんですが

defmodule Parse do
  def number([ ?- | tail ]), do: _number_digits(tail, 0) * -1
  def number([ ?+ | tail ]), do: _number_digits(tail, 0)
  def number(str),           do: _number_digits(str, 0)

  defp _number_digits([], value), do: value
  defp _number_digits([ digit | tail ], value)
  when digit in '0123456789' do
    _number_digits(tail, value*10 + digit - ?0)
  end
  defp _number_digits([ non_digit | _ ], _) do
    raise "Invalud digit '#{[non_digit]}'"
  end
end

ここに追加、で良いのかどうか。ただ、上記実装が理解できていないのがアレです。

  • number([ ?- | tail]) は先頭がマイナス、なソレなのか
  • number([ ?+ | tail]) は先頭プラス
  • number(str) はまんまアレですね

ということは上記はどちらかというと atoi な類ですね。とは言え、when 使えば良いらしい、ということは分かりました。head の値が 32 以上 126 以下なら印字できる ascii ってことで良いのか。

  def ascii?(str) do
    _ascii?(str)
  end
  defp _ascii?([]), do: true
  defp _ascii?([head | tail])
  when head >= 32 and head <= 126 do
    true
  end
  defp _ascii?([non_ascii | _]), do: false

どうやら良さげに見えます。

追記

これ、駄目じゃないですかorz

と思ったら

実装は以下になっていたorz

  def ascii?(str) do
    _ascii?(str)
  end
  defp _ascii?([]), do: true
  defp _ascii?([head | tail])
  when head >= 32 and head <= 126 do
    _ascii?(tail)
  end
  defp _ascii?([_ | _]), do: false

#fukuokaex (#kokuraex) 買い物リスト

comments powered by Disqus