《余録》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