Julia のマクロによる日本語文字列リテラル

くだらない小ネタでしかも二番煎じっていう…

Fun with Unicode and Julia - IainDunning.com

  1. Julia のソースコードには日本語が使える
  2. Julia ではマクロでユーザー定義の文字列リテラルを宣言できる

2 について例示すると、正規表現リテラル r"^\s*(?:#|$)" のようなものもマクロで定義された正規表現オブジェクトに過ぎない (see julia/base/regex.jl at master · JuliaLang/julia)。

以上の知識を利用すると変なリテラルを作れるよんという話。

リテラル

文章に草を生やします。

macro 草_str(text)
    sentences = split(text, r"[、。]")
    string(join(sentences, "www"), "www")
end

julia> 草"笑った、面白い。"
笑ったwww面白いwwwwww

突然の死リテラル

なんか突然死にます。

macro 凸_str(text)
    len = length(text)
    upper = join(fill("人", (2 + len)))
    lower = join(fill("Y", (2 + len)), "^")

    result = string(
                "_$(upper)_\n",
                "> $(text) <\n",
                " ̄$(lower) ̄"
                )
    result
end

julia> 凸"突然の死"
_人人人人人人_
> 突然の死 <
 ̄Y^Y^Y^Y^Y^Y ̄

モールス信号リテラル

これは日本語関係ないですが思いついたので載せとく。アルファベットをモールス信号に変換してくれる。

macro m_str(text)
    # コピペ
    # http://svn.python.org/projects/python/trunk/Demo/scripts/morse.py
    morsetab = {
        'A' => ".-",              'a' => ".-",
        'B' => "-...",            'b' => "-...",
        'C' => "-.-.",            'c' => "-.-.",
        'D' => "-..",             'd' => "-..",
        'E' => ".",               'e' => ".",
        'F' => "..-.",            'f' => "..-.",
        'G' => "--.",             'g' => "--.",
        'H' => "....",            'h' => "....",
        'I' => "..",              'i' => "..",
        'J' => ".---",            'j' => ".---",
        'K' => "-.-",             'k' => "-.-",
        'L' => ".-..",            'l' => ".-..",
        'M' => "--",              'm' => "--",
        'N' => "-.",              'n' => "-.",
        'O' => "---",             'o' => "---",
        'P' => ".--.",            'p' => ".--.",
        'Q' => "--.-",            'q' => "--.-",
        'R' => ".-.",             'r' => ".-.",
        'S' => "...",             's' => "...",
        'T' => "-",               't' => "-",
        'U' => "..-",             'u' => "..-",
        'V' => "...-",            'v' => "...-",
        'W' => ".--",             'w' => ".--",
        'X' => "-..-",            'x' => "-..-",
        'Y' => "-.--",            'y' => "-.--",
        'Z' => "--..",            'z' => "--..",
        '0' => "-----",           ',' => "--..--",
        '1' => ".----",           '.' => ".-.-.-",
        '2' => "..---",           '?' => "..--..",
        '3' => "...--",           ';' => "-.-.-.",
        '4' => "....-",           ':' => "---...",
        '5' => ".....",           '"' => ".----.",
        '6' => "-....",           '-' => "-....-",
        '7' => "--...",           '/' => "-..-.",
        '8' => "---..",           '(' => "-.--.-",
        '9' => "----.",           ')' => "-.--.-",
        ' ' => " ",               '_' => "..--.-"
    } 
    join(map(x -> morsetab[x], collect(text)), " ")
end

julia> m"Hello, World."
.... . .-.. .-.. --- --..--   .-- --- .-. .-.. -.. .-.-.-

マクロじゃなきゃダメなんですか? 関数じゃダメですか?

実用性のなさは置いといて、マクロはコンパイル時に解決されるので実行は速くなります。

おまけ:寿マクロ

もはや文字列リテラル関係ないし何の意味もないが小ネタ放出ということで。

function を寿にできると嬉しいらしい

macro 寿(x)
    eval(x)
end

@寿 f(x) = x # 関数が定義できる。めでたい。

反省

しかしネタにしても数少ないな。草リテラルと同じ語尾変える系ならいくらでも作れるけど、プログラミングっぽい実用新案は思いつかないから仕方ない。本気でやらないとつまらんよこういうのは。