Innlegg er skrevet om:
Down 25.09.2007 14:12 - oppdatert 227 dager siden av Terje Pedersen Colon: Distribuert Colon

For å muliggjøre noen av de tingene jeg har lyst til å få til når når kompilator og VM for Colon er på plass så trenger jeg også muligheten for å distribuert programmering.

En enkel forklaring på distribuert programmering er når du surfer på nettet så sender du en forespørsel til en eller annen server som så returnerer den siden du spurte etter.

Når jeg så tenker på mobiltelefoner oppi det hele her så tenker jeg f.eks. på muligheter som kjapt å kode noe som bruker hva jeg normalt bare har tilgang til på serveren eller som en mulighet for enkelt og greit å lage multiplayer-spill mellom mobiltelefoner.

Utskrift av det som blir sendt til server

  1. # on server side 192.168.0.2
  2. "dcolon://:7777/echo" service
  3. server: receive
  4. "Echo @0" out
  5. server
  6. # client side 192.168.0.30
  7. "dcolon://192.168.0.2:7777/echo" open :pid
  8. "message" pid send

Sende kode for kjøring på serveren

  1. # server 192.168.0.2
  2. "dcolon://:7777/code" service
  3. server: receive
  4. {code _} = ? tail call drop
  5. server
  6. # client 192.168.0.30
  7. "dcolon://192.168.0.2:7777/code" open :pid
  8. {code {"Hello World on server!" out}} pid send

Kjøre “uptime” på serveren og returnere svaret

  1. # server 192.168.0.2
  2. "dcolon://:7777/uptime" service
  3. server: receive
  4. {uptime pid} = ? "uptime" system pid send drop
  5. server
  6. # client 192.168.0.30
  7. "dcolon://192.168.0.2:7777/uptime" open :pid
  8. {uptime @self} pid send receive "Uptime from server: @0" out
Fb permalink | kommentarer (0)
stikkord: colon
Down 25.09.2007 11:33 - oppdatert 227 dager siden av Terje Pedersen Colon: GUI

Hvordan en skal beskrive GUI-kode i Colon er jeg fortsatt litt usikker på, men ting begynner å ta en eller annen form i alle fall.

Eksempel 1:

En enkelt knapp med teksten “Say hello” på som når den trykkes på skriver ut “Hello, World!”.

  1. sayhello: receive "Hello, World!" out sayhello
  2. {"Say hello"} ¤sayhello gbutton "Say hello" gwindow gmain

Eksempel 2:

Tre knapper plassert vertikalt med tekstene “1”, “2” og “3” på som når du trykker på “1” oppdaterer teksten på “1” til “wee” og når du trykker på “2” eller “3” skriver ut at du trykket på den respektive knappen.

  1. buttonpressed: receive
  2. {one _} = ? "Button one pressed" out tail {one: "wee"} swap send
  3. {two _} = ? "Button two pressed" out
  4. {three _} = ? "Button three pressed" out
  5. buttonpressed
  6. {one: "1" two: "2" three: "3"} ¤buttonpressed gbutton gvbox "The buttons" gwindow gmain

Så noen eksempler med å hente ut verdier fra de forskjellige GUI-elementene når ting skjer. Det jeg har tenkt foreløpig er at du kan sende en get melding til pid om hva du vil ha.

  1. {get texta textb} -> {get pid {texta: "mmm" textb: "yess"}}
  2. {get celsius} -> {get pid {celsius: "30"}}
  3. {get values: @inputvalues} -> {get pid {values: {1 4 6 7 8}}}
  4. {get @inputvalues} -> {get pid {1 4 6 7 8}}

Eksempel 3

Dette eksempelet viser en øverst en tekst deretter fem tekstbokser vertikalt samt en “Average”-knapp nederst som når den blir trykket på kalkulerer snittet på de fem tallene og gir svaret i det øverste tekst-elementet.

  1. calculate: receive
  2. {calculate pid} = ? {get @inputvalues} pid send drop
  3. {get pid _} = ? tail 0 swap | + ; 5 / {display: @0} pid send drop
  4. {{display: "0"} glabel
  5. {} 1 5 to | "" + ; gtextbox !inputvalues
  6. {"Calculate average"} ¤calculate gbutton}
  7. gvbox "Average" gwindow gmain

Eksempel 4

Et lite eksempel for å omforme Farhenheit til Celsius.

  1. f2c: 32 - 5 9 / *
  2. calculate: receive
  3. {convert pid} = ? {get celsius} pid send drop
  4. {get pid _} = ? tail . celsius f2c {display: @0} pid send drop
  5. calculate
  6. {{display: "0"} glabel
  7. {celsius: ""} gtextbox
  8. {convert: "Convert"} ¤calculate gbutton}
  9. gvbox "F2C" gwindow gmain

Om det er slik det blir til slutt gjenstår å se da det ikke alltid er så lett å vite når alle detaljer om hva som går an å gjøre og hva som ikke går an før kompilator/vm fungerer.

Fb permalink | kommentarer (0)
stikkord: colon
Down 24.09.2007 15:53 - oppdatert 227 dager siden av Terje Pedersen Colon: Tegnbruk

I Colon kan ! brukes istedenfor : foran ord som da betyr at en lagrer innholdet i ordet slik som for : men at en ikke konsumerer det fra stacken.

En annen måte å se det på er at !name = dup :name Normalt liker jeg ikke for mye “syntax sugar” som gjør språk mye mer kompliserte, men akkurat dette tilfellet vil jeg ikke ha dup der når dette ordet bare skal brukes senere og ikke har noe med der det står for å si det på den måten.

  1. # gjennomsnitt
  2. 0 {1 2 3} !l | + ; l length /

Oversikt

Slik som dette ser det ut foreløpig over hvilke tegn en kan bruke foran og etter ord i Colon og hva dem betyr:
Tegn Betydning
name: definisjon av ord
nameX repeter name X antall ganger, f.eks. dup3 tail2
:name pop fra stack og lagre i name (a ->)
!name dup :name (a -> a)
¤name eller ¤{...} ny concurrent prosess, pid på stack (-> pid)
”@X @name” {@X @name} pop posisjon X fra stack @0 = først, @name kjør name pop svar fra stack, sett inn i streng / blokk
+name name + :name (+:name eller +name ?)

Burde kanskje bytte til +name fordi muligens : også kan brukes når en skal bruke moduler samt greit å holde seg til enkle regler som kun ett tegn foran eller etter ord

Sammenligning

Tegn Betydning Eksempel # på stack
> større enn 10 5 > # 10 true
< mindre enn 10 5 < # 10 false
ulik 10 5 ≠ # 10 true
= lik 10 5 = # 10 false

Aritmetikk

Tegn Betydning Eksempel # på stack
+ addisjon 10 5 + # 15
- subtraksjon 10 5 – # 5
/ divisjon 10 5 / # 2
* multiplikasjon 10 5 * # 50
% modulo 10 5 % # 0
Fb permalink | kommentarer (0)
stikkord: colon
Down 24.09.2007 08:57 - oppdatert 228 dager siden av Terje Pedersen Colon: Concurrency

For hendelser i Colon har jeg bestemt meg for å bruke concurrency, ikke ulikt ifra Erlang. GUI-eksempler kommer jeg tilbake til senere når jeg har ting mer klart.

Concurrency i Colon bruker tegnet for currency ¤_ foran et ord eller en blokk _{} for å utføre dette i en egen concurrent prosess. I tillegg brukes ordene receive og send.

  1. sayhello: "Hello World!" out
  2. ¤sayhello
  3. -> Hello World!
  4. sayreceived: receive "Received @0" out
  5. 5 ¤sayreceived send
  6. -> Received 5
  7. saymulti: receive
  8. {ok} = ? "OK" out
  9. {warning _} = ? "Warning: @0" out
  10. saymulti
  11. ¤saymulti :pid
  12. # ...
  13. {warning "battery low"} pid send
  14. -> Warning: battery low
  15. ¤{"Hello World!" out}
  16. -> Hello World!

Et større eksempel

Her er et x^y concurrency eksempel fra Erlang jeg satt og lekte meg med og det ble som følger i Colon:

  1. pow: {N M} = ?
  2. {} {@self @M} powspawn | N swap send + ;
  3. 1 swap | drop receive *
  4. powspawn:
  5. {Pid 0} = ? {} ¤{receive 1 @Pid send} +
  6. {Pid M} = ?
  7. ¤{receive @Pid send}
  8. {@Pid @M 1 -} powspawn +

Hvorvidt dette er helt riktig vet jeg sannelig ikke, er ikke alltid like enkelt når ting er i endring å samtidig la hjernen leke både kompilator og VM på engang ;-)

Erlang:

  1. pow(N, M) ->
  2. Pids = pow_spawns(self(),M),
  3. Vals = lists:map(fun(P) -> P ! N end, Pids),
  4. lists:foldl(
  5. fun(_,Total) -> receive X -> X*Total end end,
  6. 1, Vals).
  7. pow_spawn(Pid,0) ->
  8. [spawn(fun() -> receive _ -> Pid ! 1 end end)];
  9. pow_spawn(Pid,M) ->
  10. [spawn(fun() -> receive X -> Pid ! X end end)
  11. | spawn(pow_span(Pid,M-1))].
Fb permalink | kommentarer (0)
stikkord: colon
Down 22.09.2007 00:13 - oppdatert 227 dager siden av Terje Pedersen Colon: vs PHP

Tenkte jeg skulle presentere noen små eksempler på hvordan Colon kode ser ut i forhold til PHP i da typiske PHP måter å gjøre ting på.

konkatinering av strenger

Colon

  1. txtone: "Hello World"
  2. txttwo: "1234"
  3. txtone " " txttwo +2 out

PHP

  1. $txt1="Hello World";
  2. $txt2="1234";
  3. echo $txt1 . " " . $txt2;

if

Colon

  1. "Fri" "D" date = ?
  2. "Hello!" out
  3. "Have a nice weekend!" out
  4. "See you on Monday!" out

PHP

  1. $d=date("D");
  2. if ($d=="Fri")
  3. {
  4. echo "Hello!<br />";
  5. echo "Have a nice weekend!";
  6. echo "See you on Monday!";
  7. }

if/else/else

Colon

  1. "D" date
  2. "Fri" = ?
  3. "Have a nice weekend!" out
  4. "Sun" = ?
  5. "Have a nice Sunday!" out
  6. : "Have a nice day!" out

PHP

  1. $d=date("D");
  2. if ($d=="Fri")
  3. echo "Have a nice weekend!";
  4. elseif ($d=="Sun")
  5. echo "Have a nice Sunday!";
  6. else
  7. echo "Have a nice day!";

switch type konstruksjon

Colon

  1. x
  2. 1 = ? "Number 1" out
  3. 2 = ? "Number 2" out
  4. 3 = ? "Number 3" out
  5. : "No number between 1 and 3" out

PHP

  1. switch ($x)
  2. {
  3. case 1:
  4. echo "Number 1";
  5. break;
  6. case 2:
  7. echo "Number 2";
  8. break;
  9. case 3:
  10. echo "Number 3";
  11. break;
  12. default:
  13. echo "No number between 1 and 3";
  14. }

hente ut navn fra en array

Colon

  1. names: {"Peter" "Quagmire" "Joe"}
  2. names | ; "@1 and @0 are @2's neighbors" out

PHP

  1. $names[0] = "Peter";
  2. $names[1] = "Quagmire";
  3. $names[2] = "Joe";
  4. echo $names[1] . " and " . $names[2] .
  5. " are ". $names[0] . "'s neighbors";

hente ut alder fra hash type array

Colon

  1. ages: {Peter: 32 Quagmire: 30 Joe: 34}
  2. ages . "Peter is @Peter years old." out

PHP

  1. $ages['Peter'] = "32";
  2. $ages['Quagmire'] = "30";
  3. $ages['Joe'] = "34";
  4. echo "Peter is " . $ages['Peter'] . " years old.";

while løkke ikke eget ord for det i Colon, men kan alikvell gjøres

Colon

  1. i: 1
  2. loop: i 5 <= ? "The number is @0" out 1 +i loop

PHP

  1. $i=1;
  2. while($i<=5)
  3. {
  4. echo "The number is " . $i;
  5. $i++;
  6. }

do while løkke som i likhet med while løkke ikke finnes eget ord for i Colon

Colon

  1. i: 0
  2. loop: 1 +i "The number is @i" out i 5 < ? drop loop

PHP

  1. $i=0;
  2. do
  3. {
  4. $i++;
  5. echo "The number is " . $i;
  6. }
  7. while ($i<5>

for løkke ved hjelp av en to generator i Colon

Colon

  1. 1 5 to | "Hello World!<br />" out

PHP

  1. for ($i=1; $i<=5; $i++)
  2. {
  3. echo "Hello World!<br />";
  4. }

foreach løkke i Colon brukes |

Colon

  1. arr: {"one" "two" "three"}
  2. arr | "Value: @0<br />" out

PHP

  1. $arr=array("one", "two", "three");
  2. foreach ($arr as $value)
  3. {
  4. echo "Value: " . $value . "<br />";
  5. }

funksjon ord i Colon

Colon

  1. writeMyName: "@0 Pedersen.<br />" out
  2. "My name is " outnb
  3. "Terje" writeMyName

PHP

  1. function writeMyName($fname)
  2. {
  3. echo $fname . " Pedersen.<br />";
  4. }
  5. echo "My name is ";
  6. writeMyName("Terje");

addisjonsfunksjon med to parametre

Colon

  1. add: +
  2. 1 16 add "1 + 16 = @0" out

PHP

  1. function add($x,$y)
  2. {
  3. $total = $x + $y;
  4. return $total;
  5. }
  6. echo "1 + 16 = " . add(1,16)

try/catch

Colon

  1. checkNum: 1 > ? "Value must be 1 or below" throw : true
  2. ! 2 checkNum "If you see this, the number is 1 or below" out
  3. : "Message @0" out

PHP

  1. function checkNum($number)
  2. {
  3. if($number>1)
  4. {
  5. throw new Exception("Value must be 1 or below");
  6. }
  7. return true;
  8. }
  9. try
  10. {
  11. checkNum(2);
  12. echo 'If you see this, the number is 1 or below';
  13. }
  14. catch(Exception $e)
  15. {
  16. echo 'Message: ' .$e->getMessage();
  17. }

litt MySQL

Colon

  1. ! "mysql://peter:abc123@localhost/my_db" open :con
  2. : "Could not connect: @0" bye
  3. "SELECT * FROM person" con query | .
  4. "@FirstName @LastName<br />" out

PHP

  1. $con = mysql_connect("localhost","peter","abc123");
  2. if (!$con)
  3. {
  4. die('Could not connect: ' . mysql_error());
  5. }
  6. mysql_select_db("my_db", $con);
  7. $result = mysql_query("SELECT * FROM person");
  8. while($row = mysql_fetch_array($result))
  9. {
  10. echo $row['FirstName'] . " " . $row['LastName'];
  11. echo "<br />";
  12. }

array/tekst implode

Colon

  1. pieces: {"Hello" "World," "I" "am" "Here!"}
  2. gluedTogetherSpaces: pieces " " join
  3. gluedTogetherDashes: pieces "-" join
  4. pieces | "Piece #@key = @0 <br />" out
  5. "Glued with Spaces = @gluedTogetherSpaces <br />" out
  6. "Glued with Dashes = @gluedTogetherDashes <br />" out

PHP

  1. $pieces = array("Hello", "World,", "I", "am", "Here!");
  2. $gluedTogetherSpaces = implode(" ", $pieces);
  3. $gluedTogetherDashes = implode("-", $pieces);
  4. for($i = 0; $i < count($pieces); $i++){
  5. echo "Piece #$i = $pieces[$i] <br />";
  6. }
  7. echo "Glued with Spaces = $gluedTogetherSpaces <br />";
  8. echo "Glued with Dashes = $gluedTogetherDashes";

key/value

Colon

  1. employeeAges: {Lisa: 28 Jack: 16 Ryan: 35 Rachel: 46 Grace: 34}
  2. employeeAges | "Name: @key, Age: @0 <br />" out

PHP

  1. $employeeAges;
  2. $employeeAges["Lisa"] = "28";
  3. $employeeAges["Jack"] = "16";
  4. $employeeAges["Ryan"] = "35";
  5. $employeeAges["Rachel"] = "46";
  6. $employeeAges["Grace"] = "34";
  7. foreach( $employeeAges as $key => $value){
  8. echo "Name: $key, Age: $value <br />";
  9. }

multiple for løkker som utfører samme kode

Colon

  1. 0 3 to 10 13 2 tostep + |
  2. "Number: @0" out

PHP

  1. for($i = 0; $i < 4; $i++) {
  2. echo "Number: " . $i;
  3. }
  4. for($i = 10; $i < 14; $i += 2){
  5. echo "Number: " . $i;
  6. }
Fb permalink | kommentarer (0)
stikkord: colon
Down 18.09.2007 20:32 - oppdatert 233 dager siden av Terje Pedersen Colon: Funksjonelle egenskaper

I funksjonelle språk kan du f.eks. gi funksjoner som parameter til en annen funksjon, en har navnløse funksjoner og en har ofte funksjoner som map/filter/reduce eller tilsvarende.

Har prøvd meg på noen eksempler med Ruby nå. Mest for å sjekke hvordan det ser ut i Colon samt sjekke at ting er mulige å gjøre slik det er nå eller om jeg mangler noe.

Colon – funksjon som parameter

  1. each: :b | b call
  2. {1 2 3} {out} each

Ruby

  1. def each(array, block)
  2. array.each{|e| block.call(e) }
  3. end
  4. block = Proc.new{|e| puts e }
  5. each([1,2,3], block)

map/reduce/filter

Det en kan legge merke til er at det ikke finnes noen egne ord/funksjoner for map/reduce/filter eller for den saks skyld de andre nedenfor da alt løses ved hjelp av ? : ;; og | Eneste nye fra forrige Colon innlegg er ;; som betyr at den dropper å gå gjennom flere elementer mao en slutter |

Colon – map

  1. {} {1 2 3 4} | 1 +2
  2. -> {2 3 4 5}

Ruby

  1. [1,2,3,4].map{|n| n+1 }
  2. -> [2 3 4 5]

Colon – filter

  1. {} {1 2 3 4 5 6 7 8 9 10} | dup 2 % 0 = ? drop +
  2. -> {2 4 6 8 10}

Ruby

  1. [1,2,3,4,5,6,7,8,9,10].select{|n| n % 2 == 0 }
  2. -> [2,4,6,8,10]

Colon – reduce

  1. 0 {1 2 3 4 5} | +
  2. -> 15

Ruby

  1. [1,2,3,4,5].inject(0){|sum,n| sum + n }
  2. -> 15

Diverse andre

Ruby har flere slike funksjoner så her noen Colon eksempel på flere av dem.

Colon – find

  1. {1 2 3 4} | 2 > ? ;; : drop nil
  2. -> 3
  3. {1 2 3 4} | 78 = ? ;; : drop nil
  4. -> nil

Ruby

  1. [1,2,3,4].find{|n| n > 2 }
  2. -> 3
  3. [1,2,3,4].find{|n| n == 78 }
  4. -> nil

Colon – all

  1. true {1 2 3 4 5} | 10 > ? drop not ;;
  2. -> true
  3. true {1 2 3 4 5} | 4 > ? drop not ;;
  4. -> false

Ruby

  1. [1,2,3,4,5].all?{|n| n < 10 }
  2. -> true
  3. [1,2,3,4,5].all?{|n| n < 4 }
  4. -> false

Colon – include

  1. false {1 2 3 4 5} | 3 = ? drop not ;;
  2. -> true
  3. false {1 2 3 4 5} | 10 = ? drop not ;;
  4. -> false

Ruby

  1. [1,2,3,4,5].include?(3)
  2. -> true
  3. [1,2,3,4,5].include?(10)
  4. -> false

Colon – reject

  1. {} 1 10 to | dup 3 % 0 = ? : drop +
  2. -> {1 2 4 5 7 8 10}

Ruby

  1. (1..10).reject {|i| i % 3 == 0}
  2. -> [1, 2, 4, 5, 7, 8, 10]
Fb permalink | kommentarer (0)
stikkord: colon
Down 17.09.2007 13:08 - oppdatert 235 dager siden av Terje Pedersen Colon: Introduksjon

Jeg er en av disse særingene som synes det er gøy å leke seg med syntaks til eget programmeringsspråk og ikke bare måtte gjøre hva andre har funnet på og bestemt seg for.

Først holdt jeg på med et språk kalt Minky deretter ble det en ny iterasjon av Minky til jeg ble en smule fasinert av hvor lite kode en kunne klare seg med i det stack-baserte språket Raven. Så nå er det Colon det jobbes med.

Et av mine mål er å kunne skrive programvare kjappere for ARM-baserte duppeditter slik som OpenMoko-baserte Neo 1973 uten å måtte skrive en avhandling i kode, bare for noe så lite som en enkel GUI Hello World applikasjon.

Språket er kalt Colon rett og slett fordi en definerer ordene på samme måte som en gjør i et vanlig språk med kolon rett etter ordet.

  1. pi: 3.14
  2. hello: "Hello World" out

Videre brukes kolon til å hente ut et element fra stacken for så å lagre det i ordet som følger rett etter kolon.

  1. 5 10 4 :a :b :c

Bytte av innhold i to ord blir da:

  1. a b :a :b

Den tredje bruken av kolon i Colon er kolon som et ord på samme form som “Ternary” i C mao “cond ? expr1 : expr2”. Om en vil ha if/if istedenfor if/else brukes semikolon til avslutte. Ordene for å sammenligne som f.eks = > < osv. konsumerer bare det første elementet på stacken og dermed muliggjør også en switch type konstruksjon.

  1. 10 = ? "Number is equal to ten" out
  2. 10 < ? "Number is less than ten" out
  3. : "Number is greater than ten" out

Tall etter et ord er reservert som repitisjon av ordet x antall ganger og gjelder alle ord og ikke bare de som er definert som forskjellige ord som f.eks. dup2 og dup3 i andre stack-baserte språk. Omskrivningsregler av bytekode vil skrive om de vanlige slike dobble like bytekoder til egen der det er hensiktsmessig.

  1. 1 2 3 4 +3
  2. 10 dup4

Each = | og brukes for å ta ett og ett element til stacken og utføre det til høyre inntill kodeblokken er slutt eller til semikolon.

  1. {"cat" "dog" "horse"} | out
  2. 0 {1 2 3} | + ; out
  3. {} {1 2 a 3 4 b 5 6} | 3 > ? +
  4. {3 4 5} | ; # dytter tallene på stacken
  5. {{0 1} {2 3}} |2 ; :y :x "(@x,@y)" out
  6. {name: "Terje" age: 31} | key "key: @0 value: @1" out
  7. "file://test.txt" open lines | length "@0 chars in line @key" out
Fb permalink | kommentarer (0)
stikkord: colon
Meta
  • # innlegg
    Feed-icon-12x12205 stk
  • # sider
    Feed-icon-12x1222 stk
  • # lenker
    Feed-icon-12x12149 stk
  • # kommentarer
    Feed-icon-12x12133 stk
Mine eksterne senikk.com Andre blogger
Terje-logo Reklame