開発環境
- OS X Mavericks - Apple(OS)
- Emacs (CUI)、BBEdit - Bare Bones Software, Inc. (GUI) (Text Editor)
- Python 3.4 (プログラミング言語)
let 代金 = 個数*単価 // 順番が逆なので🙅 #義務教育化されたプログラミングの授業風景
— Dan Kogai (@dankogai) 2014, 6月 12
@dankogai そもそも回答が左に来ているのは間違い。
個数*単価 = 代金 Q.E.D.
という文法のプログラミング言語を作る所から始める。
— AXION (@AXION_CAVOK) 2014, 6月 12
ワシの知るかぎり、主な算譜言語で右辺値に代入できるのは R の -> だけだなあ( <- もある)。<@AXION_CAVOK そもそも回答が左に来ているのは間違い。 個数*単価 = 代金 Q.E.D. という文法のプログラミング言語を作る所から始める。
— Dan Kogai (@dankogai) 2014, 6月 13
JavaScript - 個数*単価 = 代金, 代金 = 個数*単価 ( @AXION_CAVOK , @dankogai )
クラスベースのオブジェクト指向(今回は python 3.4 )と、どちらが書きやすいか、比較のために書いてみた。(今回はかけ算じゃなくて足し算で。)
コード(BBEdit, Emacs)
constraint_system.py
#!/usr/bin/env python3
#-*- coding: utf-8 -*-
class Constraint:
def __init__(self): pass
def process_new_value(self): pass
def process_forget_value(self): pass
class Connector:
def __init__(self):
self.value = None
self.informant = None
self.constraints = []
@staticmethod
def for_each_except(exception, bln, items):
for item in items:
if item != exception:
if bln:
item.process_new_value()
else:
item.process_forget_value()
return 'done'
@property
def has_value(self):
return self.informant != None
def set_value(self, newval, setter):
if not self.has_value:
self.value = newval
self.informant = setter
return self.for_each_except(setter, True, self.constraints)
if self.value != newval:
raise Exception('Contradiction {0}, {1}'.format(self.value, newval))
return 'ignored'
def forget_value(self, retractor):
if retractor == self.informant:
self.informant = None
return self.for_each_except(
retractor, False, self.constraints)
return 'ignored'
def connect(self, constraint):
try:
self.constraints.index(constraint)
except:
self.constraints.insert(0, constraint)
if self.has_value:
constraint.process_new_value()
return 'done'
def probe(self, name):
p = Probe(name, self)
self.connect(p)
class Probe(Constraint):
def __init__(self, name, connector):
self.name = name
self.connector = connector
def print_probe(self, value):
print('Probe: {0} = {1}'.format(self.name, value))
def process_new_value(self):
self.print_probe(self.connector.value)
def process_forget_value(self):
self.print_probe('?')
class Adder(Constraint):
def __init__(self, a1, a2, s):
self.a1 = a1
self.a2 = a2
self.s = s
self.a1.connect(self)
self.a2.connect(self)
self.s.connect(self)
def process_new_value(self):
if self.a1.has_value and self.a2.has_value:
self.s.set_value(self.a1.value + self.a2.value, self)
elif self.a1.has_value and self.s.has_value:
self.a2.set_value(self.s.value - self.a1.value, self)
elif self.a2.has_value and self.s.has_value:
self.a1.set_value(self.s.value - self.a2.value, self)
def process_forget_value(self):
self.s.forget_value(self)
self.a1.forget_value(self)
self.a2.forget_value(self)
self.process_new_value()
if __name__ == '__main__':
a1 = Connector()
a2 = Connector()
s = Connector()
adder = Adder(a1, a2, s)
i = 'kamimura'
a1.probe('a1')
a2.probe('a2')
s.probe('sum')
try:
a1.set_value(10, i)
a2.set_value(20, i)
a1.forget_value(i)
s.set_value(100, i)
s.set_value(200, i)
except Exception as err:
print(err)
入出力結果(Terminal, IPython)
$ ipython
Python 3.4.1 (default, May 21 2014, 01:39:38)
Type "copyright", "credits" or "license" for more information.
IPython 2.1.0 -- An enhanced Interactive Python.
? -> Introduction and overview of IPython's features.
%quickref -> Quick reference.
help -> Python's own help system.
object? -> Details about 'object', use 'object??' for extra details.
In [1]: from constraint_system import *
In [2]: a1 = Connector()
In [3]: a2 = Connector()
In [4]: s = Connector()
In [5]: adder = Adder(a1, a2, s)
In [6]: i = 'kamimura'
In [7]: a1.probe('a1')
In [8]: a2.probe('a2')
In [9]: s.probe('sum')
In [10]: a1.set_value(10, i)
Probe: a1 = 10
Out[10]: 'done'
In [11]: a2.set_value(20, i)
Probe: a2 = 20
Probe: sum = 30
Out[11]: 'done'
In [12]: a1.forget_value(i)
Probe: a1 = ?
Probe: sum = ?
Out[12]: 'done'
In [13]: s.set_value(100, i)
Probe: sum = 100
Probe: a1 = 80
Out[13]: 'done'
In [14]: s.set_value(100, i)
Out[14]: 'ignored'
In [15]: quit()
$ ./constraint_system.py
Probe: a1 = 10
Probe: a2 = 20
Probe: sum = 30
Probe: a1 = ?
Probe: sum = ?
Probe: sum = 100
Probe: a1 = 80
Contradiction 100, 200
$
単純に、好みによるかな〜
0 コメント:
コメントを投稿