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." .... . .-.. .-.. --- --..-- .-- --- .-. .-.. -.. .-.-.-
マクロじゃなきゃダメなんですか? 関数じゃダメですか?
実用性のなさは置いといて、マクロはコンパイル時に解決されるので実行は速くなります。
おまけ:寿マクロ
もはや文字列リテラル関係ないし何の意味もないが小ネタ放出ということで。
macro 寿(x) eval(x) end @寿 f(x) = x # 関数が定義できる。めでたい。
反省
しかしネタにしても数少ないな。草リテラルと同じ語尾変える系ならいくらでも作れるけど、プログラミングっぽい実用新案は思いつかないから仕方ない。本気でやらないとつまらんよこういうのは。