Internal DSLs
-
Upload
zefhemel -
Category
Technology
-
view
2.212 -
download
3
description
Transcript of Internal DSLs
![Page 1: Internal DSLs](https://reader034.fdocuments.in/reader034/viewer/2022052618/554f5614b4c905423f8b5556/html5/thumbnails/1.jpg)
internal DSLsZef Hemel
Tuesday, May 18, 2010
![Page 2: Internal DSLs](https://reader034.fdocuments.in/reader034/viewer/2022052618/554f5614b4c905423f8b5556/html5/thumbnails/2.jpg)
Internal DSLs are particular ways of using a host language to give the host language the feel of a particular language.
Martin Fowler
Tuesday, May 18, 2010
![Page 3: Internal DSLs](https://reader034.fdocuments.in/reader034/viewer/2022052618/554f5614b4c905423f8b5556/html5/thumbnails/3.jpg)
Internal DSLs are particular ways of using a host language to give the host language the feel of a particular language.
Martin Fowler
ab
Tuesday, May 18, 2010
![Page 4: Internal DSLs](https://reader034.fdocuments.in/reader034/viewer/2022052618/554f5614b4c905423f8b5556/html5/thumbnails/4.jpg)
fluent interfaces
flexible syntax
reflection
macros
method missing
Tuesday, May 18, 2010
![Page 5: Internal DSLs](https://reader034.fdocuments.in/reader034/viewer/2022052618/554f5614b4c905423f8b5556/html5/thumbnails/5.jpg)
Tuesday, May 18, 2010
![Page 6: Internal DSLs](https://reader034.fdocuments.in/reader034/viewer/2022052618/554f5614b4c905423f8b5556/html5/thumbnails/6.jpg)
fluent interfaces
Tuesday, May 18, 2010
![Page 7: Internal DSLs](https://reader034.fdocuments.in/reader034/viewer/2022052618/554f5614b4c905423f8b5556/html5/thumbnails/7.jpg)
Order o = new Order();Product p1 = new Product(1,Product.find(“Billy”));o.addProduct(p1);Product p2 = new Product(2,Product.find(”Janso"));o.addProduct(p2);Product p3 = new Product(4,Product.find(“Traby"));o.addProduct(p3);o.setPriorityRush(true);customer.addOrder(o);
http://www.st.ewi.tudelft.nl/~bouwers/main/slides/2008jspring.pdf
Tuesday, May 18, 2010
![Page 8: Internal DSLs](https://reader034.fdocuments.in/reader034/viewer/2022052618/554f5614b4c905423f8b5556/html5/thumbnails/8.jpg)
customer.newOrder() .with(1, "Billy") .with(2, "Janso") .with(4, "Traby") .priorityRush() .done();
Tuesday, May 18, 2010
![Page 9: Internal DSLs](https://reader034.fdocuments.in/reader034/viewer/2022052618/554f5614b4c905423f8b5556/html5/thumbnails/9.jpg)
public class Customer { ... public OrderBuilder newOrder() { return new OrderBuilder(this); }}
Tuesday, May 18, 2010
![Page 10: Internal DSLs](https://reader034.fdocuments.in/reader034/viewer/2022052618/554f5614b4c905423f8b5556/html5/thumbnails/10.jpg)
public class OrderBuilder { // ...
public OrderBuilder(Customer customer) { this.customer = customer; this.order = new Order(); }
public OrderBuilder with(int id, String name) { order.addProduct(new Product(id, name)); return this; }
public OrderBuilder priorityRush() { order.setPriorityRush(true); return this; }
public void done() { customer.addOrder(this.order); }}
Tuesday, May 18, 2010
![Page 11: Internal DSLs](https://reader034.fdocuments.in/reader034/viewer/2022052618/554f5614b4c905423f8b5556/html5/thumbnails/11.jpg)
public class OrderBuilder { // ...
public OrderBuilder(Customer customer) { this.customer = customer; this.order = new Order(); }
public OrderBuilder with(int id, String name) { order.addProduct(new Product(id, name)); return this; }
public OrderBuilder priorityRush() { order.setPriorityRush(true); return this; }
public void done() { customer.addOrder(this.order); }}
Tuesday, May 18, 2010
![Page 12: Internal DSLs](https://reader034.fdocuments.in/reader034/viewer/2022052618/554f5614b4c905423f8b5556/html5/thumbnails/12.jpg)
flexible syntax
Tuesday, May 18, 2010
![Page 13: Internal DSLs](https://reader034.fdocuments.in/reader034/viewer/2022052618/554f5614b4c905423f8b5556/html5/thumbnails/13.jpg)
header("Add entry")form { table { row { col { text("Your name:") } col { newEntry.name = input(newEntry.name) } } row { col { text("Your message:") } col { newEntry.text = inputText(newEntry.text) } } } button("Post") { newEntry.save() goto(Home()) }}
Tuesday, May 18, 2010
![Page 14: Internal DSLs](https://reader034.fdocuments.in/reader034/viewer/2022052618/554f5614b4c905423f8b5556/html5/thumbnails/14.jpg)
in Scala
Tuesday, May 18, 2010
![Page 15: Internal DSLs](https://reader034.fdocuments.in/reader034/viewer/2022052618/554f5614b4c905423f8b5556/html5/thumbnails/15.jpg)
case class Home() extends Page { def ui { header("Welcome to my guestbook!") section { header("All entries") list { for (e <- cache("entries", Entry.all)) { listitem { form { text(e.name) text(": ") text(e.text) button("Delete") { e.delete() goto(Home()) } } } } } } }}
Tuesday, May 18, 2010
![Page 16: Internal DSLs](https://reader034.fdocuments.in/reader034/viewer/2022052618/554f5614b4c905423f8b5556/html5/thumbnails/16.jpg)
case class Home() extends Page { def ui { header("Welcome to my guestbook!") section { entries } }
def entries { header("All entries") list { for (e <- cache("entries", Entry.all)) { listitem { form { text(e.name) text(": ") text(e.text) button("Delete") { e.delete() goto(Home()) } } } } } }}
Tuesday, May 18, 2010
![Page 17: Internal DSLs](https://reader034.fdocuments.in/reader034/viewer/2022052618/554f5614b4c905423f8b5556/html5/thumbnails/17.jpg)
object DefaultStyle extends Style { block("headerblock") >> header { fontsize = 30 pt; width = 100 percent; bgcolor = "#eeeeee"; } section >> header { color = "#0c0ccc"; } body { fontfamily = "Helvetica, Arial, Verdana, sans-serif" }}
Tuesday, May 18, 2010
![Page 18: Internal DSLs](https://reader034.fdocuments.in/reader034/viewer/2022052618/554f5614b4c905423f8b5556/html5/thumbnails/18.jpg)
object DefaultStyle extends Style { block("headerblock").>>(header { fontsize = 30 pt; width = 100 percent; bgcolor = "#eeeeee"; }) section.>>(header { color = "#0c0ccc"; }) body { fontfamily = "Helvetica, Arial, Verdana, sans-serif" }}
Tuesday, May 18, 2010
![Page 19: Internal DSLs](https://reader034.fdocuments.in/reader034/viewer/2022052618/554f5614b4c905423f8b5556/html5/thumbnails/19.jpg)
object DefaultStyle extends Style { block("headerblock").>>(header(() => { fontsize = 30 pt; width = 100 percent; bgcolor = "#eeeeee"; })) section.>>(header(() => { color = "#0c0ccc"; })) body(() => { fontfamily = "Helvetica, Arial, Verdana, sans-serif" })}
Tuesday, May 18, 2010
![Page 20: Internal DSLs](https://reader034.fdocuments.in/reader034/viewer/2022052618/554f5614b4c905423f8b5556/html5/thumbnails/20.jpg)
a >> b == a.>>(b)
Tuesday, May 18, 2010
![Page 21: Internal DSLs](https://reader034.fdocuments.in/reader034/viewer/2022052618/554f5614b4c905423f8b5556/html5/thumbnails/21.jpg)
section { header("All entries") ...}
Tuesday, May 18, 2010
![Page 22: Internal DSLs](https://reader034.fdocuments.in/reader034/viewer/2022052618/554f5614b4c905423f8b5556/html5/thumbnails/22.jpg)
section(() => { header("All entries") ...})
Tuesday, May 18, 2010
![Page 23: Internal DSLs](https://reader034.fdocuments.in/reader034/viewer/2022052618/554f5614b4c905423f8b5556/html5/thumbnails/23.jpg)
section(() => { header("All entries") ...})
def section(content : => Unit) { write("<div class='section'>") content write("</div>")}
Tuesday, May 18, 2010
![Page 24: Internal DSLs](https://reader034.fdocuments.in/reader034/viewer/2022052618/554f5614b4c905423f8b5556/html5/thumbnails/24.jpg)
ruby
Tuesday, May 18, 2010
![Page 25: Internal DSLs](https://reader034.fdocuments.in/reader034/viewer/2022052618/554f5614b4c905423f8b5556/html5/thumbnails/25.jpg)
create_table :posts do |t| t.string :name t.string :title t.text :contentend
Tuesday, May 18, 2010
![Page 26: Internal DSLs](https://reader034.fdocuments.in/reader034/viewer/2022052618/554f5614b4c905423f8b5556/html5/thumbnails/26.jpg)
create_table(:posts,do |t| t.string(:name) t.string(:title) t.text (:content)end)
Tuesday, May 18, 2010
![Page 27: Internal DSLs](https://reader034.fdocuments.in/reader034/viewer/2022052618/554f5614b4c905423f8b5556/html5/thumbnails/27.jpg)
class Post < ActiveRecord::Base validates_presence_of :name, :title validates_length_of :title, :minimum => 5end
Tuesday, May 18, 2010
![Page 28: Internal DSLs](https://reader034.fdocuments.in/reader034/viewer/2022052618/554f5614b4c905423f8b5556/html5/thumbnails/28.jpg)
class Post < ActiveRecord::Base validates_presence_of(:name, :title) validates_length_of(:title, :minimum => 5)end
Tuesday, May 18, 2010
![Page 29: Internal DSLs](https://reader034.fdocuments.in/reader034/viewer/2022052618/554f5614b4c905423f8b5556/html5/thumbnails/29.jpg)
method missing
Tuesday, May 18, 2010
![Page 30: Internal DSLs](https://reader034.fdocuments.in/reader034/viewer/2022052618/554f5614b4c905423f8b5556/html5/thumbnails/30.jpg)
scala
Tuesday, May 18, 2010
![Page 31: Internal DSLs](https://reader034.fdocuments.in/reader034/viewer/2022052618/554f5614b4c905423f8b5556/html5/thumbnails/31.jpg)
width = 100 percent;
Tuesday, May 18, 2010
![Page 32: Internal DSLs](https://reader034.fdocuments.in/reader034/viewer/2022052618/554f5614b4c905423f8b5556/html5/thumbnails/32.jpg)
def width_=(w: UnitInt) { ...}
width = 100 percent;
Tuesday, May 18, 2010
![Page 33: Internal DSLs](https://reader034.fdocuments.in/reader034/viewer/2022052618/554f5614b4c905423f8b5556/html5/thumbnails/33.jpg)
width_=(100 percent);
Tuesday, May 18, 2010
![Page 34: Internal DSLs](https://reader034.fdocuments.in/reader034/viewer/2022052618/554f5614b4c905423f8b5556/html5/thumbnails/34.jpg)
width_=(100.percent);
Tuesday, May 18, 2010
![Page 35: Internal DSLs](https://reader034.fdocuments.in/reader034/viewer/2022052618/554f5614b4c905423f8b5556/html5/thumbnails/35.jpg)
width_=(100.percent());
Tuesday, May 18, 2010
![Page 36: Internal DSLs](https://reader034.fdocuments.in/reader034/viewer/2022052618/554f5614b4c905423f8b5556/html5/thumbnails/36.jpg)
implicit def int2UnitInt(i: Int) =new UnitIntWrapper(i)
Tuesday, May 18, 2010
![Page 37: Internal DSLs](https://reader034.fdocuments.in/reader034/viewer/2022052618/554f5614b4c905423f8b5556/html5/thumbnails/37.jpg)
width_=(100.percent());
Tuesday, May 18, 2010
![Page 38: Internal DSLs](https://reader034.fdocuments.in/reader034/viewer/2022052618/554f5614b4c905423f8b5556/html5/thumbnails/38.jpg)
width_=(int2UnitInt(100).percent());
Tuesday, May 18, 2010
![Page 39: Internal DSLs](https://reader034.fdocuments.in/reader034/viewer/2022052618/554f5614b4c905423f8b5556/html5/thumbnails/39.jpg)
class UnitIntWrapper(i: Int) { ...
def percent = new PercentUnitInt(i)
class PercentUnitInt(i: Int) extends UnitInt { override def toString = i + "%" }}
Tuesday, May 18, 2010
![Page 40: Internal DSLs](https://reader034.fdocuments.in/reader034/viewer/2022052618/554f5614b4c905423f8b5556/html5/thumbnails/40.jpg)
ruby
Tuesday, May 18, 2010
![Page 41: Internal DSLs](https://reader034.fdocuments.in/reader034/viewer/2022052618/554f5614b4c905423f8b5556/html5/thumbnails/41.jpg)
Person.find_by_name('Zef')
Tuesday, May 18, 2010
![Page 42: Internal DSLs](https://reader034.fdocuments.in/reader034/viewer/2022052618/554f5614b4c905423f8b5556/html5/thumbnails/42.jpg)
class Person def self.find(key, value) puts "You want results from #{key} with a value of #{value}" endend
Person.find('name', 'Zef')
Tuesday, May 18, 2010
![Page 43: Internal DSLs](https://reader034.fdocuments.in/reader034/viewer/2022052618/554f5614b4c905423f8b5556/html5/thumbnails/43.jpg)
class Person def self.find(key, value) puts "You want results from #{key} with a value of #{value}" end
def self.method_missing(id, *args) if id.id2name =~ /find_by_(.+)/ return self.find(Regexp.last_match(1), args[0]) else raise NoMethodError end endend
Person.find_by_name('Zef')
Tuesday, May 18, 2010
![Page 44: Internal DSLs](https://reader034.fdocuments.in/reader034/viewer/2022052618/554f5614b4c905423f8b5556/html5/thumbnails/44.jpg)
reflection
Tuesday, May 18, 2010
![Page 45: Internal DSLs](https://reader034.fdocuments.in/reader034/viewer/2022052618/554f5614b4c905423f8b5556/html5/thumbnails/45.jpg)
public class Person { @Persistent public String name; @Persistent public int age;}
Tuesday, May 18, 2010
![Page 46: Internal DSLs](https://reader034.fdocuments.in/reader034/viewer/2022052618/554f5614b4c905423f8b5556/html5/thumbnails/46.jpg)
void persist(Object obj) { Class cls = obj.getClass(); Field[] fields = cls.getFields(); for(Field f : fields) { Persistent anno = f.getAnnotation(Persistent.class); if(anno != null) { System.out.println(f.getName()); } }}
Tuesday, May 18, 2010
![Page 47: Internal DSLs](https://reader034.fdocuments.in/reader034/viewer/2022052618/554f5614b4c905423f8b5556/html5/thumbnails/47.jpg)
macros
Tuesday, May 18, 2010
![Page 48: Internal DSLs](https://reader034.fdocuments.in/reader034/viewer/2022052618/554f5614b4c905423f8b5556/html5/thumbnails/48.jpg)
int one() { printf("One!"); return 1;}
int two() { printf("Two!"); return 2;}
...
int c = choice(n == 1, one(), two());
Tuesday, May 18, 2010
![Page 49: Internal DSLs](https://reader034.fdocuments.in/reader034/viewer/2022052618/554f5614b4c905423f8b5556/html5/thumbnails/49.jpg)
int choice(BOOL c, int ifTrue, int ifFalse) { return c ? ifTrue : ifFalse;}
Tuesday, May 18, 2010
![Page 50: Internal DSLs](https://reader034.fdocuments.in/reader034/viewer/2022052618/554f5614b4c905423f8b5556/html5/thumbnails/50.jpg)
int one() { printf("One!"); return 1;}
int two() { printf("Two!"); return 2;}
...
int c = choice(n == 1, one(), two());
Tuesday, May 18, 2010
![Page 51: Internal DSLs](https://reader034.fdocuments.in/reader034/viewer/2022052618/554f5614b4c905423f8b5556/html5/thumbnails/51.jpg)
#define CHOICE(c,ifTrue,ifFalse) \ (c) ? (ifTrue) : (ifFalse)
Tuesday, May 18, 2010
![Page 52: Internal DSLs](https://reader034.fdocuments.in/reader034/viewer/2022052618/554f5614b4c905423f8b5556/html5/thumbnails/52.jpg)
#define CHOICE(c,ifTrue,ifFalse) \ (c) ? (ifTrue) : (ifFalse)
int c = CHOICE(n == 1, one(), two());
Tuesday, May 18, 2010
![Page 53: Internal DSLs](https://reader034.fdocuments.in/reader034/viewer/2022052618/554f5614b4c905423f8b5556/html5/thumbnails/53.jpg)
#define CHOICE(c,ifTrue,ifFalse) \ (c) ? (ifTrue) : (ifFalse)
int c = CHOICE(n == 1, one(), two());
int c = (n == 1) ? (one()) : (two());
Tuesday, May 18, 2010
![Page 54: Internal DSLs](https://reader034.fdocuments.in/reader034/viewer/2022052618/554f5614b4c905423f8b5556/html5/thumbnails/54.jpg)
clojure (a Lisp)
Tuesday, May 18, 2010
![Page 55: Internal DSLs](https://reader034.fdocuments.in/reader034/viewer/2022052618/554f5614b4c905423f8b5556/html5/thumbnails/55.jpg)
homoiconiccode is datadata is code
Tuesday, May 18, 2010
![Page 56: Internal DSLs](https://reader034.fdocuments.in/reader034/viewer/2022052618/554f5614b4c905423f8b5556/html5/thumbnails/56.jpg)
(+ 1 2 3)
Tuesday, May 18, 2010
![Page 57: Internal DSLs](https://reader034.fdocuments.in/reader034/viewer/2022052618/554f5614b4c905423f8b5556/html5/thumbnails/57.jpg)
(+ 1 2 3) = 6
Tuesday, May 18, 2010
![Page 58: Internal DSLs](https://reader034.fdocuments.in/reader034/viewer/2022052618/554f5614b4c905423f8b5556/html5/thumbnails/58.jpg)
'(+ 1 2 3)
Tuesday, May 18, 2010
![Page 59: Internal DSLs](https://reader034.fdocuments.in/reader034/viewer/2022052618/554f5614b4c905423f8b5556/html5/thumbnails/59.jpg)
(first '(+ 1 2 3))
Tuesday, May 18, 2010
![Page 60: Internal DSLs](https://reader034.fdocuments.in/reader034/viewer/2022052618/554f5614b4c905423f8b5556/html5/thumbnails/60.jpg)
(first '(+ 1 2 3)) = +
Tuesday, May 18, 2010
![Page 61: Internal DSLs](https://reader034.fdocuments.in/reader034/viewer/2022052618/554f5614b4c905423f8b5556/html5/thumbnails/61.jpg)
(cons '+ (reverse (rest '(+ 1 2 3))))
Tuesday, May 18, 2010
![Page 62: Internal DSLs](https://reader034.fdocuments.in/reader034/viewer/2022052618/554f5614b4c905423f8b5556/html5/thumbnails/62.jpg)
(cons '+ (reverse (rest '(+ 1 2 3))))
= (+ 3 2 1)
Tuesday, May 18, 2010
![Page 63: Internal DSLs](https://reader034.fdocuments.in/reader034/viewer/2022052618/554f5614b4c905423f8b5556/html5/thumbnails/63.jpg)
(cons '+ (reverse (rest '(+ 1 2 3))))(eval
)
Tuesday, May 18, 2010
![Page 64: Internal DSLs](https://reader034.fdocuments.in/reader034/viewer/2022052618/554f5614b4c905423f8b5556/html5/thumbnails/64.jpg)
(cons '+ (reverse (rest '(+ 1 2 3))))
= 6
(eval)
Tuesday, May 18, 2010
![Page 65: Internal DSLs](https://reader034.fdocuments.in/reader034/viewer/2022052618/554f5614b4c905423f8b5556/html5/thumbnails/65.jpg)
(if (= n 10) (print "It was ten!”) nil)
Tuesday, May 18, 2010
![Page 66: Internal DSLs](https://reader034.fdocuments.in/reader034/viewer/2022052618/554f5614b4c905423f8b5556/html5/thumbnails/66.jpg)
(when (= n 10) (print "It was ten!”))
Tuesday, May 18, 2010
![Page 67: Internal DSLs](https://reader034.fdocuments.in/reader034/viewer/2022052618/554f5614b4c905423f8b5556/html5/thumbnails/67.jpg)
(defn when [c ifTrue] (if c ifTrue nil))
Tuesday, May 18, 2010
![Page 68: Internal DSLs](https://reader034.fdocuments.in/reader034/viewer/2022052618/554f5614b4c905423f8b5556/html5/thumbnails/68.jpg)
(when (= n 10) (print "It was ten!”))
Tuesday, May 18, 2010
![Page 69: Internal DSLs](https://reader034.fdocuments.in/reader034/viewer/2022052618/554f5614b4c905423f8b5556/html5/thumbnails/69.jpg)
(defmacro when [c ifTrue] (list 'if c ifTrue 'nil))
Tuesday, May 18, 2010
![Page 70: Internal DSLs](https://reader034.fdocuments.in/reader034/viewer/2022052618/554f5614b4c905423f8b5556/html5/thumbnails/70.jpg)
(defmacro when [c ifTrue] `(if ~c ~ifTrue nil))
Tuesday, May 18, 2010
![Page 71: Internal DSLs](https://reader034.fdocuments.in/reader034/viewer/2022052618/554f5614b4c905423f8b5556/html5/thumbnails/71.jpg)
(when (= n 10) (print "It was ten!”))
(if (= n 10) (print "It was ten!”) nil)
Tuesday, May 18, 2010
![Page 72: Internal DSLs](https://reader034.fdocuments.in/reader034/viewer/2022052618/554f5614b4c905423f8b5556/html5/thumbnails/72.jpg)
(when (= n 10) (print "It was ten!”))
(if (= n 10) (print "It was ten!”) nil)
Tuesday, May 18, 2010
![Page 73: Internal DSLs](https://reader034.fdocuments.in/reader034/viewer/2022052618/554f5614b4c905423f8b5556/html5/thumbnails/73.jpg)
(loop for i in *random* counting (evenp i) into evens counting (oddp i) into odds summing i into total maximizing i into max minimizing i into min finally (return (list min max total evens odds)))
Tuesday, May 18, 2010
![Page 74: Internal DSLs](https://reader034.fdocuments.in/reader034/viewer/2022052618/554f5614b4c905423f8b5556/html5/thumbnails/74.jpg)
(defent User [:username :string {:unique true}] [:openid :string] [:email :email] [:points :int])
http://github.com/zefhemel/adia
Tuesday, May 18, 2010
![Page 75: Internal DSLs](https://reader034.fdocuments.in/reader034/viewer/2022052618/554f5614b4c905423f8b5556/html5/thumbnails/75.jpg)
(defwebfn show [u User] [:h1 "Posted items"] [:ul (for [i (query Item :where {:author (:_id u)} :order-by {:date -1})] [:li (:title i)])])
Tuesday, May 18, 2010
![Page 76: Internal DSLs](https://reader034.fdocuments.in/reader034/viewer/2022052618/554f5614b4c905423f8b5556/html5/thumbnails/76.jpg)
advantages
Tuesday, May 18, 2010
![Page 77: Internal DSLs](https://reader034.fdocuments.in/reader034/viewer/2022052618/554f5614b4c905423f8b5556/html5/thumbnails/77.jpg)
easy to develop
builds on existing platform
existing community
Tuesday, May 18, 2010
![Page 78: Internal DSLs](https://reader034.fdocuments.in/reader034/viewer/2022052618/554f5614b4c905423f8b5556/html5/thumbnails/78.jpg)
disadvantages
Tuesday, May 18, 2010
![Page 79: Internal DSLs](https://reader034.fdocuments.in/reader034/viewer/2022052618/554f5614b4c905423f8b5556/html5/thumbnails/79.jpg)
<h1>Hello, Rails!</h1>
<%= link_to "My Blog", post_path %>
http://zef.me/2308/when-rails-fails
Tuesday, May 18, 2010
![Page 80: Internal DSLs](https://reader034.fdocuments.in/reader034/viewer/2022052618/554f5614b4c905423f8b5556/html5/thumbnails/80.jpg)
<h1>Hello, Rails!</h1>
<%= link_to "My Blog", post_path %>
post_url failed to generate from {:controller=>"posts", :action=>"show"} – you may have ambiguous routes, or you may need to supply additional parameters for this route. content_url has the following required parameters: ["posts", :id] – are they all satisfied?
http://zef.me/2308/when-rails-fails
Tuesday, May 18, 2010
![Page 81: Internal DSLs](https://reader034.fdocuments.in/reader034/viewer/2022052618/554f5614b4c905423f8b5556/html5/thumbnails/81.jpg)
<%= link_to 'Destroy', post, :confrm => 'Are you sure?', :method => :delete %>
Tuesday, May 18, 2010
![Page 82: Internal DSLs](https://reader034.fdocuments.in/reader034/viewer/2022052618/554f5614b4c905423f8b5556/html5/thumbnails/82.jpg)
<%= link_to 'Destroy', post, :confrm => 'Are you sure?', :method => :delete %>
Tuesday, May 18, 2010
![Page 83: Internal DSLs](https://reader034.fdocuments.in/reader034/viewer/2022052618/554f5614b4c905423f8b5556/html5/thumbnails/83.jpg)
class Post < ActiveRecord::Base validates_presence_of :namend
Tuesday, May 18, 2010
![Page 84: Internal DSLs](https://reader034.fdocuments.in/reader034/viewer/2022052618/554f5614b4c905423f8b5556/html5/thumbnails/84.jpg)
class Post < ActiveRecord::Base validates_presence_of :namend
Tuesday, May 18, 2010
![Page 85: Internal DSLs](https://reader034.fdocuments.in/reader034/viewer/2022052618/554f5614b4c905423f8b5556/html5/thumbnails/85.jpg)
no static checking
late discovery of errors
Tuesday, May 18, 2010
![Page 86: Internal DSLs](https://reader034.fdocuments.in/reader034/viewer/2022052618/554f5614b4c905423f8b5556/html5/thumbnails/86.jpg)
no static checking
late discovery of errors
Tuesday, May 18, 2010
![Page 87: Internal DSLs](https://reader034.fdocuments.in/reader034/viewer/2022052618/554f5614b4c905423f8b5556/html5/thumbnails/87.jpg)
Tuesday, May 18, 2010
![Page 88: Internal DSLs](https://reader034.fdocuments.in/reader034/viewer/2022052618/554f5614b4c905423f8b5556/html5/thumbnails/88.jpg)
Tuesday, May 18, 2010
![Page 89: Internal DSLs](https://reader034.fdocuments.in/reader034/viewer/2022052618/554f5614b4c905423f8b5556/html5/thumbnails/89.jpg)
non-domain specific error messages
Tuesday, May 18, 2010
![Page 90: Internal DSLs](https://reader034.fdocuments.in/reader034/viewer/2022052618/554f5614b4c905423f8b5556/html5/thumbnails/90.jpg)
Tuesday, May 18, 2010
![Page 91: Internal DSLs](https://reader034.fdocuments.in/reader034/viewer/2022052618/554f5614b4c905423f8b5556/html5/thumbnails/91.jpg)
errors hard to trace back to origin
Tuesday, May 18, 2010
![Page 92: Internal DSLs](https://reader034.fdocuments.in/reader034/viewer/2022052618/554f5614b4c905423f8b5556/html5/thumbnails/92.jpg)
Table t = table("table").as("t");Table t1 = table("table1").as("t1");Field tId = t.field("id");Field t1Id = t1.field("id");Field t1Time = t1.field("time");
Sql sql = select(tId).from(t).join(inner(t1, tId.eq(t1Id))) .where(and(tId.eq("'a'"), t1Time.between("'1900'", "'2000'"))) .groupBy(tId).having(tId.gt("1")) .orderBy(asc(tId));
http://www.jequel.de
Tuesday, May 18, 2010
![Page 93: Internal DSLs](https://reader034.fdocuments.in/reader034/viewer/2022052618/554f5614b4c905423f8b5556/html5/thumbnails/93.jpg)
limited freedom in syntax
Tuesday, May 18, 2010
![Page 94: Internal DSLs](https://reader034.fdocuments.in/reader034/viewer/2022052618/554f5614b4c905423f8b5556/html5/thumbnails/94.jpg)
+ -quick development lack of static checking
built on existing platform
errors hard to trace back to origin
existing community bad error messages
limited freedom in syntax
Tuesday, May 18, 2010
![Page 95: Internal DSLs](https://reader034.fdocuments.in/reader034/viewer/2022052618/554f5614b4c905423f8b5556/html5/thumbnails/95.jpg)
?Tuesday, May 18, 2010