2. Функционални Закачки

104
2. Функционални закачки speaker {[“Stefan”, “Kanev”].join(““)} speaker { “Nikolay” + ““ + “Bachiyski” } on_date { @lecture_date || “13102008” }

Upload: stefan-kanev

Post on 10-Jul-2015

1.027 views

Category:

Technology


0 download

DESCRIPTION

Втора лекция от курса във ФМИ.

TRANSCRIPT

Page 1: 2. Функционални Закачки

2. Функционалнизакачки

speaker { [“Stefan”, “Kanev”].join(“ “) }speaker { “Nikolay” + “ “ + “Bachiyski” }on_date { @lecture_date || “13‐10‐2008” }

Page 2: 2. Функционални Закачки

2. Функционалнизакачки

speaker { [“Stefan”, “Kanev”].join(“ “) }speaker { “Nikolay” + “ “ + “Bachiyski” }on_date { @lecture_date || “13‐10‐2008” }

Page 3: 2. Функционални Закачки
Page 4: 2. Функционални Закачки

Хиперкуб

Page 5: 2. Функционални Закачки

1415926535 8979323846 2643383279 5028841971 69399375105820974944 5923078164 0628620899 8628034825 34211706798214808651 3282306647 0938446095 5058223172 53594081284811174502 8410270193 8521105559 6446229489 54930381964428810975 6659334461 2847564823 3786783165 27120190914564856692 3460348610 4543266482 1339360726 02491412737245870066 0631558817 4881520920 9628292540 91715364367892590360 0113305305 4882046652 1384146951 94151160943305727036 5759591953 0921861173 8193261179 31051185480744623799 6274956735 1885752724 8912279381 83011949129833673362 4406566430 8602139494 6395224737 19070217986094370277 0539217176 2931767523 8467481846 76694051320005681271 4526356082 7785771342 7577896091 73637178721468440901 2249534301 4654958537 1050792279 68925892354201995611 2129021960 8640344181 5981362977 47713099605187072113 4999999837 2978049951 0597317328 16096318595024459455 3469083026 4252230825 3344685035 2619311881

3.

Page 6: 2. Функционални Закачки
Page 7: 2. Функционални Закачки
Page 8: 2. Функционални Закачки
Page 9: 2. Функционални Закачки

DomainSpecificLanguage

Page 10: 2. Функционални Закачки

mind.refresh

Page 11: 2. Функционални Закачки

3.141_729

"Who is John Galt?"

[18, :f, "Sofia"]

{:jazz => ["Thelonious Monk", "Bill Evans"],:baroque => ["J.S. Bach", "Henry Purcell"],:classical => ["L.V. Beethoven", "W.A. Mozart"] }

Page 12: 2. Функционални Закачки

if hungry?eat

elsesleep until hungry?

end

work until job.done?write_code(:ruby) while me.unhappy?eat(food) if hungry?write_code unless tired?

Page 13: 2. Функционални Закачки

функции

Page 14: 2. Функционални Закачки

функционалнопрограмиране

Page 15: 2. Функционални Закачки
Page 16: 2. Функционални Закачки
Page 17: 2. Функционални Закачки
Page 18: 2. Функционални Закачки

приема неща

връща неща

Page 19: 2. Функционални Закачки

Обекти

приема неща

връща неща

Page 20: 2. Функционални Закачки
Page 21: 2. Функционални Закачки

order, change = use_machine(number, money)

Page 22: 2. Функционални Закачки

order, change = use_machine(number, money)

Неща

coffee, change = use_machine(42, 1.50)

Page 23: 2. Функционални Закачки
Page 24: 2. Функционални Закачки

cup, cash = order("Cappuccino", 3) do |pref|pref.make_shortpref.add_sugar 2pref.add_extra :cream

end

Page 25: 2. Функционални Закачки

приема неща

връща неща

Page 26: 2. Функционални Закачки

приема нещаприема инструкциивръща неща

Page 27: 2. Функционални Закачки

приема нещаприема инструкциивръща неща

Код

Page 28: 2. Функционални Закачки

cup, cash = order("Cappuccino", 3) do |pref|pref.make_shortpref.add_sugar 2pref.add_extra :cream

end

Page 29: 2. Функционални Закачки

>> numbers = [2, 3, 5, 7]

>> numbers.map { |x| x ** 2 }[4, 9, 25, 49]

>> numbers.select { |x| x > 4 }[5, 7]

Page 30: 2. Функционални Закачки

извикване do |аргументи|код

end

извикване { |аргументи| код }

Page 31: 2. Функционални Закачки

File.open("spendings").each_line do |line|next unless well_formed?(line)date, category, amount = line.splitcategory_sum[category] += amount.to_i

end

points.all? { |x,y| saved.include? [y,x] }

Page 32: 2. Функционални Закачки

points.all? { |x,y| saved.include? [y,x] }

Блок / КорутинаИтератор

Улей

Щипки

Page 33: 2. Функционални Закачки
Page 34: 2. Функционални Закачки
Page 35: 2. Функционални Закачки

Пич, извикайкорутината

Page 36: 2. Функционални Закачки

def twiceyieldyield

end

twice { puts “Ruby rocks!” }

Page 37: 2. Функционални Закачки

accumulate

Page 38: 2. Функционални Закачки

def accum(start, items)result, items = start, items.dupyield(result, items.pop) until items.empty?result

end

numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]puts accum(0, numbers) { |a, b| a + b }puts accum(1, numbers) { |a, b| a * b }

Page 39: 2. Функционални Закачки

def with_primes(max)2.upto(max) do |n|

yield n unless (2...n).any? { |c| n % c == 0 }end

end

with_primes(10) { |x| puts x }

Page 40: 2. Функционални Закачки

2.upto(10) do |n|

Page 41: 2. Функционални Закачки

(2..10)(2…10)

Page 42: 2. Функционални Закачки

any?all?

Page 43: 2. Функционални Закачки

students.any? { |s| s.cheated? }numbers.all? { |x| x % 2 == 0 }

Page 44: 2. Функционални Закачки

def with_primes(max)2.upto(max) do |n|

yield n unless (2...n).any? { |c| n % c == 0 }end

end

with_primes(10) { |x| puts x }

Page 45: 2. Функционални Закачки

return

Page 46: 2. Функционални Закачки

def magic_roots(numbers)numbers.map do |number|

return number ** 0.5 if number < 0(‐number) ** 0.5

endend

magic_roots([100, ‐25, ‐9, 16])

Page 47: 2. Функционални Закачки

defreturn

end

Page 48: 2. Функционални Закачки

nextbreak

Page 49: 2. Функционални Закачки

n, found = 1, 0while true

n += 1next unless (2...n).any? { |a| n % a == 0 }found += 1puts "#{n} squared is #{n * n}"break if found >= 50

end

Page 50: 2. Функционални Закачки

lucky = []users.each do |user|

next unless user.submitted_homework?lucky << userbreak if lucky.size >= 5

end

Page 51: 2. Функционални Закачки

next(arg)break(arg)

Page 52: 2. Функционални Закачки

item = items.first_itemfound = until item.nil?

break item if item.nice? and item.shiny?item = item.successor

end

Page 53: 2. Функционални Закачки

def magic_roots(numbers)numbers.map do |number|

next number ** 0.5 if number < 0(‐number) ** 0.5

endend

magic_roots([100, ‐25, ‐9, 16])

Page 54: 2. Функционални Закачки

points.all? { |x,y| saved.include? [y,x] }

Блок / КорутинаИтератор

Улей

Щипки

Page 55: 2. Функционални Закачки

nextизлез от блока в итератора

breakизлез от итератора

Page 56: 2. Функционални Закачки

lucky = []users.each do |user|next unless user.submitted_homework?lucky << userbreak if lucky.size >= 5

end

Page 57: 2. Функционални Закачки

EnumerableArrayHash

Page 58: 2. Функционални Закачки

collectselectinject

Page 59: 2. Функционални Закачки

001:0> numbers = [1, 2, 3, 4, 5, 6, 7]=> [1, 2, 3, 4, 5, 6, 7]002:0> numbers.collect { |n| n ** 2 }=> [1, 4, 9, 16, 25, 36, 49]003:0> numbers.select { |n| n % 2 == 0 }=> [2, 4, 6]004:0> numbers.inject { |a, b| a + b }=> 28

Page 60: 2. Функционални Закачки

emails = []users.each do |user|

emails << user.email if user.active?endreturn emails

users.select { |u| u.active? }.map { |u| u.email }

Page 61: 2. Функционални Закачки

alias :collect, :mapalias :select, :find_all

Page 62: 2. Функционални Закачки

001:0> people = ["Coltrane", "Monk", "Davis", "Evans"]002:0> people.all? { |x| x =~ /^[A‐Z][a‐z]+$/ }=> true003:0> people.any? { |name| name.include? 'trane' }=> true004:0> people.sort=> ["Coltrane", "Davis", "Evans", "Monk"]005:0> people.sort { |a, b| a.size <=> b.size }=> ["Monk", "Evans", "Davis", "Coltrane"]006:0> people.sort_by { |name| name.size }=> ["Monk", "Evans", "Davis", "Coltrane"]007:0> people.each_with_index { |n, i| puts "#{i}. #{n}" }0. Coltrane1. Monk2. Davis3. Evans008:0> people.detect { |name| name.include? "s" }=> "Davis“009:0> people.zip(["John", "Thelonious", "Miles", "Bill"])=> [["Coltrane", "John"], ["Monk", "Thelonious"], ["Davis", "Miles"], ["Evans", "Bill"]]

Page 63: 2. Функционални Закачки

collect!select!

Page 64: 2. Функционални Закачки
Page 65: 2. Функционални Закачки

:symbol

Page 66: 2. Функционални Закачки

symbol != char

Page 67: 2. Функционални Закачки

Symbol.similar_to String

Page 68: 2. Функционални Закачки

{:host => "fmi.rails‐bg.net",:port => 3306,:username => "website",:password => "gould",:database => "website",

}

Page 69: 2. Функционални Закачки

wazup?!!!?!??1:!!??

def wazup?(a)puts "#{a} dat!"

end

Page 70: 2. Функционални Закачки

def greet(name = "Unknown")puts "Greetings, #{name}"

end

greetgreet "Ruby"

Page 71: 2. Функционални Закачки

connect :db, :host => "172.0.0.1", :port => 3306

connect(:db, {:host => "172.0.0.1", :port => 3306})

def connect(what, options = {})

Page 72: 2. Функционални Закачки

form_for(url, html_options)

form_for {:action => "show", :id => 1}, :class => "horizontal"

form_for do:action => "show", :id => 1

end, :class => "horizontal"

Page 73: 2. Функционални Закачки

001:0> hash, string = {"John" => "Coltrane", "Eddie" => "Vedder"}, "lar\nodi"002:0> puts hash.to_sJohnColtraneEddieVedder003:0> puts hash.inspect{"John"=>"Coltrane", "Eddie"=>"Vedder"}004:0> puts string.to_slarodi005:0> puts string.inspect"larodi"

Page 74: 2. Функционални Закачки

to_sinspect

Page 75: 2. Функционални Закачки

p foo"It is: %p" % foo

Page 76: 2. Функционални Закачки
Page 77: 2. Функционални Закачки
Page 78: 2. Функционални Закачки
Page 79: 2. Функционални Закачки
Page 80: 2. Функционални Закачки
Page 81: 2. Функционални Закачки
Page 82: 2. Функционални Закачки

lambda

Page 83: 2. Функционални Закачки

square = lambda { |x| x ** 2 }

puts square(7) # Не работи

puts square.call(7)

puts square[7]

Page 84: 2. Функционални Закачки

seek = lambda do |needle, haystack|haystack.each do |item|

return true if item.equal?(needle)endfalse

end

Page 85: 2. Функционални Закачки

square = ‐> (x) { x ** 2 }

1.9

Page 86: 2. Функционални Закачки

Proc.new

Page 87: 2. Функционални Закачки

root = Proc.new { |x| x ** 0.5 }

positivep = Proc.new { |x| x > 0 }

puts root[x] if positivep[x]

Page 88: 2. Функционални Закачки

def my_map(list, operation)result = []list.each do |item|

result << operation[item]endresult

end

p my_map([2, 3, 5, 7], Proc.new { |x| x ** 2})

Page 89: 2. Функционални Закачки

def my_map(list, operation)result = []list.each do |item|

result << yield(item)endresult

end

p my_map([2, 3, 5, 7]) { |x| x ** 2}

Page 90: 2. Функционални Закачки

def my_map(list, operation)result = []list.each do |item|

result << yield(item)endresult

end

operation = Proc.new { |x| x ** 2 }p my_map([2, 3, 5, 7]) ... ???

Page 91: 2. Функционални Закачки

proc→ block

Page 92: 2. Функционални Закачки

def my_map(list, operation)result = []list.each do |item|

result << yield(item)endresult

end

operation = Proc.new { |x| x ** 2 }p my_map([2, 3, 5, 7], &operation)

Page 93: 2. Функционални Закачки

block → proc

Page 94: 2. Функционални Закачки

def my_map(list, &operation)result = []list.each do |item|

result << operation[item]endresult

end

p my_map([2, 3, 5, 7]) { |x| x ** 2 }

Page 95: 2. Функционални Закачки

block_given?

Page 96: 2. Функционални Закачки

def can_has_block?return block_given?

end

puts can_has_block? # falseputs can_has_block? { “plz } # true

Page 97: 2. Функционални Закачки

def my_proc(&block)block

end

square = my_proc { |x| x ** 2 }puts square.call(7)puts square[42]

Page 98: 2. Функционални Закачки

(‐>_{_%_})["(‐>_{_%%_})[%p]"]

Page 99: 2. Функционални Закачки

def raise_to_power(numbers, power)numbers.map { |x| x ** power }

end

p raise_to_power([2, 3, 5, 7], 3)

Page 100: 2. Функционални Закачки

def raise_to_power(numbers, power)numbers.map { |x| x ** power }

end

p raise_to_power([2, 3, 5, 7], 3)

Page 101: 2. Функционални Закачки

def make_stamp(owner)time = Time.now

lambda do |thing|"#{time}: #{thing} is owned by #{owner}"

endend

sony = make_stamp("Sony")puts sony["Playstation"]sleep 1microsoft = make_stamp("Microsoft")puts microsoft["X‐box"]puts sony["Playstation"]

Page 102: 2. Функционални Закачки

Mon Oct 13 16:37:22 +0300 2008: Playstationis owned by SonyMon Oct 13 16:37:23 +0300 2008: X‐box is owned by MicrosoftMon Oct 13 16:37:22 +0300 2008: Playstationis owned by Sony

Page 103: 2. Функционални Закачки

def cuckoon = 0tick = lambda { n += 1 }tack = lambda { puts n }return tick, tack

end

one, two = cuckootwo[] # 0one[]two[] # 1one[]

three, four = cuckoofour[] # 0two[]  # 2

Page 104: 2. Функционални Закачки

can_haz_keushunz?