Ruby Rocks

Här pratar vi programmering i dessa olika former. Perl, C/C++, Pascal, ADA, Lisp, COBOL, ZX Basic och mm.
Post Reply
erik_persson
Posts: 1474
Joined: 29 August 2002, 15:19

Ruby Rocks

Post by erik_persson » 9 April 2007, 02:28

Jag har läst lite och kodat ännu mindre ruby, men det är likväl riktigt riktigt intressant. I ruby finns konstruktioner som jag inte har sett någon annanstans.

Vad tycks tex om:

Code: Select all

class Object
  attr_accessor :timestamp
end

class Class
  alias_method :old_new, :new
  def new(*args)
    result = old_new(*args)
    result.timestamp = Time.now
    result
  end
end

a = String.new("En liten straeng")

# Moooohhhaaa
puts a.timestamp

Som ger output

Code: Select all


MobileIntel:~/ruby ep$ ruby timestamp.rb
Mon Apr 09 02:06:40 CEST 2007

Så enormt mäktigt!!!! Man kan alltså ändra hela klasstrukturen och lägga till metoder i samtliga klasser. Finns det något liknande i andra oo språk?

En hel del liknande andra saker kan också göras.

Jag rekommenderar boken:
"Thomas, Fowler, Hunt, Programming Ruby The pragmatic programmers' guide".
Den är inte i alla delar perfekt, men likväl riktigt intressant läsning.

/ep

kratz
Posts: 1121
Joined: 9 May 2005, 17:21
Location: ~/Högsby
Contact:

Post by kratz » 9 April 2007, 17:40

Jag har suttit med det inatt och hela dagen idag, och jag kan inte säga annat än att jag är väldigt imponerad av enkelheten i det här språket. Jag har många gånger försökt mig på att lära mig olika programmspråk, men gett upp. Det här är garanterat det mest tillfredsställande jag testat! Jag tror, att om man lär sig det bra så kan man göra mycket vättiga saker i detta språket!

Tack för tipset! //Dr. K
Välkommen till http://archlinux.se !

User avatar
drbrno
Posts: 2834
Joined: 6 October 2002, 05:01
Location: Lund
Contact:

Post by drbrno » 9 April 2007, 18:47

Jag är ju i exil, men jag kunde inte låta bli att svara...

Ruby är väldigt mycket inspirerat av Lisp. I objektsystemet i Common Lisp (CLOS) kan man definiera metoder som specialiserar på godtyckligt antal klasser. Metoderna lever inte inuti klasser, som många andra objektsystem vill ge sken av, utan är generiska. Man kan dessutom skapa kombinationer av metoder i olika konfigurationer; standard är före-, efter- och runtom-metoder men man kan komponera egna metodkombinationer om man behöver. Kul!

kratz
Posts: 1121
Joined: 9 May 2005, 17:21
Location: ~/Högsby
Contact:

Post by kratz » 9 April 2007, 18:50

Jättekul att sitta och leka, men okunnig som jag är stöter jag på massvis med problem.
Här är ett tex.
ifsatsen som väljer om man skall starta programmet lade jag dit senast, men den som säger ifrån om maxvärdet är lägre än basen, gjorde jag innan, och den fungerade perfekt.
Men när jag lade dit j/n frågan (som egentligen bara är en nej fråga) så slutade den andra ifsatsen att fungera.
Någon som kan se direkt vad det är?

Jag får be om ursäkt om detta är en jättedum fråga, men jag är helt ny på programmering .

EDIT: har märkt att det bara fungerar med vissa siffror! med eller utan ja/nej satsen.
Det funkar med tex maxvärde 8 och bas 10 men inte med maxvärde 10 bas 100 och massa annat.

Löst!
if varde < bas
ändrade jag till
if varde.to_i < bas.to_i

Ursäkta att jag tog upp tråden!

Code: Select all

puts "Vill du starta programmet? (j/n)"
fraga = gets.chomp
if fraga.to_s == "n"
        puts "Varför har du startat programmet då? Jävla nöt."
else
        puts "Vilket maxvärde vill du ha?"
        varde = gets.chomp
        puts "Vilken bas?"
        bas = gets.chomp

        if varde < bas     
                puts "Maxvärdet måsste vara större än basen!"
        else
                number = 1
                while number < varde.to_i
                number *= bas.to_i
        end
        number /= bas.to_i

        puts number.to_s + " är den högsta multipeln av " \
                + bas.to_s + " mindre än " + varde.to_s
        end
end
Välkommen till http://archlinux.se !

erik_persson
Posts: 1474
Joined: 29 August 2002, 15:19

Post by erik_persson » 9 April 2007, 23:18

drbrno wrote:Jag är ju i exil, men jag kunde inte låta bli att svara...
Kan du inte repatrieras på något sätt?
Ruby är väldigt mycket inspirerat av Lisp. I objektsystemet i Common Lisp (CLOS) kan man definiera metoder som specialiserar på godtyckligt antal klasser. Metoderna lever inte inuti klasser, som många andra objektsystem vill ge sken av, utan är generiska. Man kan dessutom skapa kombinationer av metoder i olika konfigurationer; standard är före-, efter- och runtom-metoder men man kan komponera egna metodkombinationer om man behöver. Kul!
Det där verkar kul - då får man väl ta och läsa in sig lite på Lisp också!

/ep

User avatar
kjell-e
Posts: 2817
Joined: 21 December 2002, 16:27
Location: Linköping
Contact:

Post by kjell-e » 10 April 2007, 00:56

Ett annat språk som har lånat mycket från lisp och en del från prolog är språket Erlang.

Det är faktiskt ett riktigt trevligt funktionellt språk som har lättviktsprocesser. Det är busenkelt att starta nya trådar och de är helt oberoende av varandra. Trådarna delar inga data, de kan inte dela på data. Däremot är det enkelt att skicka meddelanden mellan trådar och på så sätt överföra data. Alla nya trådar får ett sorts PID-nummer och detta nummer används för att kommunicera med en tråd.

Så här kan en fakultetsfunktion se ut:

Code: Select all

-module(test).
-export([fac/1]).

fac(1) -> 1;
fac(N) -> N * fac(N-1).
I följande exempel på en case i en funktion kan vi även se en annan av Erlangs styrkor nämligen matchningar som är lånade från Prolog.

Code: Select all

% many, ett exempel med en case-sats
many(X) ->
    case X of
         [] ->
            none;
         [ _One ] ->
            one;
         [ _One, _Two ] ->
            two;
         [ _One, _Two | _Tail ] ->
            many
    end.

Ett litet enkelt exempel med trådar. Spawn startar en ny tråd och PID-nummer följt av ! meddelande skickar meddelandet till aktuell tråd.:

Code: Select all

-module(transrec1).
-export([main/0,rThread/0,rProcess/0,sThread/1]).

main() ->
   RPid = spawn(transrec1, rThread, []),
   io:fwrite("Spawned process ~w~n",[RPid]),
   SPid = spawn(transrec1, sThread, [RPid]),
   io:fwrite("Spawned process ~w~n", [SPid]).



rThread() ->
     io:fwrite("This is a new thread, ~n",[]),
     rProcess().

rProcess() ->
     receive
     hello ->
        io:fwrite("Received hello~n",[]),
        rProcess()
%     after 200 ->
%        io:fwrite("Timeout~n",[]),
%        rProcess()
     end.
     


sThread(Pid) ->
     io:fwrite("This is a new thread, ~n",[]),
     sProcess(1,Pid).

sProcess(10000000,Pid) ->
     Pid ! hello,
     sProcess(1,Pid);
sProcess(N,Pid) ->
     sProcess(N+1,Pid).

 
Last edited by kjell-e on 21 July 2007, 19:53, edited 1 time in total.

mikma
Posts: 3349
Joined: 10 July 2003, 21:19

Post by mikma » 10 April 2007, 10:28

För de som vill prova på Erlang kan jag rekommendera CEAN, som är ett enkelt sätt att installera Erlang och finns för ett flertal olika plattformar och arkitekturer:

http://cean.process-one.net/

Förutom själva Erlang/OTP innehåller CEAN jungerl och många andra paket, bl.a. Jabber/XMPP-servern ejabberd, webservern yaws och SIP-servern yxa.

oabocw
Posts: 437
Joined: 19 August 2007, 12:21
Location: Sverige.

Post by oabocw » 19 August 2007, 14:07

Ingen disrespekt men rubys objektsystem är betydligt mer influerat av SmallTalk (än det enda språk där precis allt är objekt) än av CLOS. Andra delar av Ruby är dock väl inspirerade av CL rent allmänt. Mycket av "det vackra" med Ruby försvinner när man stöter på de delar där språket blir osammanhängade, I might add.

Och att Erlang skulle ha inspirerat mycket av CL låter inte helt rätt. En del av Haskell säkerligen, den funktionella delen då alltså. Det närmsta Erlang kommer prolog är en likartad syntax, annars har det inget alls gemensamt med just prolog. Kuriosa är att tidiga erlang blev implementerat i just prolog!


Summan av det hela: Kolla in boken Practical Common Lisp, och språket SmallTalk (www.squeak.org är att rekommendera). Erlang och/eller Haskell är även trevliga att kolla på för att få lite grepp om funktionell programmering.

Zenox
Posts: 1618
Joined: 3 May 2003, 18:32

Post by Zenox » 19 August 2007, 17:58

Nyfiken. Verkar som ett rätt kul språk, men lite oövertygad när det kommer till vanlig användning av det än. Hur är Ruby på:

Vad har man för möjligheter att interagera med andra språk från Ruby?

Finns några schyssta hjälpklasser, opensource projekt osv som man kan utnyttja om man vill skriva nått större projekt? Så man slipper skriva *allt* själv, trots att språket är snabbt tar det ju liite tid isåfall.

Vad är det för IDE som gäller för Ruby (med refactoring, remote-debug osv)?

oabocw
Posts: 437
Joined: 19 August 2007, 12:21
Location: Sverige.

Post by oabocw » 19 August 2007, 18:15

T.ex. C/C++ integrerar väl med Ruby. (#include "ruby.h" förenklar livet).

Ruby standarb library och alla dess grundfunktioner hittar du på http://stdlib.rubyonrails.org/ . Där är mycket redan där!
Självklart så finns det bindings till *sql, gtk, qt, etc. etc. att hitta.

IDEs finns det en uppsjö att välja mellan. Fråga google. :D

Tips är även att kolla in Ruby on Rails.

Zenox
Posts: 1618
Joined: 3 May 2003, 18:32

Post by Zenox » 20 August 2007, 11:37

oabocw wrote:T.ex. C/C++ integrerar väl med Ruby. (#include "ruby.h" förenklar livet).

Ruby standarb library och alla dess grundfunktioner hittar du på http://stdlib.rubyonrails.org/ . Där är mycket redan där!
Självklart så finns det bindings till *sql, gtk, qt, etc. etc. att hitta.

IDEs finns det en uppsjö att välja mellan. Fråga google. :D

Tips är även att kolla in Ruby on Rails.
Ah schysst det! Ska kika in :)

User avatar
md2perpe
Posts: 932
Joined: 12 July 2002, 18:27
Location: Hallonbergen, Kungsbodarna

Re: Ruby Rocks

Post by md2perpe » 20 August 2007, 23:36

erik_persson wrote:Så enormt mäktigt!!!! Man kan alltså ändra hela klasstrukturen och lägga till metoder i samtliga klasser. Finns det något liknande i andra oo språk?
I JavaScript kan man också göra en hel del sådant.
RTFM: förkortning som är bra att ta till om man vill låtsas tycka att frågan är trivial, fast man egentligen inte själv har ett svar.

erik_persson
Posts: 1474
Joined: 29 August 2002, 15:19

Re: Ruby Rocks

Post by erik_persson » 21 August 2007, 03:49

md2perpe wrote:
erik_persson wrote:Så enormt mäktigt!!!! Man kan alltså ändra hela klasstrukturen och lägga till metoder i samtliga klasser. Finns det något liknande i andra oo språk?
I JavaScript kan man också göra en hel del sådant.
Jo, och det går säkert i andra språk också. När jag läste om det blev jag dock helt överväldigad.

Jag har som hastigast försökt få till något liknande i javascript, men jag får det inte att fungera.

En första test för att lägga till en egenskap till alla objekt:

Code: Select all

Object.prototype.tiden = new Date();
genererade mycket riktigt ett "tiden"-attribut, men dess värde blir anska väntat samma för alla objekt, dvs den tid då raden ovan kördes.

Code: Select all

function st() {
  this.tiden = new Date();
}
String.prototype = new st;
Får jag inte alls att fungera.
Strängarna får inte någon egenskap "tiden".
Jag gör säkert något trivialt fel, men jag ser det inte just nu.
Förstör jag något i prototypkedjan?

Jmf med:

Code: Select all

function E () {
this.namn = "E";
this.namn2 = "Det aer E";
}

function M () {
this.namn3 = "M";
this.namn2 = "Det aer M";
this.tid = new Date();
}
M.prototype = new E;

man = new M();
document.writeln(man.namn + " " + man.namn2 + " " + man.namn3 + " " + man.tid);

a = 0;
while(a < 5000000) a++;

document.writeln("<br/>");

man2 = new M();
document.writeln(man2.namn + " " + man2.namn2 + " " + man2.namn3 + " " + man2.tid);
Där fungerar det fint med tidsstämpeln, men objekten skapas utifrån M, vilket inte är jämförbart.
Låter man istället this.tid = new Date() ligga i E så får förvisso man-objekten en datumstämpel, som DOCK får samma värde i de båda objekten!

Det verkar sålunda inte sannolikt att man på detta sätt skulle kunna ge alla objekt i javascript tex en tidsstämpel för när objekten skapades, även om jag skulle få sträng-exemplet ovan att fungera.
Ärvningsprinciperna fungerar helt enkelt inte på detta sätt. Snarare är det så att när man anger prototypen så körs koden i denna 1 gång (vilket man kan se om man tex stoppar in lite document.write här och var) i prototypfunktionen/objektet och sedan ärvs detta av M och alla objekt som bygger på M som tex man och man2.

Dvs med

Code: Select all

function E () {
this.namn = "E";
this.namn2 = "Det aer E";
this.tid = new Date();
document.writeln("Prototyp koers");
}

function M () {
this.namn3 = "M";
this.namn2 = "Det aer M";
}
document.writeln("Innan prototyp");
M.prototype = new E;
document.writeln("Efter prototyp");

man = new M();
document.writeln(man.namn + " " + man.namn2 + " " + man.namn3 + " " + man.tid);

a = 0;
while(a < 5000000) a++;
document.writeln("<br/>");

man2 = new M();
document.writeln(man2.namn + " " + man2.namn2 + " " + man2.namn3 + " " + man2.tid);
Så få utskriften:

Code: Select all

Innan prototyp Prototyp koers Efter prototyp E Det aer M M Tue Aug 21 2007 03:40:56 GMT+0200
E Det aer M M Tue Aug 21 2007 03:40:56 GMT+0200
Observera också att tiderna är desamma i detta exempel där this.tid = new Date(); ligger i E!

Hur ska man göra för att få till det?

/erik

Zenox
Posts: 1618
Joined: 3 May 2003, 18:32

Post by Zenox » 23 August 2007, 17:11

Snubblade över en blog angående Ruby vs D (ännu ett nytt språk). Kanske kan vara intressant att kolla in.
http://codeblog.palos.ro/2007/08/10/d-vs-ruby

Post Reply