Lua の識別子に日本語を使う

Lua の変数名や関数名として,日本語を使えるようにしようという話. Lua 5.2.2 のソースに次のパッチを当てると,UTF-8 や EUC-JP で書かれた日本語を使えるようになる.残念ながら ShiftJIS はこれではダメ.

diff -ur src/lctype.h src-uid/lctype.h
--- src/lctype.h	2011-07-15 21:50:29.000000000 +0900
+++ src-uid/lctype.h	2013-10-23 18:35:29.000000000 +0900
@@ -54,8 +54,8 @@
 /*
 ** 'lalpha' (Lua alphabetic) and 'lalnum' (Lua alphanumeric) both include '_'
 */
-#define lislalpha(c)	testprop(c, MASK(ALPHABIT))
-#define lislalnum(c)	testprop(c, (MASK(ALPHABIT) | MASK(DIGITBIT)))
+#define lislalpha(c)	(testprop(c, MASK(ALPHABIT)) || (c) >= 0x80)
+#define lislalnum(c)	(testprop(c, (MASK(ALPHABIT) | MASK(DIGITBIT))) || (c) >= 0x80)
 #define lisdigit(c)	testprop(c, MASK(DIGITBIT))
 #define lisspace(c)	testprop(c, MASK(SPACEBIT))
 #define lisprint(c)	testprop(c, MASK(PRINTBIT))
@@ -80,8 +80,8 @@
 #include <ctype.h>
 
 
-#define lislalpha(c)	(isalpha(c) || (c) == '_')
-#define lislalnum(c)	(isalnum(c) || (c) == '_')
+#define lislalpha(c)	(isalpha(c) || (c) == '_' || (c) >= 0x80)
+#define lislalnum(c)	(isalnum(c) || (c) == '_' || (c) >= 0x80)
 #define lisdigit(c)	(isdigit(c))
 #define lisspace(c)	(isspace(c))
 #define lisprint(c)	(isprint(c))

何のことはない,要は 0x80 以上のバイト文字をすべてアルファベットだと思いなさい,ということ.UTF-8 などであれば,日本語以外の文字も当然使える.

個人的には,日本語を識別子として使うのはトラブルの元でしかないと思っているので,変数名を日本語にしたことはない.とはいえ,そういった需要は少なからず存在するとは思うので,広く使われる言語では日本語を識別子として使えたほうがよい,という主張には賛成する.昔 Java で double π = 3.14; と書けると知ったときは感激したなあ.

コメントを残す

メールアドレスが公開されることはありません。