《余録》Smalltalk 3分クッキング《問5》逆ポーランド記法
Smalltalk-80 で作成した例題を、Python3.1 で再構成しました。
■ Python3.1 セミナー課題 #102: 逆ポーランド記法
《付記》for 文に伴うシーケンスを変更するとその副作用が問題になるので、これを避けるように指導されることがあります。将来(生涯)プログラマーを目指すみなさんは、SE と違って、その副作用を直視する姿勢が望まれます。そこで、この副作用を逆手に取った、逆ポーランド課題(簡易版)を提示します。
《課題》逆ポーランド記法で書かれた式が、どのように評価されるかを説明してください。
#! /usr/bin/env python # coding: utf-8 ## ---------------------------------------- ## (C) Copyright 2000-2010, 小粒ちゃん《監修》小泉ひよ子とタマゴ倶楽部 ## ---------------------------------------- # ..+....1....+....2....+....3....+....4....+....5....+....6....+....7....+....8 class Stack(list): def push(self, item): if item is None: return self.append(item) def polish(s): """ >>> for e in [ ... "", ... "3", ... "3 4 +", ... "3 4 + 2 *", ... "3 4 + 2 * 5 -", ... "3 4 2 + *", ... "3 4 * 2 /", ... ]: ... polish(e) 3 7 14 9 18 6.0 """ s = Stack(s.split()) acc = None for e in s: if e in "+-*/": op = s.pop() acc = eval("%s %s %s"%(op, e, acc)) else: s.push(acc) acc = eval("%s"%e) else: return acc ## ---------------------------------------- from time import ctime def time_stamp(): print("="*24) print(ctime()) print("="*24) ## ---------------------------------------- from doctest import testmod if __name__=='__main__': time_stamp() testmod()
《Tips》副作用に翻弄されることなく、その副作用を手玉に取れるようになれば、誰かが「もう初心者マークは似合わないね」と言ってくれるかもしれません。(^.^)/~
《付記》残念ながら、Python の組み込み機能は脆弱なので、Smalltalk なら3分クッキングで済むところを、10分余は掛かりそうです。「ピタゴラスイッチ」でも見ながら、しばらくお待ちくださいませ。(_o_)
》作業中です《
Last updated♪2010/01/21