One-liner - 既存コードをワンライナーに変換
プログラミング言語の中で特異な存在と言えるワンライナー。複雑なコードをあえて一行で書くのが好きという方もいますし、ターミナルで実行する上でワンライナーを重宝している人もいるでしょう。 そんなワンライナー好きにはたまらないソフトウェアがOne-linerです。なんとあえて普通のコードをワンライナーに変換してくれるソフトウェアです。
One-linerの使い方
実際に実行してみます。最初にオリジナルのコードが出力されます。
$ python ../main.py 6lines.py
Writing to 6lines.ol.py
--- ORIGINAL ---------------------------------
## inspired by https://wiki.python.org/moin/SimplePrograms
import re
for test_string in ['555-1212', 'ILL-EGAL']:
if re.match(r'^\d{3}-\d{4}$', test_string):
print test_string, 'is a valid US local phone number'
else:
print test_string, 'rejected'
----------------------------------------------
555-1212 is a valid US local phone number
ILL-EGAL rejected
--- ONELINED ---------------------------------
(lambda __builtin__: (lambda sys, __y, __d, __print, __exec: [(lambda __d: None)(reduce((lambda __d, __i:[(lambda __after: (lambda ___: __after(__d))(__print(__d.test_string,'is a valid US local phone number')) if __d.re.match('^\\d{3}-\\d{4}$',__d.test_string) else (lambda ___: __after(__d))(__print(__d.test_string,'rejected')))(lambda __d: __d) for __d.test_string in [(__i)]][0]),['555-1212','ILL-EGAL'],__d)) for __d.re in [(__import__('re'))]][0])(__import__('sys'), (lambda f: (lambda x: x(x))(lambda y: f(lambda *args: y(y)(*args)))), type('StateDict',(),__builtin__.__dict__)(), __builtin__.__dict__['print'], __import__('trace').Trace(count=False, trace=False).runctx))(__import__('__builtin__'))
----------------------------------------------
555-1212 is a valid US local phone number
ILL-EGAL rejected
lambdaを多用しているのが分かります。さらにfor文の実行。
$ python ../main.py for.py
Writing to for.ol.py
--- ORIGINAL ---------------------------------
x = 5
for i in range(5):
x = x + i
print x
# inner loop takes in d, returns a modified d?
# list: a list of i
# function: takes in i, d; spits out d
# for loop: takes in d, spits out d
# reduce: function, sequence, initial
# (lambda d.x: (lambda d: print(d.x))(reduce((lambda d, i: (lambda d.x: d)(d.x+i)), range(5), d)))(5)
----------------------------------------------
15
--- ONELINED ---------------------------------
(lambda __builtin__: (lambda sys, __y, __d, __print, __exec: [(lambda __d: __print(__d.x))(reduce((lambda __d, __i:[[__d for __d.x in [((__d.x+__d.i))]][0] for __d.i in [(__i)]][0]),__d.range(5),__d)) for __d.x in [(5)]][0])(__import__('sys'), (lambda f: (lambda x: x(x))(lambda y: f(lambda *args: y(y)(*args)))), type('StateDict',(),__builtin__.__dict__)(), __builtin__.__dict__['print'], __import__('trace').Trace(count=False, trace=False).runctx))(__import__('__builtin__'))
----------------------------------------------
15
こちらも一行のコードに変換されます。あえてこの長さのワンライナーを実行する必要があるのかは分かりませんが、技術的には高度で面白いのではないでしょうか。
One-linerはPython製のソフトウェア(ソースコードは公開されていますがライセンスは明記されていません)です。