prepress-tips
メニュー

更新履歴

取得中です。


codeLayouter の記述メモ3


※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

最終更新日時: 2015/02/24    

codeLayouter再検討の発想で直接記述できる言語が登場したよう。

  • コード の記述の方針
    • プログラムの構造 + 実コードへの展開 という形で記述する。
    • プログラムの構造が そのままアノテーションとなるように 記述する。
    • オブジェクト指向風 に記述する。
    • アノテーション は アノテーションの世界で 閉じる。
  • 使う言語は dg言語( python3上のモジュールとして動く )。

# coding: utf-8

# 狼・山羊・キャベツの川渡し問題 を解く

# 変数 /
import '/wgc_detail',
    wgc_detail.to_globals globals! wgc_detail
    # ログ, オプション, デバグ
    # 状態, いる, カウント, 更新, 連れ
    # 履歴, 解答

# 概要 /
main = ->
    ログ_オプション入力!, ログ_開始!
    状態_初期化!, 履歴_初期化!, 解答_初期化!, 探索!
    解答_表示!

# 処理 /
探索 = -> while True =>
    履歴_一度あった!  => ログ_一度あった!, break!
    状態_ゴール!      => ログ_ゴール!, 解答_記録!, break!
    状態_制約満たさず! => ログ_制約満たさず!, break!
    連れ_ていける! |> map ( それ ->
        履歴_追加!, 連れ_ていった それ,
        履歴_表示!, 連れ_表示 それ, 状態_表示!,
        ログ_待機!,
        探索!,
        履歴_削除!
    ) |> list
    break!

__name__ == '__main__' => main!

# coding: utf-8

import '/sys'
import '/re'

to_globals = main this ->
    fh = [ 'ログ', '状態', '連れ', '履歴', '解答' ]
    fn = globals! |> filter ( n -> re.sub '_.*' '' n in fh )
    fn |> map ( n -> main !! n = getattr this n ) |> list

#----------------------------------------------------------
# ログ, オプション, デバグ

オプション' = ['',]
オプション  = -> head オプション'
デバグ指定 = '(?i)d'

デバグ' = [False,]
デバグ  = -> head デバグ'

ログ_オプション入力 = ->
    オプション' !! 0 = except ( err => sys.argv !! 1 )( err => '' )
    デバグ'    !! 0 = re.search デバグ指定 オプション! |> bool

ログ_開始       = -> print '狼・山羊・キャベツの川渡し問題 を解く',
                    デバグ! => print '‥‥'
ログ_一度あった  = -> デバグ! => print '   X 一度あった'
ログ_ゴール      = -> デバグ! => print '  === ゴール ==='
ログ_制約満たさず = -> デバグ! => print '   X gw か cg'
ログ_待機        = -> デバグ! => '‥‥' |> input

#----------------------------------------------------------
# 状態, いる, カウント, 更新, 連れ

状態' = ['',]
状態  =   -> 状態' !! 0
状態_ = v -> 状態' !! 0 = v

状態_初期化   = -> 状態_ 'fwgc', 状態_一意表現!
状態_一意表現 = -> 状態_ $ ''.join ( 状態! |> sorted )

更新_削除 = o -> 状態_ $ ''.join ( set 状態! - set' o 'f' ),
                 状態_一意表現!
更新_追加 = o -> 状態_ $ 状態! + ''.join ( set' o 'f' ),
                 状態_一意表現!

状態_ゴール   = -> 状態! == ''
状態_制約満たさず = -> not $ if
    いる_f!  => カウント_wg! != 0 and カウント_gc! != 0
    otherwise => カウント_wg! != 2 and カウント_gc! != 2
状態_表示  = -> デバグ! => print $ '状態 ' + 状態!

いる_f =   -> 状態! .find 'f' >= 0
いる_o = o -> 状態! .find o   >= 0

カウント_wg = -> re.findall '[wg]' 状態! |> len
カウント_gc = -> re.findall '[gc]' 状態! |> len

連れ_すべて = 'fwgc'
連れ_ていける = -> list <| if
    いる_f!   => 状態!
    otherwise => set 連れ_すべて - set 状態!
連れ_ていった = o -> if
    いる_f!  => 更新_削除 o
    otherwise => 更新_追加 o
連れ_表示 = o -> デバグ! => print '連れ' o

#----------------------------------------------------------
# 履歴, 解答

履歴 = []
解答 = []

履歴_初期化    = -> 履歴 .clear!
履歴_一度あった = -> 状態! in 履歴
履歴_追加      = -> 履歴 .append 状態!
履歴_表示      = -> デバグ! => print $ '履歴 ' + ' → '.join 履歴
履歴_削除      = -> 状態_ 履歴.pop!

解答_記録   = -> 解答 .append $ '  ' + ' → '.join ( 履歴 + [状態!,] )
解答_初期化 = -> 解答 .clear!
解答_表示   = -> print '解答:', print $ '\x0a'.join 解答