prepress-tips
codeLayouter の記述メモ3
最終更新:
prepress-tips
-
view
最終更新日時: 2015/02/24
codeLayouter再検討の発想で直接記述できる言語が登場したよう。
- コード の記述の方針
- プログラムの構造 + 実コードへの展開 という形で記述する。
- プログラムの構造が そのままアノテーションとなるように 記述する。
- オブジェクト指向風 に記述する。
- アノテーション は アノテーションの世界で 閉じる。
- 使う言語は dg言語( python3上のモジュールとして動く )。
- dg — it's a Python! No, it's a Haskell!
- Haskell構文で Python3のプログラミングができる。
# coding: utf-8
# 狼・山羊・キャベツの川渡し問題 を解く
# 変数 /
import '/wgc_detail',
wgc_detail.to_globals globals! wgc_detail
# ログ, オプション, デバグ
# 状態, いる, カウント, 更新, 連れ
# 履歴, 解答
import '/wgc_detail',
wgc_detail.to_globals globals! wgc_detail
# ログ, オプション, デバグ
# 状態, いる, カウント, 更新, 連れ
# 履歴, 解答
# 概要 /
main = ->
ログ_オプション入力!, ログ_開始!
状態_初期化!, 履歴_初期化!, 解答_初期化!, 探索!
解答_表示!
main = ->
ログ_オプション入力!, ログ_開始!
状態_初期化!, 履歴_初期化!, 解答_初期化!, 探索!
解答_表示!
# 処理 /
探索 = -> while True =>
履歴_一度あった! => ログ_一度あった!, break!
状態_ゴール! => ログ_ゴール!, 解答_記録!, break!
状態_制約満たさず! => ログ_制約満たさず!, break!
連れ_ていける! |> map ( それ ->
履歴_追加!, 連れ_ていった それ,
履歴_表示!, 連れ_表示 それ, 状態_表示!,
ログ_待機!,
探索!,
履歴_削除!
) |> list
break!
探索 = -> while True =>
履歴_一度あった! => ログ_一度あった!, break!
状態_ゴール! => ログ_ゴール!, 解答_記録!, break!
状態_制約満たさず! => ログ_制約満たさず!, break!
連れ_ていける! |> map ( それ ->
履歴_追加!, 連れ_ていった それ,
履歴_表示!, 連れ_表示 それ, 状態_表示!,
ログ_待機!,
探索!,
履歴_削除!
) |> list
break!
__name__ == '__main__' => main!
# coding: utf-8
import '/sys'
import '/re'
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
fh = [ 'ログ', '状態', '連れ', '履歴', '解答' ]
fn = globals! |> filter ( n -> re.sub '_.*' '' n in fh )
fn |> map ( n -> main !! n = getattr this n ) |> list
#----------------------------------------------------------
# ログ, オプション, デバグ
# ログ, オプション, デバグ
オプション' = ['',]
オプション = -> head オプション'
デバグ指定 = '(?i)d'
オプション = -> head オプション'
デバグ指定 = '(?i)d'
デバグ' = [False,]
デバグ = -> head デバグ'
デバグ = -> head デバグ'
ログ_オプション入力 = ->
オプション' !! 0 = except ( err => sys.argv !! 1 )( err => '' )
デバグ' !! 0 = re.search デバグ指定 オプション! |> bool
オプション' !! 0 = except ( err => sys.argv !! 1 )( err => '' )
デバグ' !! 0 = re.search デバグ指定 オプション! |> bool
ログ_開始 = -> print '狼・山羊・キャベツの川渡し問題 を解く',
デバグ! => print '‥‥'
ログ_一度あった = -> デバグ! => print ' X 一度あった'
ログ_ゴール = -> デバグ! => print ' === ゴール ==='
ログ_制約満たさず = -> デバグ! => print ' X gw か cg'
ログ_待機 = -> デバグ! => '‥‥' |> input
デバグ! => print '‥‥'
ログ_一度あった = -> デバグ! => print ' X 一度あった'
ログ_ゴール = -> デバグ! => print ' === ゴール ==='
ログ_制約満たさず = -> デバグ! => print ' X gw か cg'
ログ_待機 = -> デバグ! => '‥‥' |> input
#----------------------------------------------------------
# 状態, いる, カウント, 更新, 連れ
# 状態, いる, カウント, 更新, 連れ
状態' = ['',]
状態 = -> 状態' !! 0
状態_ = v -> 状態' !! 0 = v
状態 = -> 状態' !! 0
状態_ = v -> 状態' !! 0 = v
状態_初期化 = -> 状態_ 'fwgc', 状態_一意表現!
状態_一意表現 = -> 状態_ $ ''.join ( 状態! |> sorted )
状態_一意表現 = -> 状態_ $ ''.join ( 状態! |> sorted )
更新_削除 = o -> 状態_ $ ''.join ( set 状態! - set' o 'f' ),
状態_一意表現!
更新_追加 = o -> 状態_ $ 状態! + ''.join ( set' o 'f' ),
状態_一意表現!
状態_一意表現!
更新_追加 = o -> 状態_ $ 状態! + ''.join ( set' o 'f' ),
状態_一意表現!
状態_ゴール = -> 状態! == ''
状態_制約満たさず = -> not $ if
いる_f! => カウント_wg! != 0 and カウント_gc! != 0
otherwise => カウント_wg! != 2 and カウント_gc! != 2
状態_表示 = -> デバグ! => print $ '状態 ' + 状態!
状態_制約満たさず = -> not $ if
いる_f! => カウント_wg! != 0 and カウント_gc! != 0
otherwise => カウント_wg! != 2 and カウント_gc! != 2
状態_表示 = -> デバグ! => print $ '状態 ' + 状態!
いる_f = -> 状態! .find 'f' >= 0
いる_o = o -> 状態! .find o >= 0
いる_o = o -> 状態! .find o >= 0
カウント_wg = -> re.findall '[wg]' 状態! |> len
カウント_gc = -> re.findall '[gc]' 状態! |> len
カウント_gc = -> re.findall '[gc]' 状態! |> len
連れ_すべて = 'fwgc'
連れ_ていける = -> list <| if
いる_f! => 状態!
otherwise => set 連れ_すべて - set 状態!
連れ_ていった = o -> if
いる_f! => 更新_削除 o
otherwise => 更新_追加 o
連れ_表示 = o -> デバグ! => print '連れ' o
連れ_ていける = -> list <| if
いる_f! => 状態!
otherwise => set 連れ_すべて - set 状態!
連れ_ていった = o -> if
いる_f! => 更新_削除 o
otherwise => 更新_追加 o
連れ_表示 = o -> デバグ! => print '連れ' o
#----------------------------------------------------------
# 履歴, 解答
# 履歴, 解答
履歴 = []
解答 = []
解答 = []
履歴_初期化 = -> 履歴 .clear!
履歴_一度あった = -> 状態! in 履歴
履歴_追加 = -> 履歴 .append 状態!
履歴_表示 = -> デバグ! => print $ '履歴 ' + ' → '.join 履歴
履歴_削除 = -> 状態_ 履歴.pop!
履歴_一度あった = -> 状態! in 履歴
履歴_追加 = -> 履歴 .append 状態!
履歴_表示 = -> デバグ! => print $ '履歴 ' + ' → '.join 履歴
履歴_削除 = -> 状態_ 履歴.pop!
解答_記録 = -> 解答 .append $ ' ' + ' → '.join ( 履歴 + [状態!,] )
解答_初期化 = -> 解答 .clear!
解答_表示 = -> print '解答:', print $ '\x0a'.join 解答
解答_初期化 = -> 解答 .clear!
解答_表示 = -> print '解答:', print $ '\x0a'.join 解答