Created
June 27, 2011 09:26
-
-
Save maraigue/1048564 to your computer and use it in GitHub Desktop.
Rubyのコードの範疇で階層構造を定義し、かつ階層構造の解釈の途中に自由な処理を挟めるようにする例
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# ここからライブラリ部 | |
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