Skip to content

Instantly share code, notes, and snippets.

@ir-norn
Last active November 9, 2015 22:27
Show Gist options
  • Save ir-norn/99abba7a2ab983df1ba8 to your computer and use it in GitHub Desktop.
Save ir-norn/99abba7a2ab983df1ba8 to your computer and use it in GitHub Desktop.
Merkle_treeのメタ
require"yaml"
require "pp"
data = YAML.load_file("./sc/meta_conf.yaml")
pp data
p "-- yaml settings result --"
p out_file = data["out_file"]
p Project_name = data["project_name"]
p data["replace_project"]
p data["replace_tree"]
$nest = 0
$buf=""; $buf << <<-TTTEXT
#coding:utf-8
#
# ----------------------------------------------------------------
#
# - #{Time.now.strftime("%F | %X")}
# - meta script | #{__FILE__}
#
require "__dev/req" if $0 ==__FILE__
# ----------------------------------------------------------------
# --- scene ---
Dir["./#{Project_name}/*.rb"].map { |m| require m }
# --- Merkle_tree ---
Merkle_tree.new.Main :#{Project_name}_main do | o |
o.Code do
case
when o.task.empty? then o.Flandoll << :title
end
case o.Flandoll.pop
TTTEXT
END_add = 5
def f hs , n
# end add
$nest = [$nest , n].max
hs.each.with_index 1 do | (k,v),i|
if n != $nest
co = $nest - n
$buf << "end " * END_add * co ; $buf << "\n"
$nest -= co
end
# -----------------
if v.class == Hash
$buf << <<-TTTEXT
when :#{k} , :MSG_CODE#{i}
o.Task :#{k} do |o|
o.Code do
o.Main :#{k}_main do |o|
#{Project_name}::#{k.capitalize}.new o
o.Code do
case o.Flandoll.pop
TTTEXT
f v , n + 1 # ---------------- rec ----------------
else
$buf << <<-TTTEXT
when :#{k}, :MSG_CODE#{i}
o.Task :#{k} do |o|
o.Code do
o.Main :#{k}_mainloop do |o|
#{Project_name}::#{k.capitalize}.new o
o.Code do end
end
end
end
TTTEXT
end # els
end # each
end # f
f( data["top"] , 0 )
$buf << "end " * END_add * $nest
$buf << "end end end" # main
# ------------ indent
# TODO when..
nil while $buf.gsub!("end end","end\nend")
indent = 1
$buf =
$buf.each_line.inject "" do | ret , m |
m.strip! ; m << "\n"
if m[0] != "#" # comment
if m =~ /end|when/ then indent -= 1 end
ret << " " * indent if indent > 0
if m =~ /\sdo|case|when/ then indent += 1 end
end
ret << m
end
# puts $buf
# exit
# -- backup ---------
system"xcopy #{Project_name} __meta_tmp\\#{Project_name}"
system"xcopy #{out_file} __meta_tmp\\#{out_file}"
#exit
# ---------------- file create ------------------------------
if data["replace_tree"]
puts $buf
puts "created #{out_file} "
open( out_file , "w").print $buf
end
#system "ruvi tree.rb"
# -------------- scene meta
def me hs , b = []
hs.map do|k,v|
b << k
(me v , b) if v
end ; return b
end
puts me(data["top"])
# -----------------------------------------------------------------
# --------------------- replace project -------------------------
# -----------------------------------------------------------------
# exit
if data["replace_project"]
system"md #{Project_name}"
me(data["top"]).each do |file|
system "ruby sc\\__scene_create.rb replace #{Project_name}\\#{file}"
end
end
class Tree_task
attr_accessor :func ,:task ,:sym ,:n ,:up
def initialize hs = Hash.new , &block
@func = block
@task = Hash.new
@sym = hs[:sym] || :nil
@up = hs[:up]
end
def __taskloop
task.map do | key , v | task[key].func = v.func[v].func end
end
def Main sym , &block
Task sym , &block
nil while not __taskloop.empty?
end
def Task sym = :task , &block
task.store sym , self.class.new( up:self , sym:sym , &block)
end
def Code
self.class.new do
yield
__taskloop
self
end
end
end
Tree_task.new.Main :top_symbol do | o |
x=5
o.Code do
p x ; x-=1 ; x < 0 && exit
if x == 4
o.Task :na do |o|
o.Code do
p :task
end
end
end
end
end
exit
##
# ループの実装
Tree_task.new.Main :top_symbol do | o |
z = 5
y = 3
x = 10
o.Code do
print "x=", x , "_" ; x-=1 ; x < 0 && exit
if x == 8
o.Task :task do |o|
o.Code do
print "y=", y , "_"
y -= 1
if y == 0
o.Task :title do |o|
o.Code do
o.Main :title_main do |o|
p :title_main__
o.Code do
p :title_main__code
print "z=", z , "_" ; z-=1 ; z < 0 && exit
end
end
end
end
end
end
end
end
end
end
# x=10_x=9_x=8_y=3_x=7_y=2_x=6_y=1_x=5_y=0_:title_main__
# :title_main__code
# z=5_:title_main__code
# z=4_:title_main__code
# z=3_:title_main__code
# z=2_:title_main__code
# z=1_:title_main__code
# z=0_

Merkle tree

メタとかいろいろ

このgistがobsolete 2015 10 31

ツリーのメタしてたけどMerkle_tree.rbは再帰で書けたから終了、
YAMLも消し
他の事でまたメタは使うかもしれない

遅延追加を行う場合

hash during iteration error 対策 ( +uniq_sym )

追記 2015_10_27 エラー対策でハッシュやめてリスト化したからこのコードはobsolete

  def __taskloop
    task_do.each do | b | task.store( b.sym , b ) end.clear
    task.map do | key , v | task[key].func = v.func[v].func end
  end
  def Task sym = :task , &block
    self.task_do << self.class.new( up:self , sym:self.uniq_sym[sym] , &block)
  end
#coding:utf-8
#
# ----------------------------------------------------------------
#
# - 2015-10-27 | 00:13:13
# - meta script | C:/xxx/gh/last/pr6/sc/__tree_create_v3.rb
#
require "__dev/req" if $0 ==__FILE__
# ----------------------------------------------------------------
# --- scene ---
Dir["./AnneRose/*.rb"].map { |m| require m }
# --- Merkle_tree ---
Merkle_tree.new.Main :AnneRose_main do | o |
o.Code do
case
when o.task.empty? then o.Flandoll << :title
end
case o.Flandoll.pop
when :title , :MSG_CODE1
o.Task :title do |o|
o.Code do
o.Main :title_main do |o|
AnneRose::Title.new o
o.Code do
case o.Flandoll.pop
when :menu , :MSG_CODE1
o.Task :menu do |o|
o.Code do
o.Main :menu_main do |o|
AnneRose::Menu.new o
o.Code do
case o.Flandoll.pop
when :story , :MSG_CODE1
o.Task :story do |o|
o.Code do
o.Main :story_main do |o|
AnneRose::Story.new o
o.Code do
case o.Flandoll.pop
when :charactor_select , :MSG_CODE1
o.Task :charactor_select do |o|
o.Code do
o.Main :charactor_select_main do |o|
AnneRose::Charactor_select.new o
o.Code do
case o.Flandoll.pop
when :field , :MSG_CODE1
o.Task :field do |o|
o.Code do
o.Main :field_main do |o|
AnneRose::Field.new o
o.Code do
case o.Flandoll.pop
when :story_stage0, :MSG_CODE1
o.Task :story_stage0 do |o|
o.Code do
o.Main :story_stage0_mainloop do |o|
AnneRose::Story_stage0.new o
o.Code do end
end
end
end
when :story_stage1, :MSG_CODE2
o.Task :story_stage1 do |o|
o.Code do
o.Main :story_stage1_mainloop do |o|
AnneRose::Story_stage1.new o
o.Code do end
end
end
end
when :story_stage2, :MSG_CODE3
o.Task :story_stage2 do |o|
o.Code do
o.Main :story_stage2_mainloop do |o|
AnneRose::Story_stage2.new o
o.Code do end
end
end
end
when :story_stage3, :MSG_CODE4
o.Task :story_stage3 do |o|
o.Code do
o.Main :story_stage3_mainloop do |o|
AnneRose::Story_stage3.new o
o.Code do end
end
end
end
when :story_stage4, :MSG_CODE5
o.Task :story_stage4 do |o|
o.Code do
o.Main :story_stage4_mainloop do |o|
AnneRose::Story_stage4.new o
o.Code do end
end
end
end
when :story_stage5, :MSG_CODE6
o.Task :story_stage5 do |o|
o.Code do
o.Main :story_stage5_mainloop do |o|
AnneRose::Story_stage5.new o
o.Code do end
end
end
end
when :story_stage6, :MSG_CODE7
o.Task :story_stage6 do |o|
o.Code do
o.Main :story_stage6_mainloop do |o|
AnneRose::Story_stage6.new o
o.Code do end
end
end
end
when :story_stage_ex , :MSG_CODE8
o.Task :story_stage_ex do |o|
o.Code do
o.Main :story_stage_ex_main do |o|
AnneRose::Story_stage_ex.new o
o.Code do
case o.Flandoll.pop
when :ending , :MSG_CODE1
o.Task :ending do |o|
o.Code do
o.Main :ending_main do |o|
AnneRose::Ending.new o
o.Code do
case o.Flandoll.pop
when :staff_roll , :MSG_CODE1
o.Task :staff_roll do |o|
o.Code do
o.Main :staff_roll_main do |o|
AnneRose::Staff_roll.new o
o.Code do
case o.Flandoll.pop
when :return_display, :MSG_CODE1
o.Task :return_display do |o|
o.Code do
o.Main :return_display_mainloop do |o|
AnneRose::Return_display.new o
o.Code do end
end
end
end
end
end
end
end
end
end
end
end
end
end
end
end
end
end
end
end
end
end
end
end
end
end
end
end
end
end
end
end
end
end
end
end
end
end
end
when :cpu_mode , :MSG_CODE2
o.Task :cpu_mode do |o|
o.Code do
o.Main :cpu_mode_main do |o|
AnneRose::Cpu_mode.new o
o.Code do
case o.Flandoll.pop
when :cpu_mode_charactor_select , :MSG_CODE1
o.Task :cpu_mode_charactor_select do |o|
o.Code do
o.Main :cpu_mode_charactor_select_main do |o|
AnneRose::Cpu_mode_charactor_select.new o
o.Code do
case o.Flandoll.pop
when :cpu_mode_map_select , :MSG_CODE1
o.Task :cpu_mode_map_select do |o|
o.Code do
o.Main :cpu_mode_map_select_main do |o|
AnneRose::Cpu_mode_map_select.new o
o.Code do
case o.Flandoll.pop
when :cpu_mode_field , :MSG_CODE1
o.Task :cpu_mode_field do |o|
o.Code do
o.Main :cpu_mode_field_main do |o|
AnneRose::Cpu_mode_field.new o
o.Code do
case o.Flandoll.pop
when :cpu_mode_stage0, :MSG_CODE1
o.Task :cpu_mode_stage0 do |o|
o.Code do
o.Main :cpu_mode_stage0_mainloop do |o|
AnneRose::Cpu_mode_stage0.new o
o.Code do end
end
end
end
end
end
end
end
end
end
end
end
end
end
end
end
end
end
end
end
end
end
end
end
when :match_mode, :MSG_CODE3
o.Task :match_mode do |o|
o.Code do
o.Main :match_mode_mainloop do |o|
AnneRose::Match_mode.new o
o.Code do end
end
end
end
when :vs_network, :MSG_CODE4
o.Task :vs_network do |o|
o.Code do
o.Main :vs_network_mainloop do |o|
AnneRose::Vs_network.new o
o.Code do end
end
end
end
when :practice, :MSG_CODE5
o.Task :practice do |o|
o.Code do
o.Main :practice_mainloop do |o|
AnneRose::Practice.new o
o.Code do end
end
end
end
when :replay, :MSG_CODE6
o.Task :replay do |o|
o.Code do
o.Main :replay_mainloop do |o|
AnneRose::Replay.new o
o.Code do end
end
end
end
when :relust, :MSG_CODE7
o.Task :relust do |o|
o.Code do
o.Main :relust_mainloop do |o|
AnneRose::Relust.new o
o.Code do end
end
end
end
when :music_room, :MSG_CODE8
o.Task :music_room do |o|
o.Code do
o.Main :music_room_mainloop do |o|
AnneRose::Music_room.new o
o.Code do end
end
end
end
when :profile , :MSG_CODE9
o.Task :profile do |o|
o.Code do
o.Main :profile_main do |o|
AnneRose::Profile.new o
o.Code do
case o.Flandoll.pop
when :keyconfig, :MSG_CODE1
o.Task :keyconfig do |o|
o.Code do
o.Main :keyconfig_mainloop do |o|
AnneRose::Keyconfig.new o
o.Code do end
end
end
end
end
end
end
end
end
when :option , :MSG_CODE10
o.Task :option do |o|
o.Code do
o.Main :option_main do |o|
AnneRose::Option.new o
o.Code do
case o.Flandoll.pop
when :sound, :MSG_CODE1
o.Task :sound do |o|
o.Code do
o.Main :sound_mainloop do |o|
AnneRose::Sound.new o
o.Code do end
end
end
end
when :game_option, :MSG_CODE2
o.Task :game_option do |o|
o.Code do
o.Main :game_option_mainloop do |o|
AnneRose::Game_option.new o
o.Code do end
end
end
end
end
end
end
end
end
when :exit, :MSG_CODE11
o.Task :exit do |o|
o.Code do
o.Main :exit_mainloop do |o|
AnneRose::Exit.new o
o.Code do end
end
end
end
end
end
end
end
end
end
end
end
out_file: Merkle_tree.rb
# Merkle tree
top:
title:
menu:
story:
charactor_select:
field:
story_stage0:
story_stage1:
story_stage2:
story_stage3:
story_stage4:
story_stage5:
story_stage6:
story_stage_ex:
ending:
staff_roll:
return_display:
cpu_mode:
cpu_mode_charactor_select:
cpu_mode_map_select:
cpu_mode_field:
cpu_mode_stage0:
match_mode:
vs_network:
practice:
replay:
relust:
music_room:
profile:
keyconfig:
option:
sound:
game_option:
exit:
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment