Python には import という便利な機能がある。これを使えばファイルを分割して管理できる。ちょっとしたライブラリが書けるというわけだ。
まずは簡単なところで定数をライブラリ化しよう。
SOH = 0x01
STX = 0x02
EOT = 0x04
ACK = 0x06
DLE = 0x10
NAK = 0x15
CAN = 0x18
これは、次の記事で使う予定の xmodem が使うアスキーコード。必要なところだけを書いている。(おって、全部に対応する予定)
使う側は python と同じ方法で import 出来る。
from ascii_const import EOT, ACK, NAK, CAN
class や関数も同様に import 出来る。次の記述は x_mem という class と定数を import した例である。
from xmodem_mem import x_mem, CMD_NOP, CMD_WRITE, CMD_READ, BLOCK_SIZE
@module
class xmodem_m2q:
def __init__(self):
self.xmodem_in_q = Queue(bit8, 'in', maxsize=128)
self.xmodem_out_q = Queue(bit8, 'out', maxsize=128)
self.mem = x_mem()
self.idouk = Queue(bit8, 'out')
self.append_worker(self.worker)
...
後略
...
これはかなり強力だ。class から動的にオブジェクトを生成するとることは出来ないが、init からであれば、それは静的に配置される。x_mem のコンストラクタを見てみよう。
@module
class x_mem:
def __init__(self, max_block_n = 8):
self.max_block_n = max_block_n
self.bin_in_q = Queue(bit8, 'in', maxsize=128)
self.bin_out_q = Queue(bit8, 'out', maxsize=128)
self.cmd = Queue(bit2, 'in')
self.cmd_busy = Port(bit, 'out', init=0)
self.append_worker(self.worker)
...
後略
...
こちらでは Queue として bin_in_q や bin_out_q、cmd が生成されている。これらは外部と通信する口なので、外からアクセス可能である。つまり、自分のモジュールに x_mem を取り入れて、この Queue を使って通信することが可能なのだ。
この方式を使うとライブラリを使いまわすことが出来、一気に汎用性が増す。将来的に Polyphony が取り入れるであろう関数オブジェクトの機能が加わると、より汎用性は増す。