Konstruktion av datorspråk

Relevanta dokument
Konstruktion av datorspråk

Introduktion till Ruby

Introduktion till Ruby

Prova på-laboration i Ruby

Deklarativ programmering

TDP007 Konstruktion av datorspråk Hemtentamen

Konstruktion av datorspråk

Mer om språk och Ruby

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

Konstruktion av datorspråk

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

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

Mer om språk och Ruby

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

Deklarativ programmering

F5 Selektion och iteration. ID1004 Objektorienterad programmering Fredrik Kilander

Tentamen Grundläggande programmering

TDDC74 Lab 04 Muterbara strukturer, omgivningar

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

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

Användarhandledning Version 1.2

Programmeringsteknik II

Karlstads Universitet, Datavetenskap 1

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

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?

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

Classes och Interfaces, Objects och References, Initialization

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

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

TENTAMEN OOP

(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. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 3 Jonas Lindgren, Institutionen för Datavetenskap, LiU

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

Testautomatisering. Ruby Repetition

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

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

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

Imperativ programmering. Föreläsning 2

OOP Tenta

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

Objektorienterad Programkonstruktion

Lösningsförslag till exempeltenta 2

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

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

Klassdeklaration. Metoddeklaration. Parameteröverföring

Programmering I Tobias Wrigstad fredag, 2009 augusti 28

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

TENTAMEN TDDB53. Programmering i Ada för MI (provkod TEN2) den 7 april 2010 kl Institutionen för datavetenskap, IDA Olle Willén mars 2010

Föreläsning Datastrukturer (DAT036)

Dugga Datastrukturer (DAT036)

Föreläsning Datastrukturer (DAT037)

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

TDP002 Imperativ programmering

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

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

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

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

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

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

Platser för att skriva och testa kod online. Workshop om programmering i matematikkurser, version 0.7 senast sparat

F4 Klasser och Metoder. ID1004 Objektorienterad programmering Fredrik Kilander

Erfarenheter från labben

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

Visual Basic, en snabbgenomgång

Föreläsning 2 Programmeringsteknik och C DD1316

TENTAMEN OOP

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

TDIU01 - Programmering i C++, grundkurs

Lösningsförslag till exempeltenta 1

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

TDP002 - Imperativ programmering

String [] argv. Dagens Agenda. Mer om arrayer. Mer om arrayer forts. String [] argv. argv är variabelnamnet. Arrayer och Strängar fortsättning

Imperativ programmering. Imperativ programmering konstruktioner i Lisp. Datastrukturer (kap ) arraystruktur poststruktur

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

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

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

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

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

TDP002 - Imperativ programmering

Tentamen i Algoritmer & Datastrukturer i Java

Klassen BST som definierar binära sökträd med tal som nycklar och enda data. Varje nyckel är unik dvs förekommer endast en

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

JavaScript. Innehåll. Historia. Document object model DHTML. Varför Javascript?

Tentamen Datastrukturer (DAT036)

Programmering A. Johan Eliasson

Föreläsning 2 Datastrukturer (DAT037)

Dagens text. Programmeringsteknik. Mer om Scanner-klassen. Dialogrutor (klassen JOptionPane) Bubbelsortering. Omslagsklasser.

Föreläsning Datastrukturer (DAT036)

Vad handlar kursen om? Algoritmer och datastrukturer. Vad handlar kursen om? Vad handlar kursen om?

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

Konstruktion av datorspråk

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

DD1310/DD1314/DA3009 Programmeringsteknik LÄRANDEMÅL... Vilka läser kursen? ...FLER LÄRANDEMÅL. Föreläsning 1

EDA095 JavaScript. Per Andersson. Maj 4, Lund University Per Andersson EDA095 JavaScript Maj 4, / 23

TDDE44 Programmering, grundkurs

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

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

Lägg uppgifterna i ordning. Skriv uppgiftsnummer och din kod överst i högra hörnet på alla papper.

SMD 134 Objektorienterad programmering

ID1004 Laboration 4, November 2012

Transkript:

Konstruktion av datorspråk Fö1: Kursintroduktion och introduktion till Ruby Peter Dalenius petda@ida.liu.se Institutionen för datavetenskap Linköpings universitet Översikt Kursens målsättning Hur vi kommer arbeta i kursen schemat i grova drag förutsättningar för laborationer och seminarier Introduktion till programspråket Ruby 2009-01-19 Övergripande frågor Lärandemål 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? förstå olika beräkningsmodeller för datorspråk resonera kring design av datorspråk och andra metanotationer implementera ett eget datorspråk för ett givet ändamål använda och modifiera en tolk för språksyntax redogöra för och använda reguljära uttryck använda XML för att definera data- och metadataformat

Kursens upplägg Seminarieschema 1. Introduktion till Ruby 2. Strukturerad text och XML 3. Domänspecifika språk och parsning 4. Alternativa beräkningsmodeller och constraint propagation v.5 tis 27/1 10-12 (sön 25/1 23.59) v.6 tor 5/2 13-15 (tis 3/2 15.00) v.8 tor 19/2 13-15 (tis 17/2 15.00) v.10 tor 5/3 13-15 (tis 3/3 15.00) Till varje del i kursen hör ett antal föreläsningar och laborationer. Ni ska i par genomföra uppgifter som sedan diskuteras vid ett seminarium. Laborationer Utvecklarblogg Labbar genomförs i slumpmässigt hopsatta par. Uppgifterna skickas in via hemsidan senast en viss deadline. Förutom svar på uppgifterna ska även enhetstester och en utvecklarblogg bifogas. 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?

Seminarier Duggor och tenta 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å. Labbar och seminarier utgör den ena delen av kursen (LAB1, 2hp) Duggor och/eller tenta utgör den andra delen av kursen (DAT1, 4hp) 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. Några fler detaljer Introduktion till Ruby Kurslitteratur (se utdelad kursinfo) Läs instruktioner på kursens webbsidor Hur man startar och använder Ruby. En icke heltäckande snabbgenomgång av några utvalda detaljer i Ruby.

Ruby Hur man använder Ruby konstruerades 1993 av japanen Yukihiro "Matz" Matsumoto. är ett objektorienterat språk med influenser från bl. a. 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. I våra Sun-PUL, skriv följande i ett terminalfönster: module add prog/ruby module initadd prog/ruby Starta interaktiv Ruby med irb Kör Ruby via Emacs Interaktiv Ruby Ruby via Emacs irb(main):001:0> puts "Hello!" Hello! irb(main):002:0> 14+5 => 19 irb(main):003:0> def fun(a) irb(main):004:1> a+2 irb(main):005:1> irb(main):006:0> fun(27) => 29 irb --simple-prompt ger en mindre pratig prompt

Ruby som scriptspråk zaza9 <1> cat hello.rb #!/bin/env ruby w puts Hello, world! zaza9 <2> hello.rb Hello, world! zaza9 <3> 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 5 [ apa, banan, lime ].reverse [ lime, banan, apa ] 1.+(2) 3 1+2 3 Klasser och arv Exempel på grundläggande syntax Basklass Underklass class Person def initialize(name) @name = name def greet "Hello, my name is #{@name}." class Matz < Person def initialize super( Yukihiro Matsumoto ) def multi_foo(count = 3) foo * count >> multi_foo(4) => foofoofoofoo >> puts Hello, world! Hello, world! Metoder definieras med def och argumenten kan ha defaultvärden. Man kan utelämna parenteser runt argument, om det inte blir tvetydigt. >> brian = Person.new( Brian ) => #<Person:0x1a3760 @name= Brian > >> puts brian.greet Hello, my name is Brian. >> puts Matz.new.greet Hello, my name is Yukihiro Matsumoto. >> This is #{multi_foo(2)}. => This is #{multi_foo(2)}. >> This is #{multi_foo(2)}. => This is foofoo. Konstanta strängar som definierats med dubbelt citationstecken kan innehålla undantag med programkod.

Mer om namngivning och syntax Variabler, metoder: i, max_count, db_connect Konstanter: MAX_AGE, LAST_THING Klasser: StudentList, ResultThing Instansvariabler: @name, @last_time Klassvariabler: @@lookup_table Globala variabler: $glob, $1, $count Symboler: :name, :age Arrayer >> [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! Arrayer som stackar eller köer Hashtabeller print 'Array as stack: ' stack = Array.new() stack.push('a') stack.push('b') stack.push('c') print stack.pop until stack.empty? print "\n" print 'Array as queue: ' queue = Array.new() queue.push('a').push('b').push('c') print queue.shift until queue.empty? Arrayen kan användas både som en stack och som en kö, beroe på vilka metoder man använder. >> 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"} Med hashtabeller kan man enkelt slå upp information. Hur man skapar en hash och fyller den med innehåll. Array as stack: cba Array as queue: abc >> h2={:june=>'perl', :july=>'ruby'} => {:july=>"ruby", :june=>"perl"} >> h2[:july] => "ruby" Ofta används symboler som nycklar.

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. >> ['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 Olika sätt att skriva block [1,2,3,4,5].each do e puts e [1,2,3,4,5].map { e e * e } Använd block med do när sidoeffekterna (t.ex. utskrift) är det viktiga, eller när koden upptar flera rader. Använd block med { } när returvärdet är det viktiga. >> [1, 2, 3, 4, 5].map { entry entry * entry } => [1, 4, 9, 16, 25] >> (0..100).inject(0) { result, entry result + entry } => 5050 Hur man skriver egna iteratorer Blocket kan sparas undan def f(count, &block) value = 1 1.upto(count) do i value = value * i block.call(i, value) 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 Blocket anges som sista argument och föregås av &. Blocket anropas med metoden call. class Repeater def initialize(&block) @block = block @count = 0 def repeat @count += 1 @block.call(@count) repeater = Repeater.new do count puts "You called me #{count} times" 3.times do repeater.repeat Blocket anges som argument till konstruktorn och sparas i en instansvariabel. Blocket körs genom att anropa repeat, vilket också ökar på räknaren.

Tilldelning >> 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) >> 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 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" Endast nil och false är falska, alla andra värden är sanna, inklusive konstanten true. Normal villkorssats Villkoret efter ett uttryck Snabbval Flera alternativ Upprepning 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 Klassdefinitioner def initialize @state = :empty class Board def initialize(width, height) @width = width; @height = height @cells = Array.new(height) { Array.new(width) { Cell.new } }

Åtkomst av egenskaper Array-liknande åtkomstmetoder def state @state attr_reader :state class Board def size self.width * self.height def state=(new_state) @state=new_state attr_writer :state attr_accessor :state class Board def [](col, row) @cells[col][row] 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 = 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