Elixir 스크립트, 할 수 있는 것과 할 수 없는 것

mix.exs 외부에서는 .exs 파일을 많이 다루지 않았습니다. 여러분 중 일부도 마찬가지일 것이라고 생각합니다. 그러나 최근에 필요한 상황에 직면했습니다.

나는 내 엘릭서 프로젝트를 도커 컨테이너에 넣고 싶었습니다. 그래서 실행할 때 사용자 입력을 기다리는 터미널로 바로 들어갈 수 있었습니다. 입력을 한 줄씩 수집하고 빈 줄이 주어지면 해당 줄의 목록을 모두 반환합니다. 프로그램의 ENTRYPOINT로 엘릭서 스크립트를 만드는 것이 옳은 일이라고 느꼈습니다. 그러나 나는 elixir 스크립트로 할 수 있는 것과 할 수 없는 것의 한계를 이해하기 위한 실질적인 문서 및/또는 예제를 찾기 위해 고군분투했습니다.

약간의 시행 착오 끝에 나는 작동하는 몇 가지 비트를 발견하고 내 프로젝트에 사용할 수 있는 것을 얻을 때까지 거기에서 반복하기 시작했습니다. 다음은 코드가 동일한 작업을 수행하지만 형식과 레이아웃이 다른 경우의 예입니다. 참고로 터미널의 코드 스니펫을 위해 파일 이름을 지정했습니다start.exs.

또한 나와 같은 문제를 겪었을 수 있는 다른 사람을 위해 IO.stream ( docs )을 살펴봅니다.

함수를 정의할 수 있습니다!



돌이켜 보면 (항상 20/20) 이것은 의미가 있지만 어떤 이유로 든 당신이 이것을 할 수 있다는 생각이 들지 않았습니다. 일반 엘릭서 모듈과 비교했을 때 유일한 차이점은 파일 끝에서 함수를 호출한다는 것입니다.

defmodule Lines do
  def run(lines \\ []) do
    case IO.read(:stdio, :line) do
      "\n" ->
        # done reading lines!
        lines
        |> Enum.reverse()
        |> Enum.map(&String.replace(&1, "\n", ""))
        |> IO.inspect()

      line ->
        run([line | lines])
    end
  end
end

Lines.run()



$ elixir start.exs
hi
there

["hi", "there"]


아니요, 저는 제 기능이 익명인 것을 선호합니다.



어떤 이유로든 모듈이나 함수를 정의하고 싶지 않은 경우를 위한 또 다른 접근 방식이 있습니다.

IO.stream(:stdio, :line)
|> Enum.reduce_while([], fn line, lines ->
  case line do
    "\n" -> {:halt, lines |> Enum.reverse()}
    line -> {:cont, [line | lines]}
  end
end)
|> Enum.map(&String.replace(&1, "\n", ""))
|> IO.inspect()



$ elixir start.exs
hi
there

["hi", "there"]


최종 형태를 위한 시간




IO.stream(:stdio, :line)
|> Enum.take_while(&(&1 != "\n"))
|> Enum.map(&String.replace(&1, "\n", ""))
|> IO.inspect()



$ elixir start.exs
hi
there

["hi", "there"]



결론



이 기사의 요점은 코드가 아니라 전통적인 엘릭서 코드만 다룬 후에 범위 지정 문제를 해결하는 데 어려움을 겪었던 것 같습니다. 바라건대, 여러분이 비슷한 상황에 처해 있다면 원래 생각했던 것보다 더 많은 유연성이 있다는 것을 이제 알 수 있을 것입니다.
IO.stream 문서와 관련하여. 일부 수정을 위해 a PR을 만들었습니다.

좋은 웹페이지 즐겨찾기