DSL Powered by Rabbit 2.1.2
DSL
Yukio Goto
sg.rb
2014/04/29
DSL Powered by Rabbit 2.1.2
Who am I ?
Yukio Goto
favorite
Ruby, emacs, zsh, tennis✓
✓
work
Rakuten Asia Pte. Ltd.✓
As senior application engineer✓
✓
✓
DSL Powered by Rabbit 2.1.2
IDs
github
https://github.com/byplayer/
twitter
@byplayer
DSL Powered by Rabbit 2.1.2
Today's target
use DSL
-*-*-*-*-*-*-
making DSL
DSL Powered by Rabbit 2.1.2
DSL
What is DSL ?
DSL Powered by Rabbit 2.1.2
DSL
DSL =
Domain Specific
Language
DSL Powered by Rabbit 2.1.2
external DSL
SQL✓
SELECT id, user_name FROM users
DSL Powered by Rabbit 2.1.2
external DSL
configuration files✓
http {
passenger_root /usr/local/rvm/gems/ruby-2.1.0/gems/passenger-4.0.29;
passenger_ruby /usr/local/rvm/wrappers/ruby-2.1.0/ruby;
include mime.types;
default_type application/octet-stream;
# ...
}
DSL Powered by Rabbit 2.1.2
internal DSL
Rails✓
class User < ActiveRecord::Base
validates :name, presence: true
end
DSL Powered by Rabbit 2.1.2
BTW
By the way
DSL Powered by Rabbit 2.1.2
Did you make DSL ?
Did you make
DSL ?
DSL Powered by Rabbit 2.1.2
use only ?
Do you think
you can only
use DSL?
DSL Powered by Rabbit 2.1.2
No
NO !!!
DSL Powered by Rabbit 2.1.2
You
You
DSL Powered by Rabbit 2.1.2
can
can
DSL Powered by Rabbit 2.1.2
make
make
DSL Powered by Rabbit 2.1.2
your own DSL
your own
DSL
DSL Powered by Rabbit 2.1.2
AND
AND
DSL Powered by Rabbit 2.1.2
Ruby
Ruby
is
DSL Powered by Rabbit 2.1.2
easiest language
one of the most
easiest
language
DSL Powered by Rabbit 2.1.2
making DSL
making DSL
DSL Powered by Rabbit 2.1.2
How to make DSL
How to make
DSL
DSL Powered by Rabbit 2.1.2
before that
Before that
DSL Powered by Rabbit 2.1.2
Benefit of making DSL
DSL makes your Application
easy to write✓
easy to read✓
easy to use✓
✓
DSL Powered by Rabbit 2.1.2
theme
Configuration file using DSL
DSL Powered by Rabbit 2.1.2
config version 1
# singapore-ruby-group.conf
meetup do |conf|
conf.group = 'Singapore-Ruby-Group'
conf.organizer = 'Winston Teo'
conf.sponsors = ['Engine Yard',
'Silicon Straits',
'Plug-In@Blk71']
end
DSL Powered by Rabbit 2.1.2
how to use
mt = Meetup.load('singapore-ruby-group.conf')
puts mt.group
# => Singapore-Ruby-Group
puts mt.organizer
# => Winston Teo
puts mt.sponsors.join(', ')
# => Engine Yard, Silicon Straits, Plug-In@Blk71
DSL Powered by Rabbit 2.1.2
implementation
# Sample class to load configuration
class Meetup
attr_accessor :group, :organizer, :sponsors
def self.load(path)
fail "config file not found: #{path}" unless File.exist?(path)
mt = Meetup.new
File.open(path, 'r') do |file|
mt.instance_eval(File.read(path), path)
end
mt
end
private
def meetup
yield self
end
end
DSL Powered by Rabbit 2.1.2
key point
def self.load
# ...
File.open(path, 'r') do |file|
mt.instance_eval(File.read(path), path)
end
# ...
end
def meetup
yield self
end
DSL Powered by Rabbit 2.1.2
first point
pass string to 'instance_eval'
def self.load
# ...
File.open(path, 'r') do |file|
mt.instance_eval(File.read(path), path)
end
# ...
end
DSL Powered by Rabbit 2.1.2
instance_eval
"instance_eval"
DSL Powered by Rabbit 2.1.2
instance_eval
interpretes
String
DSL Powered by Rabbit 2.1.2
instance_eval
as Ruby code
DSL Powered by Rabbit 2.1.2
instance_eval
using Object
context
DSL Powered by Rabbit 2.1.2
instance_eval
In this case,
DSL Powered by Rabbit 2.1.2
instance_eval
configuration
file is
DSL Powered by Rabbit 2.1.2
instance_eval
interpreted as
DSL Powered by Rabbit 2.1.2
instance_eval
Meetup class
source code
DSL Powered by Rabbit 2.1.2
expand instance_eval virtually
def self.load
# File.open(path, 'r') do |file|
# mt.instance_eval(File.read(path), path)
# end
meetup do |conf|
conf.group = 'Singapore-Ruby-Group'
conf.organizer = 'Winston Teo'
conf.sponsors = ['Engine Yard',
'Silicon Straits',
'Plug-In@Blk71']
end
end
DSL Powered by Rabbit 2.1.2
easy
quite easy
DSL Powered by Rabbit 2.1.2
but
BUT
DSL Powered by Rabbit 2.1.2
Typing config
Typing 'conf.'
DSL Powered by Rabbit 2.1.2
is is
is not
DSL Powered by Rabbit 2.1.2
sexy
sexy
DSL Powered by Rabbit 2.1.2
Is it sexy ?
meetup do |conf|
conf.group = 'Singapore-Ruby-Group'
conf.organizer = 'Winston Teo'
conf.sponsors = ['Engine Yard',
'Silicon Straits',
'Plug-In@Blk71']
end
DSL Powered by Rabbit 2.1.2
ideal configuration
# singapore-ruby-group.conf
meetup {
group 'Singapore-Ruby-Group'
organizer 'Winston Teo'
sponsors ['Engine Yard',
'Silicon Straits',
'Plug-In@Blk71']
}
DSL Powered by Rabbit 2.1.2
readable
readable✓
DRY✓
DSL Powered by Rabbit 2.1.2
Let's use
Let's use
DSL Powered by Rabbit 2.1.2
Ruby's black magic
Ruby's black
magic
DSL Powered by Rabbit 2.1.2
parsing
parsing it
DSL Powered by Rabbit 2.1.2
load
class Meetup
attr_accessor :group, :organizer, :sponsors
def self.load(path)
mt = new
File.open(path, 'r') do |file|
loader = MeetupLoader.new(mt)
loader.instance_eval(file.read, path)
end
mt
end
end
DSL Powered by Rabbit 2.1.2
make support class
make support class
MeetupLoader
DSL Powered by Rabbit 2.1.2
make support class
define setter
method
DSL Powered by Rabbit 2.1.2
make support class
not use '='
DSL Powered by Rabbit 2.1.2
make support class
and
DSL Powered by Rabbit 2.1.2
make support class
load function
(meetup) only
DSL Powered by Rabbit 2.1.2
make support class (setter)
class MeetupLoader
def initialize(mt)
@meetup = mt
end
# ...
def group(g)
@meetup.group = g
end
def organizer(o)
@meetup.organizer = o
end
# ...
end
DSL Powered by Rabbit 2.1.2
instance_eval again
class MeetupLoader
# ...
def meetup(&block)
instance_eval(&block)
end
# ...
end
DSL Powered by Rabbit 2.1.2
The point of black magic
instance_eval
again
DSL Powered by Rabbit 2.1.2
instance_eval for block
instance_eval
with block
DSL Powered by Rabbit 2.1.2
changes
changes
DSL Powered by Rabbit 2.1.2
default receiver
default
receiver
DSL Powered by Rabbit 2.1.2
in the block
in the block
DSL Powered by Rabbit 2.1.2
original code
class Meetup
attr_accessor :group, :organizer, :sponsors
def self.load(path)
mt = new
File.open(path, 'r') do |file|
loader = MeetupLoader.new(mt)
loader.instance_eval(file.read, path)
end
mt
end
end
DSL Powered by Rabbit 2.1.2
expand instance_eval virtually 1
def self.load(path)
mt = new
File.open(path, 'r') do |file|
loader = MeetupLoader.new(mt)
# loader.instance_eval(file.read, path)
loader.meetup {
group 'Singapore-Ruby-Group'
organizer 'Winston Teo'
# ...
}
end
#...
DSL Powered by Rabbit 2.1.2
instance_eval with block
class MeetupLoader
# ...
def meetup(&block)
instance_eval(&block)
end
# ...
end
DSL Powered by Rabbit 2.1.2
expand instance_eval virtually 2
def meetup(&block)
# instance_eval(&block)
#{
self.group 'Singapore-Ruby-Group'
self.organizer 'Winston Teo'
# ...
# }
end
DSL Powered by Rabbit 2.1.2
The trick
The trick
DSL Powered by Rabbit 2.1.2
of
of
DSL Powered by Rabbit 2.1.2
Ruby's black magic
Ruby's black
magic
DSL Powered by Rabbit 2.1.2
is
is
DSL Powered by Rabbit 2.1.2
instance_eval with block
instance_eval
with block
DSL Powered by Rabbit 2.1.2
expand instance_eval virtually 2
def meetup(&block)
# instance_eval(&block)
#{
self.group 'Singapore-Ruby-Group'
self.organizer 'Winston Teo'
# ...
# }
end
DSL Powered by Rabbit 2.1.2
Today
Today,
DSL Powered by Rabbit 2.1.2
I
I
DSL Powered by Rabbit 2.1.2
don't
don't
DSL Powered by Rabbit 2.1.2
talk about
talk about
DSL Powered by Rabbit 2.1.2
caution points
caution points
DSL Powered by Rabbit 2.1.2
caution points
security✓
handle method_missing✓
handle syntax error✓
DSL Powered by Rabbit 2.1.2
source code
https://github.com/byplayer/meetup_config✓
https://github.com/byplayer/
meetup_config_ex
✓
DSL Powered by Rabbit 2.1.2
take a way
You can make DSL✓
instance_eval is interesting✓
DSL Powered by Rabbit 2.1.2
Hiring
Rakuten Asia Pte. Ltd.
wants to hire
Server side Application
Engineer (Ruby, java)
✓
iOS, Android Application
Engineer
✓
✓
DSL Powered by Rabbit 2.1.2
Any question ?
Any question ?
DSL Powered by Rabbit 2.1.2
Thank you
Thank you
for listening

More Related Content

PDF
Anchoring Trust: Rewriting DNS for the Semantic Network with Ruby and Rails
PDF
PuppetDB: Sneaking Clojure into Operations
PDF
Kernel Recipes 2019 - GNU poke, an extensible editor for structured binary data
PDF
Fiber in the 10th year
PDF
Protecting Plone from the Big, Bad Internet
PPTX
OrientDB the graph database
PDF
Multiprocessing with python
PDF
Software Packaging for Cross OS Distribution
Anchoring Trust: Rewriting DNS for the Semantic Network with Ruby and Rails
PuppetDB: Sneaking Clojure into Operations
Kernel Recipes 2019 - GNU poke, an extensible editor for structured binary data
Fiber in the 10th year
Protecting Plone from the Big, Bad Internet
OrientDB the graph database
Multiprocessing with python
Software Packaging for Cross OS Distribution

What's hot (20)

PDF
Новый InterSystems: open-source, митапы, хакатоны
PDF
A Journey to Boot Linux on Raspberry Pi
PPTX
Making asterisk feel like home outside north america
TXT
2003 December
PPTX
HA Hadoop -ApacheCon talk
ODP
Pfm technical-inside
PDF
Python twisted
ODP
How to build Debian packages
PDF
KEY
NLTK in 20 minutes
PPTX
High Availability Server with DRBD in linux
KEY
SD, a P2P bug tracking system
PDF
Concurrency in Python
PPT
101 3.3 perform basic file management
PPT
101 3.3 perform basic file management
DOCX
Linux final exam
KEY
Do more than one thing at the same time, the Python way
PDF
Software Defined Networks (SDN) na przykładzie rozwiązania OpenContrail.
PPT
Новый InterSystems: open-source, митапы, хакатоны
A Journey to Boot Linux on Raspberry Pi
Making asterisk feel like home outside north america
2003 December
HA Hadoop -ApacheCon talk
Pfm technical-inside
Python twisted
How to build Debian packages
NLTK in 20 minutes
High Availability Server with DRBD in linux
SD, a P2P bug tracking system
Concurrency in Python
101 3.3 perform basic file management
101 3.3 perform basic file management
Linux final exam
Do more than one thing at the same time, the Python way
Software Defined Networks (SDN) na przykładzie rozwiązania OpenContrail.
Ad

Similar to How to make DSL (20)

PDF
#CNX14 - Using Ruby for Reliability, Consistency, and Speed
PDF
Puppet at Opera Sofware - PuppetCamp Oslo 2013
PDF
New features in Ruby 2.5
PDF
Basic Gradle Plugin Writing
PDF
TorqueBox: The beauty of Ruby with the power of JBoss. Presented at Devnexus...
PDF
Our Puppet Story – Patterns and Learnings (sage@guug, March 2014)
PDF
Construire son JDK en 10 étapes
PPT
TopicMapReduceComet log analysis by using splunk
PDF
The Common Debian Build System (CDBS)
PDF
Collaborative Cuisine's 1 Hour JNDI Cookbook
PDF
DSL Construction with Ruby - ThoughtWorks Masterclass Series 2009
PDF
Subversion To Mercurial
PPTX
Reproducible Computational Research in R
PDF
Building DSLs On CLR and DLR (Microsoft.NET)
PPTX
Toolbox of a Ruby Team
PDF
Migrating Legacy Rails Apps to Rails 3
KEY
Week1
PDF
Sergi Álvarez + Roi Martín - radare2: From forensics to bindiffing [RootedCON...
PPTX
Cloud Meetup - Automation in the Cloud
PPTX
Discovering OpenBSD on AWS
#CNX14 - Using Ruby for Reliability, Consistency, and Speed
Puppet at Opera Sofware - PuppetCamp Oslo 2013
New features in Ruby 2.5
Basic Gradle Plugin Writing
TorqueBox: The beauty of Ruby with the power of JBoss. Presented at Devnexus...
Our Puppet Story – Patterns and Learnings (sage@guug, March 2014)
Construire son JDK en 10 étapes
TopicMapReduceComet log analysis by using splunk
The Common Debian Build System (CDBS)
Collaborative Cuisine's 1 Hour JNDI Cookbook
DSL Construction with Ruby - ThoughtWorks Masterclass Series 2009
Subversion To Mercurial
Reproducible Computational Research in R
Building DSLs On CLR and DLR (Microsoft.NET)
Toolbox of a Ruby Team
Migrating Legacy Rails Apps to Rails 3
Week1
Sergi Álvarez + Roi Martín - radare2: From forensics to bindiffing [RootedCON...
Cloud Meetup - Automation in the Cloud
Discovering OpenBSD on AWS
Ad

Recently uploaded (20)

PDF
Comparative analysis of machine learning models for fake news detection in so...
PDF
Produktkatalog für HOBO Datenlogger, Wetterstationen, Sensoren, Software und ...
PDF
AI.gov: A Trojan Horse in the Age of Artificial Intelligence
PPTX
MuleSoft-Compete-Deck for midddleware integrations
PDF
Auditboard EB SOX Playbook 2023 edition.
PDF
giants, standing on the shoulders of - by Daniel Stenberg
PDF
Early detection and classification of bone marrow changes in lumbar vertebrae...
PDF
5-Ways-AI-is-Revolutionizing-Telecom-Quality-Engineering.pdf
PDF
Advancing precision in air quality forecasting through machine learning integ...
PPTX
GROUP4NURSINGINFORMATICSREPORT-2 PRESENTATION
PPTX
Configure Apache Mutual Authentication
PPTX
Training Program for knowledge in solar cell and solar industry
PDF
Rapid Prototyping: A lecture on prototyping techniques for interface design
PPTX
future_of_ai_comprehensive_20250822032121.pptx
PDF
Improvisation in detection of pomegranate leaf disease using transfer learni...
PDF
Enhancing plagiarism detection using data pre-processing and machine learning...
PDF
NewMind AI Weekly Chronicles – August ’25 Week IV
PDF
Taming the Chaos: How to Turn Unstructured Data into Decisions
PDF
Consumable AI The What, Why & How for Small Teams.pdf
PPT
Galois Field Theory of Risk: A Perspective, Protocol, and Mathematical Backgr...
Comparative analysis of machine learning models for fake news detection in so...
Produktkatalog für HOBO Datenlogger, Wetterstationen, Sensoren, Software und ...
AI.gov: A Trojan Horse in the Age of Artificial Intelligence
MuleSoft-Compete-Deck for midddleware integrations
Auditboard EB SOX Playbook 2023 edition.
giants, standing on the shoulders of - by Daniel Stenberg
Early detection and classification of bone marrow changes in lumbar vertebrae...
5-Ways-AI-is-Revolutionizing-Telecom-Quality-Engineering.pdf
Advancing precision in air quality forecasting through machine learning integ...
GROUP4NURSINGINFORMATICSREPORT-2 PRESENTATION
Configure Apache Mutual Authentication
Training Program for knowledge in solar cell and solar industry
Rapid Prototyping: A lecture on prototyping techniques for interface design
future_of_ai_comprehensive_20250822032121.pptx
Improvisation in detection of pomegranate leaf disease using transfer learni...
Enhancing plagiarism detection using data pre-processing and machine learning...
NewMind AI Weekly Chronicles – August ’25 Week IV
Taming the Chaos: How to Turn Unstructured Data into Decisions
Consumable AI The What, Why & How for Small Teams.pdf
Galois Field Theory of Risk: A Perspective, Protocol, and Mathematical Backgr...

How to make DSL

  • 1. DSL Powered by Rabbit 2.1.2 DSL Yukio Goto sg.rb 2014/04/29
  • 2. DSL Powered by Rabbit 2.1.2 Who am I ? Yukio Goto favorite Ruby, emacs, zsh, tennis✓ ✓ work Rakuten Asia Pte. Ltd.✓ As senior application engineer✓ ✓ ✓
  • 3. DSL Powered by Rabbit 2.1.2 IDs github https://github.com/byplayer/ twitter @byplayer
  • 4. DSL Powered by Rabbit 2.1.2 Today's target use DSL -*-*-*-*-*-*- making DSL
  • 5. DSL Powered by Rabbit 2.1.2 DSL What is DSL ?
  • 6. DSL Powered by Rabbit 2.1.2 DSL DSL = Domain Specific Language
  • 7. DSL Powered by Rabbit 2.1.2 external DSL SQL✓ SELECT id, user_name FROM users
  • 8. DSL Powered by Rabbit 2.1.2 external DSL configuration files✓ http { passenger_root /usr/local/rvm/gems/ruby-2.1.0/gems/passenger-4.0.29; passenger_ruby /usr/local/rvm/wrappers/ruby-2.1.0/ruby; include mime.types; default_type application/octet-stream; # ... }
  • 9. DSL Powered by Rabbit 2.1.2 internal DSL Rails✓ class User < ActiveRecord::Base validates :name, presence: true end
  • 10. DSL Powered by Rabbit 2.1.2 BTW By the way
  • 11. DSL Powered by Rabbit 2.1.2 Did you make DSL ? Did you make DSL ?
  • 12. DSL Powered by Rabbit 2.1.2 use only ? Do you think you can only use DSL?
  • 13. DSL Powered by Rabbit 2.1.2 No NO !!!
  • 14. DSL Powered by Rabbit 2.1.2 You You
  • 15. DSL Powered by Rabbit 2.1.2 can can
  • 16. DSL Powered by Rabbit 2.1.2 make make
  • 17. DSL Powered by Rabbit 2.1.2 your own DSL your own DSL
  • 18. DSL Powered by Rabbit 2.1.2 AND AND
  • 19. DSL Powered by Rabbit 2.1.2 Ruby Ruby is
  • 20. DSL Powered by Rabbit 2.1.2 easiest language one of the most easiest language
  • 21. DSL Powered by Rabbit 2.1.2 making DSL making DSL
  • 22. DSL Powered by Rabbit 2.1.2 How to make DSL How to make DSL
  • 23. DSL Powered by Rabbit 2.1.2 before that Before that
  • 24. DSL Powered by Rabbit 2.1.2 Benefit of making DSL DSL makes your Application easy to write✓ easy to read✓ easy to use✓ ✓
  • 25. DSL Powered by Rabbit 2.1.2 theme Configuration file using DSL
  • 26. DSL Powered by Rabbit 2.1.2 config version 1 # singapore-ruby-group.conf meetup do |conf| conf.group = 'Singapore-Ruby-Group' conf.organizer = 'Winston Teo' conf.sponsors = ['Engine Yard', 'Silicon Straits', 'Plug-In@Blk71'] end
  • 27. DSL Powered by Rabbit 2.1.2 how to use mt = Meetup.load('singapore-ruby-group.conf') puts mt.group # => Singapore-Ruby-Group puts mt.organizer # => Winston Teo puts mt.sponsors.join(', ') # => Engine Yard, Silicon Straits, Plug-In@Blk71
  • 28. DSL Powered by Rabbit 2.1.2 implementation # Sample class to load configuration class Meetup attr_accessor :group, :organizer, :sponsors def self.load(path) fail "config file not found: #{path}" unless File.exist?(path) mt = Meetup.new File.open(path, 'r') do |file| mt.instance_eval(File.read(path), path) end mt end private def meetup yield self end end
  • 29. DSL Powered by Rabbit 2.1.2 key point def self.load # ... File.open(path, 'r') do |file| mt.instance_eval(File.read(path), path) end # ... end def meetup yield self end
  • 30. DSL Powered by Rabbit 2.1.2 first point pass string to 'instance_eval' def self.load # ... File.open(path, 'r') do |file| mt.instance_eval(File.read(path), path) end # ... end
  • 31. DSL Powered by Rabbit 2.1.2 instance_eval "instance_eval"
  • 32. DSL Powered by Rabbit 2.1.2 instance_eval interpretes String
  • 33. DSL Powered by Rabbit 2.1.2 instance_eval as Ruby code
  • 34. DSL Powered by Rabbit 2.1.2 instance_eval using Object context
  • 35. DSL Powered by Rabbit 2.1.2 instance_eval In this case,
  • 36. DSL Powered by Rabbit 2.1.2 instance_eval configuration file is
  • 37. DSL Powered by Rabbit 2.1.2 instance_eval interpreted as
  • 38. DSL Powered by Rabbit 2.1.2 instance_eval Meetup class source code
  • 39. DSL Powered by Rabbit 2.1.2 expand instance_eval virtually def self.load # File.open(path, 'r') do |file| # mt.instance_eval(File.read(path), path) # end meetup do |conf| conf.group = 'Singapore-Ruby-Group' conf.organizer = 'Winston Teo' conf.sponsors = ['Engine Yard', 'Silicon Straits', 'Plug-In@Blk71'] end end
  • 40. DSL Powered by Rabbit 2.1.2 easy quite easy
  • 41. DSL Powered by Rabbit 2.1.2 but BUT
  • 42. DSL Powered by Rabbit 2.1.2 Typing config Typing 'conf.'
  • 43. DSL Powered by Rabbit 2.1.2 is is is not
  • 44. DSL Powered by Rabbit 2.1.2 sexy sexy
  • 45. DSL Powered by Rabbit 2.1.2 Is it sexy ? meetup do |conf| conf.group = 'Singapore-Ruby-Group' conf.organizer = 'Winston Teo' conf.sponsors = ['Engine Yard', 'Silicon Straits', 'Plug-In@Blk71'] end
  • 46. DSL Powered by Rabbit 2.1.2 ideal configuration # singapore-ruby-group.conf meetup { group 'Singapore-Ruby-Group' organizer 'Winston Teo' sponsors ['Engine Yard', 'Silicon Straits', 'Plug-In@Blk71'] }
  • 47. DSL Powered by Rabbit 2.1.2 readable readable✓ DRY✓
  • 48. DSL Powered by Rabbit 2.1.2 Let's use Let's use
  • 49. DSL Powered by Rabbit 2.1.2 Ruby's black magic Ruby's black magic
  • 50. DSL Powered by Rabbit 2.1.2 parsing parsing it
  • 51. DSL Powered by Rabbit 2.1.2 load class Meetup attr_accessor :group, :organizer, :sponsors def self.load(path) mt = new File.open(path, 'r') do |file| loader = MeetupLoader.new(mt) loader.instance_eval(file.read, path) end mt end end
  • 52. DSL Powered by Rabbit 2.1.2 make support class make support class MeetupLoader
  • 53. DSL Powered by Rabbit 2.1.2 make support class define setter method
  • 54. DSL Powered by Rabbit 2.1.2 make support class not use '='
  • 55. DSL Powered by Rabbit 2.1.2 make support class and
  • 56. DSL Powered by Rabbit 2.1.2 make support class load function (meetup) only
  • 57. DSL Powered by Rabbit 2.1.2 make support class (setter) class MeetupLoader def initialize(mt) @meetup = mt end # ... def group(g) @meetup.group = g end def organizer(o) @meetup.organizer = o end # ... end
  • 58. DSL Powered by Rabbit 2.1.2 instance_eval again class MeetupLoader # ... def meetup(&block) instance_eval(&block) end # ... end
  • 59. DSL Powered by Rabbit 2.1.2 The point of black magic instance_eval again
  • 60. DSL Powered by Rabbit 2.1.2 instance_eval for block instance_eval with block
  • 61. DSL Powered by Rabbit 2.1.2 changes changes
  • 62. DSL Powered by Rabbit 2.1.2 default receiver default receiver
  • 63. DSL Powered by Rabbit 2.1.2 in the block in the block
  • 64. DSL Powered by Rabbit 2.1.2 original code class Meetup attr_accessor :group, :organizer, :sponsors def self.load(path) mt = new File.open(path, 'r') do |file| loader = MeetupLoader.new(mt) loader.instance_eval(file.read, path) end mt end end
  • 65. DSL Powered by Rabbit 2.1.2 expand instance_eval virtually 1 def self.load(path) mt = new File.open(path, 'r') do |file| loader = MeetupLoader.new(mt) # loader.instance_eval(file.read, path) loader.meetup { group 'Singapore-Ruby-Group' organizer 'Winston Teo' # ... } end #...
  • 66. DSL Powered by Rabbit 2.1.2 instance_eval with block class MeetupLoader # ... def meetup(&block) instance_eval(&block) end # ... end
  • 67. DSL Powered by Rabbit 2.1.2 expand instance_eval virtually 2 def meetup(&block) # instance_eval(&block) #{ self.group 'Singapore-Ruby-Group' self.organizer 'Winston Teo' # ... # } end
  • 68. DSL Powered by Rabbit 2.1.2 The trick The trick
  • 69. DSL Powered by Rabbit 2.1.2 of of
  • 70. DSL Powered by Rabbit 2.1.2 Ruby's black magic Ruby's black magic
  • 71. DSL Powered by Rabbit 2.1.2 is is
  • 72. DSL Powered by Rabbit 2.1.2 instance_eval with block instance_eval with block
  • 73. DSL Powered by Rabbit 2.1.2 expand instance_eval virtually 2 def meetup(&block) # instance_eval(&block) #{ self.group 'Singapore-Ruby-Group' self.organizer 'Winston Teo' # ... # } end
  • 74. DSL Powered by Rabbit 2.1.2 Today Today,
  • 75. DSL Powered by Rabbit 2.1.2 I I
  • 76. DSL Powered by Rabbit 2.1.2 don't don't
  • 77. DSL Powered by Rabbit 2.1.2 talk about talk about
  • 78. DSL Powered by Rabbit 2.1.2 caution points caution points
  • 79. DSL Powered by Rabbit 2.1.2 caution points security✓ handle method_missing✓ handle syntax error✓
  • 80. DSL Powered by Rabbit 2.1.2 source code https://github.com/byplayer/meetup_config✓ https://github.com/byplayer/ meetup_config_ex ✓
  • 81. DSL Powered by Rabbit 2.1.2 take a way You can make DSL✓ instance_eval is interesting✓
  • 82. DSL Powered by Rabbit 2.1.2 Hiring Rakuten Asia Pte. Ltd. wants to hire Server side Application Engineer (Ruby, java) ✓ iOS, Android Application Engineer ✓ ✓
  • 83. DSL Powered by Rabbit 2.1.2 Any question ? Any question ?
  • 84. DSL Powered by Rabbit 2.1.2 Thank you Thank you for listening