/var/log/messages

Feb 18, 2019 - 4 minute read - Comments - programming

Metaprogramming Elixir (7)

Advanced Compile-Time Code Generation の Chapter 3 です。最初に出てくるのは UnicodeData.txt を例にした外部データがコード生成手続きを呼び出す例。

一つには以下な情報 (一部のみ) を行単位で読みこんで

application/javascript  .js
application/json        .json
image/jpeg              .jpeg, .jpg
video/jpeg              .jpgv

リストにしてそれに手続きを割り当てる、という事をしてます。これはこれで便利。そしてこのテキストファイルを更新した時点でコンパイルも動かしてしまえ、という属性があるとのこと。これは凄い。

Feb 17, 2019 - 3 minute read - Comments - programming

Metaprogramming Elixir (6)

ちょっと復習。accumulate:true な記述のあたりを列挙しておきます。

  • モジュール属性を使用すると、コンパイル時にデータをモジュールに格納できる
  • これらは他の言語で定数が適用される場所でよく使われるが、Elixirはコンパイル時に悪用するための他のトリックを提供する
  • 属性を登録するときにaccumulate:trueオプションを利用することで、コンパイル段階で登録された追加リストを保持できる
  • モジュールがコンパイルされた後、属性にはコンパイル中に発生したすべての登録のリストが含まれる

accumulate:true が今ひとつ理解できていないのかどうか。てか、翻訳時に評価された値が属性に値として格納される、ってことなのか。そしてここで問題になってくるのが評価される順番なのね。

Feb 16, 2019 - 3 minute read - Comments - programming

Metaprogramming Elixir (5)

コードの生成に module attributes を使う、とのこと。翻訳時にモジュールに格納されてるデータにアクセスできる、なのかどうか。

accumulate:true

というオプションが attribute を登録する時に云々、とあります。

test macro

二つの argument を受け取る、とのこと。

  • string description (キーワードリスト?)
  • do/end なコードブロック

Feb 15, 2019 - 2 minute read - Comments - programming

Metaprogramming Elixir (4)

ゴールは他のモジュールを test macro で拡張すること、らしい。以下な testing framework を、との事です。

defmodule MathTest do
  use Assertion

  test "integers can be added and subtracted" do
    assert 1 + 1 == 2
    assert 2 + 3 == 5
    assert 5 - 5 == 10
  end

  test "integers can be multiplied and divided" do
    assert 5 * 5 == 25
    assert 10 / 2 == 5
  end
end

実行例が以下らしい。

iex> MathTest.run
..
===========================
FAILURE: integers can be added and subtracted
===========================
   Expected:       0
   to be equal to: 10
..:ok

Feb 11, 2019 - 2 minute read - Comments - programming

Metaprogramming Elixir (2)

マクロは caller のためのコードを生成するのではなく注入 (inject) する、とあります。コンテキストに注入、という表現になっていますね。コンテキストとは caller の

  • bindings
  • imports
  • aliases

とあります。

Feb 10, 2019 - 2 minute read - Comments - programming

Metaprogramming Elixir (1)

こちらも再確認に着手。

quote do で AST が確認できる、というのがアレゲです。

iex(4)> quote do: div(10,2)
{:div, [context: Elixir, import: Kernel], [10, 2]}
iex(5)> quote do: 1 + 2    
{:+, [context: Elixir, import: Kernel], [1, 2]}

あと、if がマクロ、というのもナニ (何