Skip to content

Instantly share code, notes, and snippets.

@maraigue
Created June 27, 2011 09:26
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save maraigue/1048564 to your computer and use it in GitHub Desktop.
Save maraigue/1048564 to your computer and use it in GitHub Desktop.
Rubyのコードの範疇で階層構造を定義し、かつ階層構造の解釈の途中に自由な処理を挟めるようにする例
# ここからライブラリ部
class WidgetGenerator
def initialize(level)
@level = level
end
def add_widget(name, &block)
indent = " " * @level
# ここではLispのコードを表示するようにしているが
# 実際にはここでウィジェットを生成すればよい
if block_given?
puts "#{indent}(widget '#{name}"
WidgetGenerator.new(@level + 1).instance_eval(&block)
puts "#{indent})"
else
puts "#{indent}(widget '#{name})"
end
end
end
def WidgetGenerator(&block)
WidgetGenerator.new(0).instance_eval(&block)
end
# ここから、ユーザが記述するデータ部
# (ユーザがこんなふうにコードを書いておけば、それを実行することで
# 対応するLispのコードを出力してくれる、という状況を想定。
# 実際にはウィジェットを生成するコードを上記で定義する。)
WidgetGenerator do
add_widget "メインのウィンドウ" do
add_widget "メニューバー" do
add_widget "ファイル" do
add_widget "新規"
add_widget "開く"
add_widget "上書き保存"
add_widget "名前を付けて保存"
add_widget "終了"
end
add_widget "編集" do
add_widget "切り取り"
add_widget "コピー"
add_widget "貼り付け"
add_widget "すべて選択"
end
end
add_widget "テキストボックス"
add_widget "ステータスバー"
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment