Magik (programmeringssprog) - Magik (programming language)
Magik er et objektorienteret programmeringssprog , der understøtter flere arv og polymorfisme , og det er dynamisk skrevet . Det blev designet og implementeret i 1989 af Arthur Chance fra Smallworld Systems Ltd. som en del af Smallworld Geographical Information System (GIS). Efter Smallworlds overtagelse i 2000 leveres Magik nu af GE Energy , stadig som en del af sin Smallworld-teknologiplatform.
Magik (Inspirational Magik) blev oprindeligt introduceret i 1990 og er blevet forbedret og opdateret gennem årene. Dens nuværende version er 5.2.
I juli 2012 meddelte Magik-udviklere, at de var i gang med at overføre Magik-sprog på den virtuelle Java-maskine . Den vellykkede portering blev bekræftet af Oracle Corporation i november samme år.
Ligheder med Smalltalk
Magik selv deler nogle ligheder med Smalltalk med hensyn til dets sprogfunktioner og dets arkitektur: Magik-sproget er sammensat til bytekoder fortolket af Magik virtuelle maskine . Den virtuelle Magik-maskine er tilgængelig på flere platforme, herunder Microsoft Windows , forskellige varianter af Unix og Linux .
Magik er konsolbaseret, og kode kan ændres med det samme, selv når et program kører. Konsollen kan også bruges til at udføre Magik-kode og se resultaterne.
Kompileret kode gemmes i en enkelt fil kaldet en billedfil. Hver billedfil indeholder de kompilerede byte-koder og sessionens tilstand (for eksempel variable værdier), da billedet sidst blev gemt.
Sprogfunktioner
Kommentarer
Magik bruger # tokenet til at markere sektioner af kode som kommentarer:
# This is a comment.
Opgaver
Magik bruger << operatøren til at foretage opgaver :
a << 1.234 b << b + a c << "foo" + "bar" # Concat strings
For klarhedens skyld læses denne notation som "a bliver 1.234" eller "b bliver b plus a". Denne terminologi adskiller opgave fra sammenligning .
Magik understøtter også en komprimeret variation af denne operatør, der fungerer på samme måde som dem, der findes i C :
b +<< a # Equivalent to b << b + a
For at udskrive en variabel kan du bruge følgende kommando
a << "hello" write(a)
Symboler
Ud over konventionelle datatyper som heltal, flyder og strenge implementerer Magik også symboler. Symboler er en speciel token-datatype, der bruges udbredt i hele Magik til entydigt at identificere objekter. De er repræsenteret af et kolon efterfulgt af en række tegn. Symboler kan undslippes ved hjælp af den lodrette bjælke . For eksempel:
a << :hello # whenever :hello is encountered, it is the same instance b << :|hello world|
Dynamisk typning
Magik-variabler er ikke skrevet som de er i siger C # og kan henvise til forskellige objekter under kørsel. Alt i Magik er et objekt (der skelnes ikke mellem objekter og primitive typer som heltal):
a << 1.2 # a floating point number is assigned to variable 'a' a << "1.2" # later, a string is assigned to variable 'a'
- Objekter
Objekter implementeres i Magik ved hjælp af eksempler. Eksempler har ligheder med klasser i andre programmeringssprog som Java , men med vigtige forskelle. Magik understøtter flere arv og mixins (som implementerer funktionalitet uden data). Nye forekomster oprettes ved at klone en eksisterende forekomst (som typisk vil være eksemplet, men ikke behøver at være det).
Nye eksempler oprettes ved hjælp af udsagnet def_slotted_exemplar() , for eksempel:
def_slotted_exemplar(:my_object,
{
{:slot_a, 34},
{:slot_b, "hello"}
}, {:parent_object_a, :parent_object_b})
Dette kodefragment vil definere et nyt eksemplar kaldet, my_object der har to slots (eller felter) kaldet slot_a (pre-initialiseret til 34) og slot_b (pre-initialiseret til "hej"), der arver fra to eksisterende eksemplarer kaldet parent_object_a og parent_object_b .
Sammenligning
Magik implementerer alle sædvanlige logiske operatorer ( = , < , <= , > , >= , ~=/<> ) til sammenligning, samt et par usædvanlige dem. Den _is og _isnt operatorer bruges til at sammenligne konkrete tilfælde af genstande eller objektreferencer snarere end værdier.
For eksempel:
a << "hello" b << "hello" a = b # returns True (_true) because the values of a and b are equal a _is b # returns False (_false) because a is not the same instance as b a << "hello" b << a a = b # returns True (_true) because the values of a and b are equal a _is b # returns True (_true) because b was assigned the specific instance of the same object as a, rather than the value of a.
Metoder
Metoder defineres på eksempler ved hjælp af udsagnene _method og _endmethod :
_method my_object.my_method(a, b)
_return a + b
_endmethod
Det er konvention at levere to metoder new() (at oprette en ny forekomst) og init() (at initialisere en forekomst).
# New method
_method person.new(name, age)
_return _clone.init(name, age)
_endmethod
# Initialise method.
_private _method person.init(name, age)
# Call the parent implementation.
_super.init(name, age)
# Initialise the slots.
.name << name
.age << age
_return _self
_endmethod
Det _clone skaber en fysisk kopi af person objektet. Det _super udsagn giver objekter til at påberåbe sig en implementering af en metode på forælder exemplar. Objekter kan henvise til sig selv ved hjælp af _self udsagnet. Et objekts slots åbnes og tildeles ved hjælp af en priknotation.
Metoder, der ikke er en del af objektets offentlige grænseflade, kan markeres som private ved hjælp af _private udsagnet. Private metoder kan kun kaldes af _self , _super og _clone .
Valgfrie argumenter kan erklæres ved hjælp af _optional udsagnet. Valgfrie argumenter, der ikke sendes, tildeles af Magik til det specielle objekt _unset (svarende til null). Det _gather udsagn kan bruges til at erklære en liste over valgfrie argumenter.
_method my_object.my_method(_gather values) _endmethod
Iteration
I Magik den _while , _for , _over , _loop og _endloop udsagn tillader iteration.
_block _local s << 0 _local i << 0 _while i <= 100 _loop s +<< i i +<< 1 _endloop >> s _endblock
Her kombineres _with med _loop og _endloop.
_method my_object.my_method(_gather values)
total << 0.0
_for a _over values.elements()
_loop
total +<< a
_endloop
_return total
_endmethod
m << my_object.new()
x << m.my_method(1.0, 2, 3.0, 4) # x = 10.0
Her er værdier.elementer () en iterator, der hjælper med at gentage værdierne.
I Magik kaldes generatormetoder iteratormetoder. Nye iteratormetoder kan defineres ved hjælp af _iter og _loopbody udsagnene:
_iter _method my_object.even_elements()
_for a _over _self.elements()
_loop
_if a.even? _is _true
_then
_loopbody(a)
_endif
_endloop
_endmethod
Procedurer
Magik understøtter også funktioner kaldet procedurer. Procedurer er også objekter og erklæres ved hjælp af _proc og _endproc udsagnene. Procedurer tildeles variabler, som derefter kan påberåbes:
my_procedure << _proc @my_procedure(a, b, c)
_return a + b + c
_endproc
x << my_procedure(1, 2, 3) # x = 6
Almindelig udtryk
Magik understøtter // syntaks for regulært udtryk:
_if /Hello\,\s(\w)+!/.matches?("Hello, Magik!") _then
write("Got a match!")
_endif
og at fange grupper i Regex:
/sw([0-9]+)-([0-9]+).*/.replace_all("sw65456-324sss", "$1") # "65456"
/sw([0-9]+)-([0-9]+).*/.replace_all("sw65456-324sss", "$2") # "324"
HTTP-bibliotek
Magik understøtter at lave HTTP- eller HTTPS-anmodninger via http-bibliotek, se nedenstående eksempler:
magikhttp << http.new()
magikhttp.url("https://www.google.com").get()
magikhttp.url("https://www.google.com").post({"User-agent", "Bot"}, "some data")
Sprog Quirks
Fordi Magik oprindeligt blev udviklet i England, staves metoder i de vigtigste smallworld-biblioteker ved hjælp af britisk engelsk . For eksempel:
Use "initialise", not "initialize".
Samlinger
Ligesom andet programmeringssprog har Magik også samlinger. De inkluderer følgende:
- Enkel vektor
- Reb
- Hash-bord
- Ejendomsliste
- Ligestillingssæt
- Tasker
Hej verdenseksempel
Følgende er et eksempel på Hello world-programmet skrevet i Magik:
write("Hello World!")
Referencer
eksterne links
- Smallworld Product Suite Technology
- MDT - Magik Development Tools IDE til GE Smallworld GIS-udviklere
- Open Source (SourceForge)
- Sprogforumindlæg på Magik
- Teknisk papir nr. 5 - En oversigt over Smallworld Magik
- GE Smallworld, Emacs Extensions til Magik-udviklere
- Visual Studio Code udvidelse til Smallworld Magik programmeringssprog.