강좌

  1. Elixir School ... 무료로 기본을 배울 수 있다.

elixir 함수형프로그램의 특징

  • 변환 프로그래밍: 프로그래밍은 데이터를 변환하는 것이 중식

  • 데이터를 변환하는 것은 함수이며, 함수들의 조합이 프로그램

  • 함수들을 작고 한가지 목적에만 집중하게 만들수록, 더 유연하고 테스트 쉬운 구조

  • 로직 설계의 변경은 함수의 재조합

    메타프로그래밍과 매크로

  • 메타프로그래밍: 코드로 코드를 작성하는 방법

  • 고수준의 우아한 문법으로 저수준의 코드 조작

  • 컴파일 타임에 코드 최적화: 성능 향상과 깔끔한 코드를 동시에 잡을 수 있음

  • 매크로를 통해 스스로 확장, 안정적이고 성숙된 문법들

  • 엘릭서 표준 라이브러리의 Logger 모듈의 디버깅 함수

Actor 동시성 모델

  • 엘릭서에서 액터는 프로세스
  • 프로세스는 특정 작업을 수행
  • 서로 결리된 프로세스들은 메세지를 보내 소통
  • 프로세스는 ErlangVM(BEAM)위에서 돌아가며 자원이 매우 적게 사용

예제

  1. 엑셀을 파싱하여 등록할 사용자 정보 추출(Parser)
  2. 사용자 등록(Register)
  3. 등록 결과 메세지 전송(Reporter)

    설치

MAC

$ brew install elixir

interactive mode

$ iex
Erlang/OTP 26 [erts-14.0.2] [source] [64-bit] [smp:10:10] [ds:10:10:10] [async-threads:1] [jit] [dtrace]

Interactive Elixir (1.15.7) - press Ctrl+C to exit (type h() ENTER for help)
iex>

Package 관리

javascript의 npm과 같이 package 관리 메니저가 별도로 있습니다. mix hex 를 통해서 관리할 수 있습니다.

Hex v2.0.6
Hex is a package manager for the Erlang ecosystem.

Available tasks:

mix hex.audit                                         # Shows retired Hex deps for the current project

mix hex.build                                         # Builds a new package version locally

mix hex.config                                        # Reads, updates or deletes local Hex config
mix hex.config KEY                                    # Get config value for KEY
mix hex.config KEY --delete                           # Delete config value for KEY
mix hex.config KEY VALUE                              # Set config KEY to VALUE

mix hex.docs fetch PACKAGE [VERSION]                  # Fetch documentation for offline use
mix hex.docs offline PACKAGE [VERSION]                # Open a browser window with offline documentation
mix hex.docs online PACKAGE [VERSION]                 # Open a browser window with online documentation

mix hex.info                                          # Prints Hex information
mix hex.info PACKAGE [VERSION]                        # Prints package information

mix hex.organization auth ORGANIZATION                # Authorize an organization
mix hex.organization deauth ORGANIZATION              # Deauthorize and remove organization
mix hex.organization list                             # List all authorized organizations
mix hex.organization key ORGANIZATION generate        # Generate organization key
mix hex.organization key ORGANIZATION revoke KEY_NAME # Revoke key
mix hex.organization key ORGANIZATION revoke --all    # Revoke all keys
mix hex.organization key ORGANIZATION list            # List keys

mix hex.outdated                                      # Shows outdated Hex deps for the current project
mix hex.outdated [APP]                                # Shows outdated Hex deps for the given dependency

mix hex.owner add PACKAGE EMAIL_OR_USERNAME           # Adds an owner to package
mix hex.owner transfer PACKAGE EMAIL_OR_USERNAME      # Transfers ownership of a package to another user or organization
mix hex.owner remove PACKAGE EMAIL_OR_USERNAME        # Removes an owner from package
mix hex.owner list PACKAGE                            # List all owners of a given package
mix hex.owner packages                                # List all packages owned by the current user

mix hex.package fetch PACKAGE [VERSION] [--unpack]    # Fetch the package
mix hex.package diff APP VERSION                      # Diff dependency against version
mix hex.package diff PACKAGE VERSION1 VERSION2        # Diff package versions
mix hex.package diff PACKAGE VERSION1..VERSION2       # Diff package versions

mix hex.publish                                       # Publishes a new package version
mix hex.publish package                               # Publish current package
mix hex.publish docs                                  # Publish current docs
mix hex.publish package --revert VERSION              # Reverts package on given version
mix hex.publish docs --revert VERSION                 # Reverts docs on given version
mix hex.publish --revert VERSION                      # Reverts given version

mix hex.registry build PUBLIC_DIR                     # Build a local registry

mix hex.repo add NAME URL                             # Add a repo
mix hex.repo set NAME                                 # Set config for repo
mix hex.repo remove NAME                              # Remove repo
mix hex.repo show NAME                                # Show repo config
mix hex.repo list                                     # List all repos

mix hex.retire PACKAGE VERSION REASON                 # Retires a package version
mix hex.retire PACKAGE VERSION --unretire             # Unretires a package

mix hex.search PACKAGE                                # Searches for package names

mix hex.sponsor                                       # Show Hex packages accepting sponsorships

mix hex.user register                                 # Register a new user
mix hex.user whoami                                   # Prints the current user
mix hex.user auth                                     # Authorize a new user
mix hex.user deauth                                   # Deauthorize the user
mix hex.user key generate                             # Generate user key
mix hex.user key revoke KEY_NAME                      # Removes given key from account
mix hex.user key revoke --all                         # Revoke all keys
mix hex.user key list                                 # Lists all keys associated with your account
mix hex.user reset_password account                   # Reset user account password
mix hex.user reset_password local                     # Reset local password


Further information can be found here: https://hex.pm/docs

빌드

$ mix escript.build
$ ./example_app --upcase Hello
HELLO

다른 프로그램 소스를 사용해서 빌드하는 방법

$ mix deps.get
$ mix compile

개발툴

표준 라이브러리

  • 엘릭서에 내장 된 표준 테스트 라이브러리 제공
  • 매크로를 사용하여 간편한 문법
    test "elixir test example" do
    assert something_is_valid()
    assert expect_list() == actual_list()
    assert expect_error_log() =~ "error"
    end
  • document + test = doctest
    defmodule ExampleCode do
    @moduledoc """
    @doc """
    어떻게어떻게 하는 함수
    """
    def sum(a, b) do
      a + b
    end

iex

$ iex

livebook

python의 jupiter와 비슷한 기능

IDE

정식으로 erlang, elixir 만 지원하는 에디터는 없습니다. 커뮤니티에서는 neovim를 추천합니다. vscode 에서도 잘 작동합니다.

  • gen_lsp link
  • credo link
  • elixir-lint

    neovim

여기를 참고해서 설정했습니다.

tree-sitter가 설치되어 있는 상태에서

:TSInstall elixr

vscode

플러그인 설치

  • elixir-tools

    jetbrains intelliJ

SDK 파일을 불러 와야 하는데, brew로 설치를 했을 경우에는 폴더가 버전마다 다르기 때문에 위치를 잘 찾아야 한다.

elixr 파일 위치

$ readlink (which elixir)
../Cellar/elixir/1.15.7/bin/elixir

erlang 파일 위치

$ readlink (which erlc)
../Cellar/erlang/26.0.2/bin/erlc

파일 위치에서 버전명까지 넣어주면 된다.

  1. elixir plugin 설치
  2. SDK 설정
    1. elixir > SDKs: /opt/homebrew/Cellar/elixir/1.15.7
    2. elixir > Internal Erlang SDKs: /opt/homebrew/Cellar/erlang/26.0.2
반응형

+ Recent posts