Hello World / plɹoM ollǝH

Programmers Live in Vain

テキストから Node Graph 作成

Node Graph のデータをテキストにしてみます。

テキストデータ

各行でノードを定義する。 左辺に名前、右辺に定義を書く。 右辺がリストとして解釈された場合、第一要素には型名、第二要素には接続元のリストを記述する。 リスト型で解釈されない場合は値を保持するだけのノードとみなす。

a="月日は"
b="百代の過客にして"
c="行かふ年も"
d="又旅人也"
e=["Add",["a","b"]]
f=["Add",["c","d"]]
g=["Add",["e","f"]]
h=0.1
i=1
j=["Add",["h","i"]]

Python

テキストデータを読み込んでノードに変換する。

# conding: utf-8
import json,codecs

# 値を保持するだけのノード
class Value:
    def __init__(self, in_value):
        self.value = in_value
    def __call__(self):
        return self.value

# 加算ノード
class Add:
    def __init__(self, in_x, in_y):
        self.x = in_x
        self.y = in_y
    def __call__(self):
        return self.x() + self.y()

# ファイル読み込み
def load(path):
    nodes = {}
    # 右辺評価
    def _rhs(exp):
        x = json.loads(exp)
        if isinstance(x, list):
            node, args = x
            return (globals()[node])(*[nodes[a] for a in args])
        else:
            return Value(x)
    # 一行ずつ解釈
    with codecs.open(path, 'rb', 'utf-8-sig') as f:
        for s in f.readlines():
            k, v = [x.strip() for x in s.split('=',1)]
            nodes[ k ] = _rhs(v)
    return nodes

# ファイルを読み込んでグラフ作成
graph = load('data.txt')
# ノードを評価
print(graph["g"]())
print(graph["j"]())

実行結果

月日は百代の過客にして行かふ年も又旅人也
1.1

パーサー書くの面倒くさい。