2008-03-04
Python の lambda の中で手続き的な書き方をする
Python と JavaScript は似てる
でも、 lambda の中に手続き的な書き方ができない
Python の lambda
lambda 引数: 式
で、式の部分にはブロックも書けない。
これでは、 JavaScript 脳の人はコードを書けないではないか!!!
というわけで
lambda の中で手続きを書く方法を考えてみた
逐次処理
(lambda: (
式,
式,
)[-1])
条件分岐
(lambda: ( 式, (lambda: ( 式, 式, 式, )[-1]) if (条件) else (lambda: ( 式, 式, 式, )[-1]), 式, )[-1])
繰り返しは。。。。
まあ、再帰で書くとしておこう
でも><
Python の代入 = は文だった><
なので、 lambda の中で文を書けない。困った。
で、以下のような感じにしてみた
// print も文なので def p(m): print(m) (lambda: ( locals().__setitem__('a', 1), // a = 1, p(a), )[-1])
これはできなかった><
id:nishiohirokazu 曰く locals() が返す値はコピーなのだそうだ
という訳で変数の仕組みは自分で作ることにする
スコープチェーンのクラスを作る
# id:nishiohirokazu に添削されました>< # 直したあとのです>< class Scope(object): def __init__(self, parent = None): self.parent = parent self.hash = {} def var(self, key, value = None): self.hash[key] = value return value def set(self, key, value): if key in self.hash or not(self.parent): self.hash[key] = value else: self.parent.set(key, value) return value def get(self, key): if key in self.hash or not(self.parent): return self.hash[key] else: return self.parent.get(key) def __setattribute__(self, key, value): return self.set(key, value) def __getattr__(self, key): return self.get(key)
使う
_ = Scope()
_.var('hoge', 1) # var hoge = 1
_.f = lambda: ((lambda _: (
_.var('hoge', 2), # var hoge = 2
p(_.hoge), # p(hoge)
)[-1])(Scope(_)));
_.f()
p(_.hoge) # p(hoge)
_.hoge = 3
p(_.hoge)
わーできたよ!
これで JavaScript の function(){} みたいなのができるよ!やった!
突っ込まれた><
Re: Python の lambda の中で手続き的な書き方をする - 西尾泰和のはてなダイアリー
ありがとうございました!直しました!
トラックバック - http://d.hatena.ne.jp/amachang/20080304/1204633733
リンク元
- 129 http://reader.livedoor.com/reader/
- 82 http://phpspot.org/blog/archives/2008/03/200834.html
- 39 http://www.google.com/search?hl=ja&lr=lang_ja&ie=UTF-8&oe=UTF-8&q=javascript+if&num=50
- 38 http://www.google.co.jp/search?sourceid=navclient&hl=ja&ie=UTF-8&rlz=1T4GZEZ_jaJP249JP250&q=ie+重い
- 37 http://b.hatena.ne.jp/hotentry
- 36 http://secure.ddo.jp/~kaku/tdiary/
- 33 http://d.hatena.ne.jp/
- 26 http://lovecall.14.dtiblog.com/
- 26 http://www.google.co.jp/ig?hl=ja
- 25 http://lovecall.14.dtiblog.com/blog-entry-18.html
