Introduktion till Ruby

Relevanta dokument
Konstruktion av datorspråk

Konstruktion av datorspråk

Introduktion till Ruby

Prova på-laboration i Ruby

Mer om språk och Ruby

TDP007 Konstruktion av datorspråk Hemtentamen

Mer om språk och Ruby

Konstruktion av datorspråk

Domänspecifika språk. TDP007 Konstruktion av datorspråk Föreläsning 5. Peter Dalenius Institutionen för datavetenskap

TDDC74 Lab 04 Muterbara strukturer, omgivningar

Parsning. TDP007 Konstruktion av datorspråk Föreläsning 6. Peter Dalenius Institutionen för datavetenskap

Deklarativ programmering

Deklarativ programmering

Backcode. Jonathan Crusoe TDP019 Projekt: Datorspråk Linköpings universitet

Föreläsning 2 Programmeringsteknik och C DD1316. Mikael Djurfeldt

Exempel: Exempel: Exempel: Exempel: $djur=array("ko","katt","älg"); foreach ($djur as $d) { echo $d. " "; } Resultat. ko katt älg

TDP002 Imperativ programmering

Användarhandledning Version 1.2

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Muddy. Funktioner / metoder. Punktnotation. Evalueringsordning

TDP002 - Imperativ programmering

Programmering för språkteknologer II, HT2011. Rum

F5 Selektion och iteration. ID1004 Objektorienterad programmering Fredrik Kilander

TDP002 - Imperativ programmering

ITK:P1 Föreläsning 1. Programmering. Programmeringsspråket Java. Stark typning Explicit typning Strukturerat Hög säkerhet

Konstruktion av datorspråk

Karlstads Universitet, Datavetenskap 1

Grundläggande programmering, STS 1, VT Sven Sandberg. Föreläsning 12

Tentamen Grundläggande programmering

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Muddy cards. Slingor

Uppmärkningsspråk. TDP007 Konstruktion av datorspråk Föreläsning 3. Peter Dalenius Institutionen för datavetenskap

Classes och Interfaces, Objects och References, Initialization

TDP001: Handhavande av datormiljö, 4 hp. Ola Leifler, Institutionen för datavetenskap

Föreläsning 10 Datalogi 1 DA2001. Utskrift på skärmen. Syntax. print( Hej ) Hur är det? Hej. print( Hej,end= ) print( Hur är det? ) HejHur är det?

Kompilering och exekvering. Föreläsning 1 Objektorienterad programmering DD1332. En kompilerbar och körbar java-kod. Kompilering och exekvering

Uppmärkningsspråk. TDP007 Konstruktion av datorspråk Föreläsning 4. Peter Dalenius Institutionen för datavetenskap

PROMETHEUS. Ett typat, objektorienterat programmeringsspråk av Tim Andersson.

Kodexempel från Programmering 2 Tobias Wrigstad, Ph.D.

Introduktion till programmering SMD180. Föreläsning 2: Variabler, uttryck och satser

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 1 Jonas Lindgren, Institutionen för Datavetenskap, LiU

TDIU01 (725G67) - Programmering i C++, grundkurs

"Är en"-relation. "Har en"-relation. Arv. Seminarium 2 Relevanta uppgifter. I exemplet Boll från förra föreläsningen gällde

Uppmärkningsspråk. TDP007 Konstruktion av datorspråk Föreläsning 3. Peter Dalenius Institutionen för datavetenskap

Programmering I Tobias Wrigstad fredag, 2009 augusti 28

Klassdeklaration. Metoddeklaration. Parameteröverföring

Objektorienterad Programkonstruktion

OOP Objekt-orienterad programmering

Programmeringsteknik II

(Man brukar säga att) Java är... Denna föreläsning. Kompilering av Java. Historik: Java. enkelt. baserat på C/C++ Allmänt om Java

TDDC30. Kursledning Kursledare: Jonas Lindgren. Labassistent: Jonas Lindgren Labassistent: Niklas Holma Labassistent: Erik Nilsson

Föreläsning 2 Programmeringsteknik och C DD1316. Programmering. Programspråk

Imperativ programmering. Föreläsning 2

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 3 Jonas Lindgren, Institutionen för Datavetenskap, LiU

Programmering för språkteknologer II, HT2014. Rum

OOP Tenta

Föreläsning 2 Programmeringsteknik DD1310. Programmering. Programspråk

OOP F1:1. Föreläsning 1. Introduktion till kursen OOP Vad är Java? Ett första Java-program Variabler Tilldelning. Marie Olsson

Python. Python är, som Scheme, ett interpreterat språk men det finns kompilatorer för Python.

TENTAMEN OOP

Python. Python är, som Scheme, ett interpreterat språk men det finns kompilatorer för Python.

Lösningsförslag till exempeltenta 2

Föreläsning 2 Programmeringsteknik DD1310. Programmering. Programspråk

Introduktion till programmering D0009E. Föreläsning 1: Programmets väg

TDDC74 FÖRELÄSNING 9 ANDERS MÄRAK LEFFLER IDA/HCS

Linköpings universitet Innovativ Programmering TDP019 Projekt: Datorspråk. flip/flop. ett helt flippat språk

Syfte : Lära sig objektorienterad programmering Syfte : Lära sig programmering i ett OO-språk vilket?

725G61 - Laboration 5 Grundläggande objektorientering. Johan Falkenjack

Avancerade Webbteknologier

Föreläsning Datastrukturer (DAT036)

I STONE. I Variabler, datatyper, typkonvertering. I Logiska och matematiska uttryck. I Metoder-returvärde och parametrar. I Villkorssatser if/else

Visual Basic, en snabbgenomgång

Introduktion till Datalogi DD1339. Föreläsning 1 8 sept 2014

Dugga Datastrukturer (DAT036)

Konstruktion av datorspråk

Föreläsning 2 Programmeringsteknik och Matlab DD1312. Programspråk. Utskrift på skärmen

729G04 Programmering och diskret matematik. Python 2: Villkorssatser, sanningsvärden och logiska operatorer

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 3 Jonas Lindgren, Institutionen för Datavetenskap, LiU

Testautomatisering. Ruby Repetition

Föreläsning 2 Programmeringsteknik och Matlab DD1312. Programspråk. Utskrift på skärmen

Föreläsning 3: Booleans, if, switch

Erfarenheter från labben

Dagens föreläsning. Diverse Common Lisp. Konstanter, parametrar, globala variabler

Föreläsning Datastrukturer (DAT037)

Objekt-orienterad Programmering och Design. TDA552 Alex Gerdes, HT-2018

Föreläsning 2 Programmeringsteknik och C DD1316

729G74 IT och programmering, grundkurs. Tema 2, Föreläsning 2 Jody Foo,

F4 Klasser och Metoder. ID1004 Objektorienterad programmering Fredrik Kilander

EDAA20 Programmering och databaser. Mål komprimerat se kursplanen för detaljer. Checklista. Föreläsning 1-2 Innehåll. Programmering.

Föreläsningsanteckningar, Introduktion till datavetenskap HT S4 Datastrukturer. Tobias Wrigstad

TDDC74 - Lektionsmaterial C

DD1314 Programmeringsteknik

Objektorienterad Programkonstruktion. Föreläsning 2 2 nov 2016

TDIU01 - Programmering i C++, grundkurs

Outline. For. I istället för att följa det normala ordningen, man ändra den. I i Java får man inte göra hopp hur som helst

Laboration 1 - Grunderna för OOP i Java

TDDE44 Programmering, grundkurs

TDDC74 Lab 02 Listor, sammansatta strukturer

Använda Python Laboration 1 GruDat, DD1344

Planering Programmering grundkurs HI1024 HT 2014

Det finns en referensbok (Java) hos tentavakten som du får gå fram och läsa men inte ta tillbaka till bänken.

Anmälningskod: Lägg uppgifterna i ordning. Skriv uppgiftsnummer (gäller B-delen) och din kod överst i högra hörnet på alla papper

Transkript:

Introduktion till Ruby TDP007 Konstruktion av datorspråk Föreläsning 1 Peter Dalenius Institutionen för datavetenskap 2017-01-16

2 Översikt över dagens föreläsning Vad går kursen ut på? Hur kommer vi arbeta? Schemat i grova drag Förutsättningar för laborationer och seminarier Introduktion till programspråket Ruby Men varför är vi i en datasal?

3 Övergripande frågor Hur konstruerar man ett datorspråk? Vad är ett datorspråk egentligen? Varför skulle man vilja konstruera ett nytt språk? Hur vet man om ett språk är bättre än ett annat?

4 Lärandemål Förklara och använda reguljära uttryck Använda verktyg för hantering av uppmärkningsspråk (t ex XML) Använda och modifiera en tolk för ett enklare programspråk Redogöra för och tillämpa grundläggande principer för design av datorspråk

5 Kursens upplägg: fyra delar Introduktion till Ruby Strukturerad text och XML Domänspecifika språk och parsning Alternativa beräkningsmetoder och constraint propagation

6 Arbetssätt För var och en av kursens fyra delar: föreläsningar laborationer inlämning av uppgifter (med hårda deadlines) förberedelser inför seminarier (på kort tid) seminarium (med obligatorisk närvaro)

7 Laborationer inför seminarierna Uppgifterna finns på kurswebben under rubriken Seminarier Labbarna genomförs i Studio IP1 Labbassistenter: Harald Grant, Henrik Ingbrant Björs Labbar genomförs i slumpmässigt hopsatta par. (Se indelning i Webreg!) Se till att få kontakt med din labbpartner så snart som möjligt! Uppgifterna skickas in via kurswebben senast en viss deadline. Förutom svar på uppgifterna (i form av kod) ska även enhetstester och en utvecklarblogg bifogas.

8 Utvecklarblogg Reflektioner kring hur det är att lära sig ett nytt språk (Ruby): Hur har ni gått tillväga för att lära er Ruby? Vilka fel och misstag har ni gjort under tiden? Vad finns det för nya konstruktioner i Ruby som ni inte sett förut? Vad finns det för konstruktioner som ni känner igen men som ser lite annorlunda ut? Finns det något som ni irriterar er på eller tycker om i Ruby? Reflektioner kring de olika tekniker som ni stöter på: Hur användbart verkar detta vara? Hur lätt/svårt är det att sätta sig in i? Har ni hittat alternativa källor för att ta reda på nya saker? Dokumentation av hur ni har tänkt när ni arbetat fram era lösningar: Vad arbetade ni med (i grova drag) vid varje labbpass? Hur har ni tolkat uppgiften? Vad var svårt eller lätt med uppgiften?

9 Seminarier Förbered opposition av annan grupps lösningsförslag Utvalda grupper presenteras vid seminariets början Opposition i labbpar: presentation av lösningen i grova drag kommentarer kring tolkning av uppgiften och användning av tekniker kommentarer kring kodningsstil, tester och utvecklarblogg Obligatorisk närvaro vid seminarier! Varje labbpar opponerar minst en gång, antagligen två. Seminariet är den egentliga examinationen.

10 Seminarieschema V.4 onsdag 25/1 kl 10-12 V.6 onsdag 8/2 kl 10-12 V.8 onsdag 22/2 kl 10-12 V.10 tisdag 7/3 kl 08-10 Deadline för inlämning är två dagar innan seminariet, senast kl 19.00.

11 Examination Labbar och seminarier utgör den ena delen av kursen (LAB1, 2 hp) Duggor och/eller tenta utgör den andra delen av kursen (DAT1, 4 hp) och ligger till grund för individuellt betyg. Två duggor, två timmar vid dator, två gånger under kursen. Om man inte blir godkänd finns en fyratimmars datortenta efter kursen. Duggorna ligger dagen efter seminarium 2 och 4: V.6 torsdag 9/2 kl 13.30-15.30 (salen bokad 13-17) V.10 onsdag 8/3 kl 08.30-10.30 (salen bokad 08-12)

12 Tidigare utvärderingar och förändringar År Betyg Förändringar som gjordes efter kursen 2016 4,43 Inga större förändringar 2015 4,50 Inga större förändringar (låg svarsfrekvens!) 2014 4,00 Inga större förändringar 2013 4,46 Inga större förändringar 2012 3,78 Inga större förändringar 2011 4,29 Ny uppgift inför seminarie 3 2010 3,91 Bättre instruktioner angåe enhetstester och utvecklarbloggar 2009 3,50 Förtydligande av ett flertal seminarieuppgifter 2008 2,69 Byte av lärare, delvis andra typer av tentauppgifter

13 Några sista detaljer Kurslitteratur: Programming Ruby 1.9 & 2.0 av Dave Thomas (används egentligen bara som referensbok) Läs instruktionerna som finns på kursens webbsidor, framför allt gällande examinationen! Första seminariet: V.4 onsdag 25/1 kl 10-12 Första duggan: V.6 torsdag 9/2 kl 13.30-15.30

Introduktion till Ruby

Översikt Hur man startar och använder programspråket Ruby Snabbgenomgång av några utvalda detaljer i Ruby

16 Ruby konstruerades 1993 av japanen Yukihiro Matz Matsumoto är ett objektorienterat språk med influenser från Perl, Smalltalk, Eiffel, Ada och Lisp är interpreterat har kommit att bli ett populärt språk, inte minst tack vare webbramverket Ruby on Rails finns tillgänglig via www.ruby-lang.org med dokumentation på www.ruby-doc.org

17 Hur man använder Ruby I våra Linux-PUL finns Ruby 1.9 förinstallerat och kan startas direkt. (Senaste versionen är annars 2.4.) Man kan komma åt interpretatorn på några olika sätt: Starta interaktiv Ruby med kommandot irb Kör Ruby-interpretator via Emacs med M-x runruby eller C-c C-s om man är i Ruby-läge

18 Interaktiv Ruby irb(main):001:0> puts "Hello!" Hello! => nil irb(main):002:0> 14+5 => 19 irb(main):003:0> def fun(a) irb(main):004:1> a+2 irb(main):005:1> => nil irb(main):006:0> fun(27) => 29 Starta med irb --simple-prompt för en enklare prompt. Alla uttryck i Ruby returnerar någonting, automatiskt.

19 Ruby via Emacs Ruby-kod ska heta.rb

20 Ruby som scriptspråk turte123@li10-3:-$ cat hello.rb #!/usr/bin/env ruby puts "Hello, world!" turte123@li10-3:-$ hello.rb Hello, world! turte123@li10-3:-$

21 Övning Starta en Ruby-interpretator med kommandot irb och testa lite enkel Ruby-kod. Lägg till Ruby-inställningen i Emacs genom att lägga till följande rader i inställningsfilen.emacs (nconc load-path '("/home/tdp007/www-pub/material/ruby-1.9-emacs")) (require 'ruby-site) Starta Emacs och därefter en Ruby-interpretator inifrån Emacs, antingen med menyn Ruby Run Ruby eller med C-c C-s. (Funkar bara om man är i Ruby-läge, dvs om man har öppnat en Ruby-fil.) Testa lite enkel Ruby-kod.

22 Allting i Ruby är objekt Uttryck Resultat 7.class Fixnum (3.14).class Float 3.14.round 3 gurka.length 5 gurka.class String krämen växer.gsub( r, j ) kjämen växej banan.gsub( a, ur ).length 7 [ apa, banan, lime ].length 3 [ apa, banan, lime ].reverse [ lime, banan, apa ] 1.+(2) 3 1+2 3

Klasser och arv 23 Basklass class Person def initialize(name) @name = name def greet "Hello, my name is #{@name}." Underklass class Matz < Person def initialize super( Yukihiro Matsumoto ) >> brian = Person.new( Brian ) => #<Person:0x1a3760 @name= Brian > >> puts brian.greet Hello, my name is Brian. => nil >> puts Matz.new.greet Hello, my name is Yukihiro Matsumoto. => nil

24 Exempel på grundläggande syntax def multi_foo(count = 3) foo * count >> multi_foo(4) => foofoofoofoo >> puts Hello, world! Hello, world! => nil >> This is #{multi_foo(2)}. => This is #{multi_foo(2)}. >> This is #{multi_foo(2)}. => This is foofoo. Metoder definieras med def och argumenten kan ha defaultvärden. Man kan utelämna parenteser runt argument, om det inte blir tvetydigt. Konstanta strängar som definierats med dubbelt citationstecken kan innehålla undantag med programkod.

25 Mer om namngivning och syntax Variabler, metoder: i, max_count, db_connect Konstanter: MAX_AGE, LAST_THING Klasser: StudentList, ResultThing Instansvariabler: Klassvariabler: Globala variabler: Symboler: @name, @last_time @@lookup_table $glob, $1, $count :name, :age

Arrayer 26 >> [3, little', pigs"].join(' ') => "3 little pigs" >> a = Array.new => [] >> a << 'some' << 'things' << 'app' => ["some", "things", "app"] >> a[1] => "things" >> a[0] = 17 => 17 >> a => [17, "things", "app"] >> Array.new(5,0) => [0, 0, 0, 0, 0] >> a = Array.new(2, 'Kalle') => ["Kalle", "Kalle"] >> a[0] << ' Karlsson' => "Kalle Karlsson" >> a => ["Kalle Karlsson", "Kalle Karlsson"] Exempel på array Skapa en array Åtkomst av enskilda element Array med defaultvärden Se upp med vad det är du pushar!

27 Arrayer som stackar eller köer print 'Array as stack: ' stack = Array.new() stack.push('a') stack.push('b') stack.push('c') print stack.pop until stack.empty? Arrayen kan användas både som en stack och som en kö, beroe på vilka metoder man använder. print "\n" print 'Array as queue: ' queue = Array.new() queue.push('a').push('b').push('c') print queue.shift until queue.empty? Array as stack: cba Array as queue: abc => nil

Hashtabeller >> h1={'one'=>1, 'two'=>2, 'three'=>3} => {"three"=>3, "two"=>2, "one"=>1} >> h1['one'] => 1 >> h2=hash.new => {} >> h2['gemstone']='ruby' => "ruby" >> h2['fruit']='banana' => "banana" >> h2 => {"gemstone"=>"ruby", "fruit"=>"banana"} >> h2={:june=>'perl', :july=>'ruby'} => {:july=>"ruby", :june=>"perl"} >> h2[:july] => "ruby" Med hashtabeller kan man enkelt slå upp information. Hur man skapar en hash och fyller den med innehåll. Ofta används symboler som nycklar. 28

Block och iteratorer En metod kan ta ett block som argument. Ett block är en bit kod som även innehåller den aktuella omgivningen. En iterator är en metod som tar ett block och kör det för varje element i t.ex. en array. 29 >> ['i', 'am', 'a', 'donkey'].each do entry print entry, ' ' i am a donkey => ["i", "am", "a", "donkey"] >> fac= 1 => 1 >> 1.upto(5) do i fac*= i => 1 >> fac => 120 >> [1, 2, 3, 4, 5].map { entry entry * entry } => [1, 4, 9, 16, 25] >> (0..100).inject(0) { result, entry result + entry } => 5050

30 Olika sätt att skriva block [1,2,3,4,5].each do e puts e Använd block med do när sidoeffekterna (t.ex. utskrift) är det viktiga, eller när koden upptar flera rader. [1,2,3,4,5].map { e e * e } Använd block med { } när returvärdet är det viktiga.

31 Hur man skriver egna iteratorer def f(count, &block) value = 1 1.upto(count) do i value = value * i block.call(i, value) Blocket anges som sista argument och föregås av &. Blocket anropas med metoden call. f(5) do i, f_i puts "f(#{i}) = #{f_i}" f(1) = 1 f(2) = 2 f(3) = 6 f(4) = 24 f(5) = 120

32 Blocket kan sparas undan class Repeater def initialize(&block) @block = block @count = 0 def repeat @count += 1 @block.call(@count) Blocket anges som argument till konstruktorn och sparas i en instansvariabel. Blocket körs genom att anropa repeat, vilket också ökar på räknaren. repeater = Repeater.new do count puts "You called me #{count} times" 3.times do repeater.repeat

Tilldelning 33 >> a=4 => 4 >> a=b=4 => 4 >> file=file.open('c:\prov.txt') => #<File:c:\prov.txt> >> linecount=0 => 0 >> linecount+=1 while (line=file.gets) => nil >> a+=2 => 6 >> a=a+2 => 8 >> a,b=b,a => [4, 8] >> array=[1,2] => [1, 2] >> a,b=*array => [1, 2] En tilldelning returnerar alltid det tilldelade värdet, vilket gör att man kan koppla ihop dem. Tilldelningar kan användas som villkorsuttryck. Det finns genvägar för enkla tilldelningar. Parallell tilldelning Uppdelning av array

Villkor 34 if (1 + 1 == 2) "Like in school." else "What a surprise!" "Like in school." if (1 + 1 == 2) "Surprising!" unless (1 + 1 == 2) (1 + 1 == 2)? Working : Defect spam_probability = rand(100) case spam_probability when 0...10 then "Lowest probability" when 10...50 then "Low probability" when 50...90 then "High probability" when 90...100 then "Highest probability" Normal villkorssats Villkoret efter ett uttryck Snabbval Flera alternativ Endast nil och false är falska, alla andra värden är sanna, inklusive konstanten true.

Upprepning 35 while (i<10) i*=2 i*=2 while (i<100) begin i*=2 while (i<100) i*=2 until (i>=1000) loop do break i if (i>=4000) i*=2 4.times do i*=2 r=[] for i in 0..7 next if i%2==0 r<<i (0..7).select { i i%2!=0 } Normal upprepning med test innan Upprepning efter uttryck Upprepning med test efter Uthopp ur loop vid godtycklig punkt Iterator Upprepning med for, samt överhoppning av vissa varv

36 Klassdefinitioner class Cell def initialize @state = :empty class Board def initialize(width, height) @width = width; @height = height @cells = Array.new(height) { Array.new(width) { Cell.new } }

37 Åtkomst av egenskaper class Cell def state @state class Cell attr_reader:state class Board def size self.width * self.height class Cell def state=(new_state) @state=new_state class Cell attr_writer:state class Cell attr_accessor:state

38 Array-liknande åtkomstmetoder class Board def [](col, row) @cells[col][row] >> board = Board.new(8, 8) => #<Board:... @height=8...> >> board[0, 0] => #<Cell:... @state=:e...> >> board[0, 0] = Cell.new() => #<Cell:... @state=:e...> class Board def []=(col, row, cell) @cells[col][row] = cell >> board = Board.new(8, 8) => #<Board:... @height=8...> >> board[0, 0] => #<Cell:... @state=:e...> >> board[0, 0] = Cell.new() => #<Cell:... @state=:e...> >> board[0, 0].state = :tower => :tower >> board[0, 0].state => :tower

www.liu.se