DSL / Symbol Table


Symbol Table

°ì¸ÀÍ×Ìó

¾õÂÖ¡¢¥³¥Þ¥ó¥É¡¢¥¤¥Ù¥ó¥È¤Ï¡¢¥·¥ó¥Ü¥ë¥Æ¡¼¥Ö¥ë¤È¸Æ¤Ð¤ì¤ëÏ¢ÁÛÇÛÎó¤Ë³ÊǼ¤·¤Þ¤·¤ç¤¦¡£ ¤½¤ÎºÝ¡¢¥­¡¼¤Ë¤Ï¥·¥ó¥Ü¥ë¡ÊJava¤Ç¸À¤¨¤Ð¡¢Îóµó·¿¡Ë¤òÍѤ¤¤Þ¤·¤ç¤¦¡£

»ÅÁȤß

ÀÅŪ·¿¥Õ¥£¡¼¥ë¥É¤Î¼ÂÁõ

·ë¶É¡¢Ê£¿ô¥Þ¥Ã¥×¤è¤êÆÃÊ̤ʥ¯¥é¥¹¤ò»È¤¨¤Ã¤Æ¸À¤¦»ö¤ò½Ò¤Ù¤Æ¤¤¤ë¥»¥¯¥·¥ç¥ó

¤¤¤Ä»ÈÍѤ¹¤Ù¤­¤«¡©


Î㡧 ¥·¥ó¥Ü¥ê¥Ã¥¯¥­¡¼¤ò»ý¤Ã¤¿HashMap?¤Ë¤è¤ë¥·¥ó¥Ü¥ë¥Æ¡¼¥Ö¥ë¡ÊRuby¤Î¾ì¹ç¡Ë

¥Õ¥¡¥¦¥é¡¼¤Ø¤Î¥Õ¥£¡¼¥É¥Ð¥Ã¥¯

ôÅö¼Ô¤Î¤Ä¤Ö¤ä¤­

¥·¥ó¥Ü¥ë¥Æ¡¼¥Ö¥ë¤È¤Ï¡©

DSL¥¹¥¯¥ê¥×¥ÈÆâ¤Ç»ÈÍѤµ¤ì¤ë¥·¥ó¥Ü¥ë¤È»²¾È¤µ¤ì¤ë¥ª¥Ö¥¸¥§¥¯¥È¤ò¥Þ¥Ã¥Ô¥ó¥°¤·¤¿¾ðÊó¤ò³ÊǼ¤¹¤ë¾ì½ê¡£
  • ¥·¥ó¥Ü¥ë¥Æ¡¼¥Ö¥ë¤ÏÏ¢ÁÛÇÛÎó¤Ç¤¢¤ê¡¢¥­¡¼¤Ë¥·¥ó¥Ü¥ë¡¢Ãͤ˥ե졼¥à¥ï¡¼¥¯¤ò¥ª¥Ö¥¸¥§¥¯¥È¤ò³ÊǼ¤¹¤ë¡£
  • ¥·¥ó¥Ü¥ë¤òÍѤ¤¤ëÍýͳ¤Ï¡¢°Õ¿Þ¤òÌÀ³Î¤Ë¤·¡¢¥³¡¼¥É¤òÍý²ò¤·¤ä¤¹¤¯¤·¤¿¤¤°Ù¡£
  • ´ðËÜŪ¤Ë¥·¥ó¥Ü¥ë¤ÏString·¿¡£

¥·¥ó¥Ü¥ë¥Æ¡¼¥Ö¥ë¤¬ÊÝ»ý¤¹¤ëÂоݤϡ©

  • ¾õÂÖ
  • ¥³¥Þ¥ó¥É
  • ¥¤¥Ù¥ó¥È

¥·¥ó¥Ü¥ë¥Æ¡¼¥Ö¥ë¤Î¼ÂÁõ¤Ë´Ø¤·¤Æ

¼¡¤Î3¤Ä¤òÄó°Æ¤·¤Æ¤¤¤ë¤¬¡¢¥Õ¥¡¥¦¥é¡¼¤¬¿ä¾©¤·¤Æ¤¤¤ë¤Î¤Ï¡¢¡ØÊ£¿ô¥Þ¥Ã¥×¡Ù
¡ØÆÃÊ̤ʥ¯¥é¥¹¡Ù¤Ë´Ø¤·¤Æ¤ÏÍ­ÍѤʾì¹ç¤â¤¢¤ë¤¬¡¢É¬ÍפȤʤë¾ìÌ̤¬¾¯¤Ê¤¤¡£

  • Single Map(ñ°ì¥Þ¥Ã¥×¡Ë
    Á´¤Æ¤Î¥·¥ó¥Ü¥ë¤ò£±¤Ä¤Î¥Þ¥Ã¥×¤Ç°ì³çŪ¤Ë´ÉÍý¤¹¤ë¡£
    • Ĺ½ê¡§ÌÜŪ¤Î¥·¥ó¥Ü¥ë¤ò³ÊǼ¤¹¤ë¥Þ¥Ã¥×¤òÆÃÄꤹ¤ëɬÍפ¬¤Ê¤¤¡áº®Í𤬷ڸº¤¹¤ë¡£
    • û½ê¡§¥·¥ó¥Ü¥ë̾¤«¤é¡¢¡Ø¾õÂÖ¡Ù¡¢¡Ø¥³¥Þ¥ó¥É¡Ù¡¢¡Ø¥¤¥Ù¥ó¥È¡Ù¤Î¤É¤ì¤Ë°¤·¤Æ¤¤¤ë¤Î¤«¤òȽÃǤ¹¤ë»ö¤¬½ÐÍè¤Ê¤¤°Ù¡¢¥³¡¼¥É¤¬Íý²ò¤·¤Å¤é¤¯¤Ê¤ë¡£
  • Multiple Map¡ÊÊ£¿ô¥Þ¥Ã¥×¡Ë
    ¡Ø¾õÂÖ¡Ù¡¢¡Ø¥³¥Þ¥ó¥É¡Ù¡¢¡Ø¥¤¥Ù¥ó¥È¡ÙËè¤Ë¥Þ¥Ã¥×¤òºîÀ®¤·¡¢´ÉÍý¤¹¤ë¡£
    • Ĺ½ê¡§°Ù¡¢Ì¾Á°¤Î¾×Æͤòµ¤¤Ë¤¹¤ë»ö¤¬¤Ê¤¯¤Ê¤ê¡¢¥³¡¼¥É¤«¤é¤É¤Î¥ª¥Ö¥¸¥§¥¯¥È¤ò»²¾È¤·¤Æ¤¤¤ë¤Î¤«ÌÀ³Î¤Ë¤Ê¤ë¡£
    • û½ê¡§¥Þ¥Ã¥×¤Î¿ô¤¬Áý¤¨¤ë°Ù¡¢Àµ¤·¤¤¥Þ¥Ã¥×¤òÁªÂò¤¹¤ëɬÍפ¬¤¢¤ë¡£
  • Special Class(ÆÃÊ̤ʥ¯¥é¥¹¡Ë
    »²¾È¤µ¤ì¤ë¥·¥ó¥Ü¥ë¤Î¼ïÎàËè¤Ë¡¢ÊÌ¡¹¤Î¥á¥½¥Ã¥É¡ÊgetEvent¡¢getState¡¢registerEventÅù¡Ë¤ò»ý¤¿¤»¤ë¡£
    • Ĺ½ê¡§¿¶¤ëÉñ¤¤¤ò½èÍý¤¹¤ë¥·¥ó¥Ü¥ë¤¬Äɲ乤ë¾ì¹ç¡¢³ÊǼÀ褬ľ´¶Åª¤Ëʬ¤«¤ê¤ä¤¹¤¤¡£
    • û½ê¡§¤³¤³¤Þ¤Ç¤¹¤ëɬÍפʾìÌ̤¬¡¢¤¢¤Þ¤ê¤Ê¤¤¡£

Á°Êý»²¾È¤È¤Ï¡©

¥ª¥Ö¥¸¥§¥¯¥È¤¬Å¬ÀÚ¤ËÄêµÁ¤µ¤ì¤Æ¤¤¤ëÁ°¤Ë¡¢»²¾È¤µ¤ì¤ë»ö¡£

DSL¤ÏÁ°Êý»²¾È¤ËÂФ·¤Æ¸·¤·¤¤À©Ìó¤ò¤â¤Ã¤Æ¤¤¤Ê¤¤»ö¤¬ËؤɤǤ¢¤ë°Ù¡¢¥µ¥Ý¡¼¥È¤¹¤ë¾ì¹ç¤Ï¥·¥ó¥Ü¥ë¤Èɳ¤Å¤¤¤Æ¤¤¤Ê¤¤¥ª¥Ö¥¸¥§¥¯¥È¤Î´ÉÍý¤ò¥·¥ó¥Ü¥ë¥Æ¡¼¥Ö¥ë¤¬É餦¤³¤È¤Ë¤Ê¤ë¡£

Î㡧ī¿©¤ÈÁ°Äó¾ò·ï¤ò»ý¤Ã¤¿´Êñ¤ÊDSL¥¹¥¯¥ê¥×¥È

Îã¤È¤·¤Æ¡¢¼¡¤Î3¤Ä¤Î¥¿¥¹¥¯¤ò¹Í¤¨¤ë

  • ²ñ¼Ò¤Ø¹Ô¤¯ ¢ª go_to_work
  • ¥³¡¼¥Ò¡¼¤ò°û¤à ¢ª drink_coffee
  • ÃåÂؤ¨¤ë ¢ª dress

¤³¤ì¤é¤Î¥¿¥¹¥¯¤Ï

  • ¥·¥ó¥Ü¥ë¡Ê:go_to_work¡¢:drink_coffee¡¢:dress¡Ë¤Ë¤è¤Ã¤Æ»²¾È¤µ¤ì¤ë¡£
  • ¼«¿È¤âÊ£¿ô¤Î¾¤Î¥¿¥¹¥¯¤«¤é¹½À®¤µ¤ì¤ë¡£
  • ³Æ¥¿¥¹¥¯¤Ï¥Ó¥ë¥À¡¼¤Ë¤è¤Ã¤ÆºîÀ®¤µ¤ì¡¢¥·¥ó¥Ü¥ë¥Æ¡¼¥Ö¥ë¤ËÅÐÏ¿¤µ¤ì¤ë¡£

¤È¤¤¤¦À­¼Á¤ò»ý¤Ä¡£

¡Ú¼«¿È¤âÊ£¿ô¤Î¾¤Î¥¿¥¹¥¯¤«¤é¹½À®¡Û
task :go_to_work => [:drink_coffee, :dress]  ¡¦¡¦¡¦­¡
task :drink_coffee => [:make_coffee, :wash]¡¡¡¦¡¦¡¦­¢
task :dress => [:wash]¡¡¡¦¡¦¡¦­£

¡Ú²òÀâ¡Û
­¡go_to_work¥¿¥¹¥¯¤Ï drink_coffee¤Èdress ¤È¤¤¤¦¥¿¥¹¥¯¤«¤é¹½À®¤µ¤ì¤ë¡£
­¢drink_coffee¥¿¥¹¥¯¤Ï make_coffee¤Èwash¤È¤¤¤¦¥¿¥¹¥¯¤«¤é¹½À®¤µ¤ì¤ë¡£
­£dress ¥¿¥¹¥¯¤Ï wash¤È¤¤¤¦¥¿¥¹¥¯¤«¤é¹½À®¤µ¤ì¤ë¡£

Task¥¯¥é¥¹¤Î¼ÂÁõÎã

class Task
  attr_reader :name¡¡¡¦¡¦¡¦­¡
  attr_accessor :prerequisites¡¡¡¦¡¦¡¦­¢

  #¥³¥ó¥¹¥È¥é¥¯¥¿  
  def initialize name, *prereqs
    @name = name
    @prerequisites = prereqs
  end

  #¥¿¥¹¥¯Ì¾¤òÊÖ¤¹´Ø¿ô
  def to_s
    name
  end 
end

¡Ú²òÀâ¡Û
­¡¥·¥ó¥Ü¥ë¥Æ¡¼¥Ö¥ë¤«¤é»²¾È¤µ¤ì¤ë°Ù¤Î¥·¥ó¥Ü¥ë
­¢¥¿¥¹¥¯¤ò¹½À®¤¹¤ë¥¿¥¹¥¯¤ÎÇÛÎó

Builder¥¯¥é¥¹¤Î¼ÂÁõÎã

class TaskBuilder...
 
  #¥·¥ó¥Ü¥ë¥Æ¡¼¥Ö¥ë¤Î½é´ü²½
  def initialize
    @tasks = {}
  end

  #DSL¥¹¥¯¥ê¥×¥È¤ÎÆɤ߹þ¤ß
  def load aStream
    instance_eval aStream
    return self
  end

  #¥¿¥¹¥¯¤òºîÀ®¤¹¤ë´Ø¿ô
  #¡ÊargMap¤ÏTask¥³¥ó¥¹¥È¥é¥¯¥¿¤ËÅϤ¹°ú¿ô¡Ë
  def task argMap
    #°ú¿ô¤ÎÃæ¿È¤¬¤Ê¤¤¾ì¹ç¤Ï¥¨¥é¡¼
    raise "syntax error" if argMap.keys.size != 1

    #¥¿¥¹¥¯¤ò¼èÆÀ
    key = argMap.keys[0] 
    newTask = obtain_task(key)

    #¼«¿È¤ò¹½À®¤¹¤ë¾¤Î¥¿¥¹¥¯¤òÀßÄê
    prereqs = argMap[key].map{|s| obtain_task(s)}
    newTask.prerequisites = prereqs
  end
 
  #¥·¥ó¥Ü¥ë¥Æ¡¼¥Ö¥ë¤«¤é¥¿¥¹¥¯¤ò¼èÆÀ¤¹¤ë´Ø¿ô
  def obtain_task aSymbol

    #̤ÅÐÏ¿¤Ç¤¢¤ì¤Ð¡¢¥¿¥¹¥¯¤ò¿·µ¬ºîÀ®¤·¡¢¥·¥ó¥Ü¥ë¥Æ¡¼¥Ö¥ë¤ËÅÐÏ¿¡ÊÁ°Êý»²¾ÈÂкö¡Ë
    @tasks[aSymbol] = Task.new(aSymbol.to_s) unless @tasks[aSymbol]

    #¥·¥ó¥Ü¥ë¥Æ¡¼¥Ö¥ë¤«¤é¥¿¥¹¥¯¤òÌ᤹¡£
    return  @tasks[aSymbol]
  end

¥·¥ó¥Ü¥ë¥Æ¡¼¥Ö¥ë¤Î¹½À®

¥·¥ó¥Ü¥ë¥Æ¡¼¥Ö¥ë
   ¨¢
   ¨§¨¡Task go_to_work 
   ¨¢    ¨¢
   ¨¢    ¨§¨¡name = "go_to_work"
   ¨¢    ¨¢
   ¨¢    ¨§¨¡prerequisite = {:drink_coffee => drink_coffee, :dress => dress }
   ¨¢    ¨¢
   ¨¢    ¨¦¨¡to_s
   ¨¢
   ¨§¨¡Task drink_coffee  
   ¨¢    ¨¢
   ¨¢    ¨§¨¡name = "drink_coffee"
   ¨¢    ¨¢
   ¨¢    ¨§¨¡prerequisite = {:make_coffee => make_coffee, :wash => wash }
   ¨¢    ¨¢
   ¨¢    ¨¦¨¡to_s
   ¨¢
   ¨§¨¡Task dress
   ¨¢    ¨¢
   ¨¢    ¨§¨¡name = "dress"
   ¨¢    ¨¢
   ¨¢    ¨§¨¡prerequisite = {:wash => wash}
   ¨¢    ¨¢
   ¨¢    ¨¦¨¡to_s
   ¨¢
   ¡§
 ¡¡¨§¨¡Tasks make_coffee
   ¡§
 ¡¡¨§¨¡Tasks wash
   ¡§

¤ß¤ó¤Ê¤ÎÆͤùþ¤ß