Hatena::ブログ(Diary)

西尾泰和のはてなダイアリー

2010-08-26

日本人の大部分が誤訳する英語

prettier printの論文を読んでいたのだが冒頭の一文

Here <> is the associative operation that concatenates two documents, which has the empty document nil as its left and right unit.

を見て、prettier printを実装したいだけの人が見ても序盤から挫折するんじゃないかなーと思った。それというのも数学者がusing namespace mathして名前をshadowしまくるのがいけない。

今日の昼ごはん(括弧個数ゴルフ)

いつも昼ごはんを一緒に食べている二人がお休みだったので

[10/08/26 13:05:30]: カッコの話ってこれか

[10/08/26 13:05:31]: http://e-arrows.sakura.ne.jp/2010/08/is-lisp-really-has-too-many-parenthesis.html

[10/08/26 13:07:51]: factをlambdaにすれば仮引数の周りの括弧は取り除けるけど

[10/08/26 13:07:59]: 関数のコールの括弧は取り除けないなぁ

[10/08/26 13:08:28]: printの括弧は取り除けるってtwitterで既出だけど

[10/08/26 13:08:47]: タプルの括弧は"%d, %%d" % x % yにすれば取り除ける

[10/08/26 13:09:02]: あとrange使わないでwhileにすれば

[10/08/26 13:09:54]: intとfactの呼び出し2回で6つか

[10/08/26 13:10:36]: intのほうを取り除くのは難しいなぁ。factがなんとかならないかなぁ

[10/08/26 13:11:30]: 再帰呼び出しをやめるか。

[10/08/26 13:16:34]: 2個になった>括弧

ご飯を買いに行く。intの括弧を取り除くのは難しいなぁ。0+"10"とかできればいいけどできないし、正規表現も括弧がいるし…

[10/08/26 13:24:14]: あっ

[10/08/26 13:25:06]: evalするにも括弧がいるなぁとか思っていたがexecなら括弧いらないな

というわけで括弧は全部なくなった。

import sys

exec "N = " + sys.argv[1]
mem = [[1, 1]]
n = 1
while n < N:
    n += 1
    mem += [[n, mem[-1][1] * n]]

for i, f in mem:
    print "%s! = %%s" % i % f

一般に関数をカッコなしで呼び出す方法があれば「もう括弧ゴルフとか飽きたし」っていえるなーと思って少し考えてみたが、タプルがカッコなしで作成できることを利用すれば簡単だった。

>>> x = 1, 2
>>> x
(1, 2)
>>> `x`
'(1, 2)'
>>> exec "y = max" + `x`
>>> y
2

引数を取らない関数を呼ぶときはスライシングで空のタプルを作ればいい。

>>> x[:0]
()

もう括弧ゴルフ飽きたし。まだ昼休み20分くらい残ってるし。

PrettyPrint 1

とりあえず論文のHaskellで書かれた実装を帰りの電車で気合でPythonに逐語訳した。写経。まだ実行すらしていないので構文エラーとかあるかも。Python向きの設計はこれから考える。続きは明日の出勤電車で。

http://gist.github.com/551349