Ruby is an Acceptable Lisp
-
Upload
astrails -
Category
Technology
-
view
1.462 -
download
0
description
Transcript of Ruby is an Acceptable Lisp
![Page 1: Ruby is an Acceptable Lisp](https://reader034.fdocuments.us/reader034/viewer/2022042521/5556863cd8b42a182f8b491c/html5/thumbnails/1.jpg)
Ruby isan acceptable Lisp
Vitaly Kushnerastrails.com
![Page 2: Ruby is an Acceptable Lisp](https://reader034.fdocuments.us/reader034/viewer/2022042521/5556863cd8b42a182f8b491c/html5/thumbnails/2.jpg)
Ruby is betterthen Lisp
![Page 3: Ruby is an Acceptable Lisp](https://reader034.fdocuments.us/reader034/viewer/2022042521/5556863cd8b42a182f8b491c/html5/thumbnails/3.jpg)
Ruby is betterthen Lisp
sometimes*;-)
![Page 4: Ruby is an Acceptable Lisp](https://reader034.fdocuments.us/reader034/viewer/2022042521/5556863cd8b42a182f8b491c/html5/thumbnails/4.jpg)
Language
![Page 5: Ruby is an Acceptable Lisp](https://reader034.fdocuments.us/reader034/viewer/2022042521/5556863cd8b42a182f8b491c/html5/thumbnails/5.jpg)
http://www.flickr.com/photos/jantik/254695220/
![Page 6: Ruby is an Acceptable Lisp](https://reader034.fdocuments.us/reader034/viewer/2022042521/5556863cd8b42a182f8b491c/html5/thumbnails/6.jpg)
Power
![Page 7: Ruby is an Acceptable Lisp](https://reader034.fdocuments.us/reader034/viewer/2022042521/5556863cd8b42a182f8b491c/html5/thumbnails/7.jpg)
http://www.flickr.com/photos/lrargerich/4187318085/
![Page 8: Ruby is an Acceptable Lisp](https://reader034.fdocuments.us/reader034/viewer/2022042521/5556863cd8b42a182f8b491c/html5/thumbnails/8.jpg)
Blub Language Paradox
Paul Grahamhttp://paulgraham.com/avg.html
![Page 9: Ruby is an Acceptable Lisp](https://reader034.fdocuments.us/reader034/viewer/2022042521/5556863cd8b42a182f8b491c/html5/thumbnails/9.jpg)
Is Lisp the mostpowerful?
![Page 10: Ruby is an Acceptable Lisp](https://reader034.fdocuments.us/reader034/viewer/2022042521/5556863cd8b42a182f8b491c/html5/thumbnails/10.jpg)
NO
![Page 11: Ruby is an Acceptable Lisp](https://reader034.fdocuments.us/reader034/viewer/2022042521/5556863cd8b42a182f8b491c/html5/thumbnails/11.jpg)
It depends
![Page 12: Ruby is an Acceptable Lisp](https://reader034.fdocuments.us/reader034/viewer/2022042521/5556863cd8b42a182f8b491c/html5/thumbnails/12.jpg)
![Page 13: Ruby is an Acceptable Lisp](https://reader034.fdocuments.us/reader034/viewer/2022042521/5556863cd8b42a182f8b491c/html5/thumbnails/13.jpg)
• syntax
![Page 14: Ruby is an Acceptable Lisp](https://reader034.fdocuments.us/reader034/viewer/2022042521/5556863cd8b42a182f8b491c/html5/thumbnails/14.jpg)
• syntax
• linguistic power
![Page 15: Ruby is an Acceptable Lisp](https://reader034.fdocuments.us/reader034/viewer/2022042521/5556863cd8b42a182f8b491c/html5/thumbnails/15.jpg)
• syntax
• linguistic power
• domain
![Page 16: Ruby is an Acceptable Lisp](https://reader034.fdocuments.us/reader034/viewer/2022042521/5556863cd8b42a182f8b491c/html5/thumbnails/16.jpg)
• syntax
• linguistic power
• domain
• libraries
![Page 17: Ruby is an Acceptable Lisp](https://reader034.fdocuments.us/reader034/viewer/2022042521/5556863cd8b42a182f8b491c/html5/thumbnails/17.jpg)
• syntax
• linguistic power
• domain
• libraries
• community
![Page 18: Ruby is an Acceptable Lisp](https://reader034.fdocuments.us/reader034/viewer/2022042521/5556863cd8b42a182f8b491c/html5/thumbnails/18.jpg)
Ruby
![Page 19: Ruby is an Acceptable Lisp](https://reader034.fdocuments.us/reader034/viewer/2022042521/5556863cd8b42a182f8b491c/html5/thumbnails/19.jpg)
History
![Page 20: Ruby is an Acceptable Lisp](https://reader034.fdocuments.us/reader034/viewer/2022042521/5556863cd8b42a182f8b491c/html5/thumbnails/20.jpg)
History
• Yukihiro Matsumoto (aka "Matz")
![Page 21: Ruby is an Acceptable Lisp](https://reader034.fdocuments.us/reader034/viewer/2022042521/5556863cd8b42a182f8b491c/html5/thumbnails/21.jpg)
History
• Yukihiro Matsumoto (aka "Matz")
• Released in 1994
![Page 22: Ruby is an Acceptable Lisp](https://reader034.fdocuments.us/reader034/viewer/2022042521/5556863cd8b42a182f8b491c/html5/thumbnails/22.jpg)
History
• Yukihiro Matsumoto (aka "Matz")
• Released in 1994
• Got known in US about 2000
![Page 23: Ruby is an Acceptable Lisp](https://reader034.fdocuments.us/reader034/viewer/2022042521/5556863cd8b42a182f8b491c/html5/thumbnails/23.jpg)
History
• Yukihiro Matsumoto (aka "Matz")
• Released in 1994
• Got known in US about 2000
• Gained momentum around 2003-2005
![Page 24: Ruby is an Acceptable Lisp](https://reader034.fdocuments.us/reader034/viewer/2022042521/5556863cd8b42a182f8b491c/html5/thumbnails/24.jpg)
more powerfulthan Perl
more object-oriented than Python.
![Page 25: Ruby is an Acceptable Lisp](https://reader034.fdocuments.us/reader034/viewer/2022042521/5556863cd8b42a182f8b491c/html5/thumbnails/25.jpg)
PerlSmalltalk
EiffelAdaLisp
![Page 26: Ruby is an Acceptable Lisp](https://reader034.fdocuments.us/reader034/viewer/2022042521/5556863cd8b42a182f8b491c/html5/thumbnails/26.jpg)
• Simple consistent syntax
• Dynamically typed
• Late binding
• Single Inheritance with Mixin support
![Page 27: Ruby is an Acceptable Lisp](https://reader034.fdocuments.us/reader034/viewer/2022042521/5556863cd8b42a182f8b491c/html5/thumbnails/27.jpg)
• Everything is an object
• Closures
• Garbage Collection
• Multi platform
![Page 28: Ruby is an Acceptable Lisp](https://reader034.fdocuments.us/reader034/viewer/2022042521/5556863cd8b42a182f8b491c/html5/thumbnails/28.jpg)
Ruby is Awesome
![Page 29: Ruby is an Acceptable Lisp](https://reader034.fdocuments.us/reader034/viewer/2022042521/5556863cd8b42a182f8b491c/html5/thumbnails/29.jpg)
Clean Syntax
![Page 30: Ruby is an Acceptable Lisp](https://reader034.fdocuments.us/reader034/viewer/2022042521/5556863cd8b42a182f8b491c/html5/thumbnails/30.jpg)
var # variable$var # global variable@var # instance variable@@var # class variableCONST # constantClass # class
![Page 31: Ruby is an Acceptable Lisp](https://reader034.fdocuments.us/reader034/viewer/2022042521/5556863cd8b42a182f8b491c/html5/thumbnails/31.jpg)
attrs = { :src => "foo.img", :width => 100, :height => 200, :class => Avatar}
![Page 32: Ruby is an Acceptable Lisp](https://reader034.fdocuments.us/reader034/viewer/2022042521/5556863cd8b42a182f8b491c/html5/thumbnails/32.jpg)
User.find params[:id], :limit => 10, :order => “name”
![Page 33: Ruby is an Acceptable Lisp](https://reader034.fdocuments.us/reader034/viewer/2022042521/5556863cd8b42a182f8b491c/html5/thumbnails/33.jpg)
if @project.owned_by?(@user) return false unless @[email protected]!
![Page 34: Ruby is an Acceptable Lisp](https://reader034.fdocuments.us/reader034/viewer/2022042521/5556863cd8b42a182f8b491c/html5/thumbnails/34.jpg)
Higher-orderfunctions
![Page 35: Ruby is an Acceptable Lisp](https://reader034.fdocuments.us/reader034/viewer/2022042521/5556863cd8b42a182f8b491c/html5/thumbnails/35.jpg)
Anonymousfunctions
![Page 36: Ruby is an Acceptable Lisp](https://reader034.fdocuments.us/reader034/viewer/2022042521/5556863cd8b42a182f8b491c/html5/thumbnails/36.jpg)
def x_times(x, fun) for i in 1..x fun.call(i) endend
x_times(10, lambda {|x| puts x})
![Page 37: Ruby is an Acceptable Lisp](https://reader034.fdocuments.us/reader034/viewer/2022042521/5556863cd8b42a182f8b491c/html5/thumbnails/37.jpg)
def x_times(x) for i in 1..x yield i endend
x_times(10) {|x| puts x}
![Page 38: Ruby is an Acceptable Lisp](https://reader034.fdocuments.us/reader034/viewer/2022042521/5556863cd8b42a182f8b491c/html5/thumbnails/38.jpg)
def x_times(x) for i in 1..x yield i endend
x_times(10) do |x| puts xend
![Page 39: Ruby is an Acceptable Lisp](https://reader034.fdocuments.us/reader034/viewer/2022042521/5556863cd8b42a182f8b491c/html5/thumbnails/39.jpg)
Everything isan Object
that you can extend
![Page 40: Ruby is an Acceptable Lisp](https://reader034.fdocuments.us/reader034/viewer/2022042521/5556863cd8b42a182f8b491c/html5/thumbnails/40.jpg)
class Fixnum def x_times for i in 1..self yield i end endend
5.x_times { |x| puts x }
![Page 41: Ruby is an Acceptable Lisp](https://reader034.fdocuments.us/reader034/viewer/2022042521/5556863cd8b42a182f8b491c/html5/thumbnails/41.jpg)
5.times { |x| puts x }
![Page 42: Ruby is an Acceptable Lisp](https://reader034.fdocuments.us/reader034/viewer/2022042521/5556863cd8b42a182f8b491c/html5/thumbnails/42.jpg)
map {|x| ...}collect {|x| ...}select {|x| ...}reject {|x| ...}find {|x| ...}any? {|x| ...}all? {|x| ...}sort {|a, b| ...}
![Page 43: Ruby is an Acceptable Lisp](https://reader034.fdocuments.us/reader034/viewer/2022042521/5556863cd8b42a182f8b491c/html5/thumbnails/43.jpg)
3.megabytes=> 3145728
![Page 44: Ruby is an Acceptable Lisp](https://reader034.fdocuments.us/reader034/viewer/2022042521/5556863cd8b42a182f8b491c/html5/thumbnails/44.jpg)
10.months.from_now
=> Thu Aug 12 03:25:40 0300 2010
![Page 45: Ruby is an Acceptable Lisp](https://reader034.fdocuments.us/reader034/viewer/2022042521/5556863cd8b42a182f8b491c/html5/thumbnails/45.jpg)
5.minutes.ago
=> Mon Oct 12 03:21:02 0200 2009
![Page 46: Ruby is an Acceptable Lisp](https://reader034.fdocuments.us/reader034/viewer/2022042521/5556863cd8b42a182f8b491c/html5/thumbnails/46.jpg)
Closures
![Page 47: Ruby is an Acceptable Lisp](https://reader034.fdocuments.us/reader034/viewer/2022042521/5556863cd8b42a182f8b491c/html5/thumbnails/47.jpg)
def incrementor(increment) proc {|x| x + increment}end
>> i5 = incrementor(5)=> #<Proc:0x01874a78@(irb):46>>> i5.call(3)=> 8
![Page 48: Ruby is an Acceptable Lisp](https://reader034.fdocuments.us/reader034/viewer/2022042521/5556863cd8b42a182f8b491c/html5/thumbnails/48.jpg)
Compact
![Page 49: Ruby is an Acceptable Lisp](https://reader034.fdocuments.us/reader034/viewer/2022042521/5556863cd8b42a182f8b491c/html5/thumbnails/49.jpg)
# rubydef paidMore(amount) proc {|e| e.salary > amount}end
// C#public Predicate<Employee> PaidMore(int amount) { return delegate(Employee e) { return e.Salary > amount; } }
![Page 50: Ruby is an Acceptable Lisp](https://reader034.fdocuments.us/reader034/viewer/2022042521/5556863cd8b42a182f8b491c/html5/thumbnails/50.jpg)
// rubydef foo(n) lambda {|i| n+=i} end
; lisp(defun foo (n) (lambda (i) (incf n i)))
![Page 51: Ruby is an Acceptable Lisp](https://reader034.fdocuments.us/reader034/viewer/2022042521/5556863cd8b42a182f8b491c/html5/thumbnails/51.jpg)
# ruby[1,2,3].map {|n| n*n }.reject {|n| n%3==1 }
; lisp(remove-if (lambda (n) (= (mod n 3) 1)) (mapcar (lambda (n) (* n n)) '(1 2 3)))
![Page 52: Ruby is an Acceptable Lisp](https://reader034.fdocuments.us/reader034/viewer/2022042521/5556863cd8b42a182f8b491c/html5/thumbnails/52.jpg)
Macros
![Page 53: Ruby is an Acceptable Lisp](https://reader034.fdocuments.us/reader034/viewer/2022042521/5556863cd8b42a182f8b491c/html5/thumbnails/53.jpg)
Ruby fakes macrospretty well
![Page 54: Ruby is an Acceptable Lisp](https://reader034.fdocuments.us/reader034/viewer/2022042521/5556863cd8b42a182f8b491c/html5/thumbnails/54.jpg)
OO+
Monkey Patching
![Page 55: Ruby is an Acceptable Lisp](https://reader034.fdocuments.us/reader034/viewer/2022042521/5556863cd8b42a182f8b491c/html5/thumbnails/55.jpg)
class Person def self.defsay(sound) define_method("say_#{sound}") do puts sound end end
defsay :hello defsay :hiend
![Page 56: Ruby is an Acceptable Lisp](https://reader034.fdocuments.us/reader034/viewer/2022042521/5556863cd8b42a182f8b491c/html5/thumbnails/56.jpg)
>> bob = Person.new=> #<Person:0x185cba8>>> bob.say_hellohello=> nil>> bob.say_hihi=> nil
![Page 57: Ruby is an Acceptable Lisp](https://reader034.fdocuments.us/reader034/viewer/2022042521/5556863cd8b42a182f8b491c/html5/thumbnails/57.jpg)
class Plugin < ActiveRecord::Base validates_presence_of :name validates_presence_of :description validates_presence_of :author_id belongs_to :author, :class_name => "User" has_many :plugin_versions, :dependent => :destroy belongs_to :default_version, :class_name => "PluginVersion" acts_as_commentable acts_as_taggable ...end
![Page 58: Ruby is an Acceptable Lisp](https://reader034.fdocuments.us/reader034/viewer/2022042521/5556863cd8b42a182f8b491c/html5/thumbnails/58.jpg)
Magic
![Page 59: Ruby is an Acceptable Lisp](https://reader034.fdocuments.us/reader034/viewer/2022042521/5556863cd8b42a182f8b491c/html5/thumbnails/59.jpg)
NoMethodError
![Page 60: Ruby is an Acceptable Lisp](https://reader034.fdocuments.us/reader034/viewer/2022042521/5556863cd8b42a182f8b491c/html5/thumbnails/60.jpg)
method_missing
![Page 61: Ruby is an Acceptable Lisp](https://reader034.fdocuments.us/reader034/viewer/2022042521/5556863cd8b42a182f8b491c/html5/thumbnails/61.jpg)
User.find_by_name_and_company("Vitaly Kushner", "Astrails")
![Page 62: Ruby is an Acceptable Lisp](https://reader034.fdocuments.us/reader034/viewer/2022042521/5556863cd8b42a182f8b491c/html5/thumbnails/62.jpg)
Ruby rewrite
![Page 63: Ruby is an Acceptable Lisp](https://reader034.fdocuments.us/reader034/viewer/2022042521/5556863cd8b42a182f8b491c/html5/thumbnails/63.jpg)
require 'pp'require 'parse_tree'require 'parse_tree_extensions'
def print_ast(&block) pp block.to_sexpend
![Page 64: Ruby is an Acceptable Lisp](https://reader034.fdocuments.us/reader034/viewer/2022042521/5556863cd8b42a182f8b491c/html5/thumbnails/64.jpg)
print_ast do puts "hello" end
s(:iter, s(:call, nil, :proc, s(:arglist)), nil, s(:call, nil, :puts, s(:arglist, s(:str, "hello"))))
![Page 65: Ruby is an Acceptable Lisp](https://reader034.fdocuments.us/reader034/viewer/2022042521/5556863cd8b42a182f8b491c/html5/thumbnails/65.jpg)
Multiple inheritanceis EVIL
:-)
![Page 66: Ruby is an Acceptable Lisp](https://reader034.fdocuments.us/reader034/viewer/2022042521/5556863cd8b42a182f8b491c/html5/thumbnails/66.jpg)
Modulesa.k.a. Mixins
![Page 67: Ruby is an Acceptable Lisp](https://reader034.fdocuments.us/reader034/viewer/2022042521/5556863cd8b42a182f8b491c/html5/thumbnails/67.jpg)
module FlyHome def set_home @home = position end
def fly_home fly(@home) endend
![Page 68: Ruby is an Acceptable Lisp](https://reader034.fdocuments.us/reader034/viewer/2022042521/5556863cd8b42a182f8b491c/html5/thumbnails/68.jpg)
class Bird < Living include FlyHome def fly(direction) ... def position ...end
class Airplane < Machine include FlyHome def fly(direction) ... def position ...end
![Page 69: Ruby is an Acceptable Lisp](https://reader034.fdocuments.us/reader034/viewer/2022042521/5556863cd8b42a182f8b491c/html5/thumbnails/69.jpg)
Libraries
![Page 70: Ruby is an Acceptable Lisp](https://reader034.fdocuments.us/reader034/viewer/2022042521/5556863cd8b42a182f8b491c/html5/thumbnails/70.jpg)
Rubygems
![Page 71: Ruby is an Acceptable Lisp](https://reader034.fdocuments.us/reader034/viewer/2022042521/5556863cd8b42a182f8b491c/html5/thumbnails/71.jpg)
➜~✗sudogeminstallastrails‐safeSuccessfullyinstalledastrails‐safe‐0.2.71geminstalledInstallingridocumentationforastrails‐safe‐0.2.7...BuildingYARD(yri)indexforastrails‐safe‐0.2.7...InstallingRDocdocumentationforastrails‐safe‐0.2.7...➜~✗
![Page 72: Ruby is an Acceptable Lisp](https://reader034.fdocuments.us/reader034/viewer/2022042521/5556863cd8b42a182f8b491c/html5/thumbnails/72.jpg)
Rubygems.org12,798 gems
![Page 73: Ruby is an Acceptable Lisp](https://reader034.fdocuments.us/reader034/viewer/2022042521/5556863cd8b42a182f8b491c/html5/thumbnails/73.jpg)
Github.com
![Page 74: Ruby is an Acceptable Lisp](https://reader034.fdocuments.us/reader034/viewer/2022042521/5556863cd8b42a182f8b491c/html5/thumbnails/74.jpg)
Communityattitude
![Page 75: Ruby is an Acceptable Lisp](https://reader034.fdocuments.us/reader034/viewer/2022042521/5556863cd8b42a182f8b491c/html5/thumbnails/75.jpg)
Testing
![Page 76: Ruby is an Acceptable Lisp](https://reader034.fdocuments.us/reader034/viewer/2022042521/5556863cd8b42a182f8b491c/html5/thumbnails/76.jpg)
TDD
![Page 77: Ruby is an Acceptable Lisp](https://reader034.fdocuments.us/reader034/viewer/2022042521/5556863cd8b42a182f8b491c/html5/thumbnails/77.jpg)
TDDTest Driven Development
![Page 78: Ruby is an Acceptable Lisp](https://reader034.fdocuments.us/reader034/viewer/2022042521/5556863cd8b42a182f8b491c/html5/thumbnails/78.jpg)
BDD
![Page 79: Ruby is an Acceptable Lisp](https://reader034.fdocuments.us/reader034/viewer/2022042521/5556863cd8b42a182f8b491c/html5/thumbnails/79.jpg)
BDDBehavior Driven Development
![Page 80: Ruby is an Acceptable Lisp](https://reader034.fdocuments.us/reader034/viewer/2022042521/5556863cd8b42a182f8b491c/html5/thumbnails/80.jpg)
Pressure
![Page 81: Ruby is an Acceptable Lisp](https://reader034.fdocuments.us/reader034/viewer/2022042521/5556863cd8b42a182f8b491c/html5/thumbnails/81.jpg)
TATFT
![Page 82: Ruby is an Acceptable Lisp](https://reader034.fdocuments.us/reader034/viewer/2022042521/5556863cd8b42a182f8b491c/html5/thumbnails/82.jpg)
TATFTTest All The Fucking Time
![Page 83: Ruby is an Acceptable Lisp](https://reader034.fdocuments.us/reader034/viewer/2022042521/5556863cd8b42a182f8b491c/html5/thumbnails/83.jpg)
• Test::Unit
• RSpec
• Shoulda
• Cucumber
• Webrat
![Page 84: Ruby is an Acceptable Lisp](https://reader034.fdocuments.us/reader034/viewer/2022042521/5556863cd8b42a182f8b491c/html5/thumbnails/84.jpg)
it "should be able to show media" do @media = stub_media Media.stub!(:find).and_return(@media) get :show, :id => @media.id response.should be_successend
![Page 85: Ruby is an Acceptable Lisp](https://reader034.fdocuments.us/reader034/viewer/2022042521/5556863cd8b42a182f8b491c/html5/thumbnails/85.jpg)
Ruby is Better then Lisp
Q & AVitaly Kushnerastrails.com
@astrails @vkushner