(toiminnot)

hwechtla-tl: Symbolien kontekstualisointi

Kierre.png

Mikä on WikiWiki?
nettipäiväkirja
koko wiki (etsi)
viime muutokset


Varoitus: tämä sivu liittyy ohjelmointiin!

Perinteisesti Lisp-kielissä on ollut atomeita. Atomi on jokin "juttu", jonka tärkein ominaisuus on olla jokin tietty eikä mikään muu: yksilö. Lispin atomit ovat perinteisesti olleet symboleita, käytännössä sanoja. Ne eivät ole merkkijonoja, merkkijonot ovat vain niiden ilmimuotoja: jokainen merkkijono on oma yksilönsä, kun taas kaksi samannäköistä symbolia ovat sama symboli. Samaan tapaan kuin on olemassa vain yksi numero 371 (johon voidaan viitata useammassa yhteydessä), on olemassa vain yksi symboli Panu, johon viitataan eri yhteyksissä, kuten tämän virkkeen päälauseessa.

Kielissä, joissa ei ole symboleita, käytetään yleensä kokonaislukuja vastaaviin tarkoituksiin. Niin 0 tarkoittaa epätotta, 1 totta, -1 tarkoittaa "a pienempi kuin b", 0 tarkoittaa "a yhtäsuuri kuin b", 1 tarkoittaa "a suurempi kuin b", 0 tarkoittaa "onnistui", 1 tarkoittaa "virhe", 2 tarkoittaa "jotain odottamatonta", ja niin edelleen. Jokaiselle merkitysjoukolle omat vakionsa. Lispissä voi käyttää symboleita false, true, less, equal, greater, success, error, exception, ja niin edelleen. Symbolit eivät lopu kesken eikä niiden merkitystä tarvitse luntata jostain headerista.

Symboleiden suurin ongelma on se, että niiden identiteetti on liian vahva: niin kuin ihmiset joskus käyttävät samaa sanaa tarkoittamaan kahta eri asiaa asiayhteydestä riippuen, käyttävät ohjelmoijat joskus samaa symbolia tarkoittamaan kahta eri asiaa asiayhteydestä riippuen. Yleensä tämä ei ole ongelma, koska asiayhteydet eivät kohtaa; mutta Lispin kaksi ehkä suurinta historiallista ongelmaa, ns. funarg-ongelma ja makrojen muuttujanappaus, johtuivat molemmat siitä, että symboli, joka vain sattui olemaan sama eri konteksteissa, tulkittiin samaksi symboliksi. Ensimmäisen ongelman ratkaisuksi tarjoutui leksikaalinen vaikutusalue, toiseen tarjottiin kaksi ratkaisua, gensym (perinteisessä Lispissä) ja hygieniset makrot (Schemessä).

gensym-ratkaisussa avoimesti tunnustettiin, että symbolit olivat vaarallisia. Ongelma hoidettiin yksinkertaisesti generoimalla omaan käyttöön symboleita, jotka taatusti eivät olisi samoja minkään kenenkään muun käyttämän symbolin kanssa, ja viittaamalla näihin generoituihin symboleihin toisilla symboleilla. Hygieniset makrot ovat kauniita, mutta piilottavat sen, mitä syntaksimuunnokset todella ovat. Sisäisesti ne saattoivat hyvinkin käyttää gensymin kaltaisia tekniikoita eli nimeäjien uudelleenkirjoitusta, mutta ohjelmoija ei voinut tästä tietää.

Vähän aikaa sitten André van Tonder julkaisi makrosysteemin, joka yksinkertaisuudestaan huolimatta ratkaisee tämän ongelman tuomalla hygieniset makrot takaisin "maan pinnalle", antamalla niiden toiminnalle kauniin sisäisen mallin. Ratkaisu on se, että syntaksipuiden symbolit korvataan "merkitsimillä", jotka ovat muuten symbolien kaltaisia, paitsi että niiden identiteettiin vaikuttaa konteksti, joka takaa, etteivät ne ole samoja toisten kontekstien samannimisten merkitsijöiden kanssa. Tämän jälkeen olen ihmetellyt, eikö vain kaikki symbolien ongelmat voisi ratkaista kontekstualisoimalla ne. Tämä tarkoittaa, että kaksi symbolia ovat sama symboli, mikäli niillä on sama konteksti ja ne näyttävät samalta. Uskon, että tämä vastaa sitä, miten ihmiset käyttävät sanoja.

Symbolien kontekstualisointiin on kuitenkin kaksi tapaa, joista en ole saanut päätetyksi, kumpi on parempi. Molemmilla on mielenkiintoisia ja kauaskantoisia vaikutuksia. Toinen on Common Lispissä omaksuttu tapa, jossa symbolit kuuluvat enintään yhteen kontekstiin (CL:ssä symboli kuuluu enintään yhteen pakettiin; esimerkiksi gensym:llä tuotetut symbolit eivät kuulu mihinkään ja siksi ovatkin taatusti erillisiä muista symboleista). Tällaisessa järjestelmässä symboli "tuodaan" nimiavaruudesta toiseen asettamalla kohdenimiavaruudessa olevan symbolin arvo (Lisp-symboleita voi käyttää muuttujina tallettamalla niihin arvon) samaksi kuin lähdeavaruudessa olevan symbolin arvo.

Toinen ratkaisu, jota tulin jokin aika sitten ajatelleeksi, on sallia symbolin kuulua useampaan kontekstiin. Tällöin symboli "tuodaan" nimiavaruudesta toiseen merkitsemällä molemmissa nimiavaruuksissa tietynnimiseksi symboliksi sama symboli. Myöhemmät muutokset symbolin arvoon vaikuttavat molemmissa nimiavaruuksissa, koska ne jakavat kyseisen symbolin. Uskon, että tämä jälkemmäinen tapa tarkemmin vastaa sitä, miten ihmiset käyttävät sanoja.

Lisäksi on mahdollisuus toteuttaa nimiavaruuksia ilman kontekstualisoituja symboleja: tietyn näköisiä symboleja on tasan yksi, mutta jokainen nimiavaruus liittää siihen eri arvon. Tällä voi ratkaista nimien törmäykset, muttei symbolien itsensä törmäyksiä.

Uskon, että kontekstualisoidut symbolit ovat käyttökelpoisempia kuin kontekstittomat. Tällöin esimerkiksi tietämyskannan yksilöitä voi merkitä kuvaavilla symboleilla, esim. Miiri sen sijaan, että olisi kissa-2397. Kontekstittomien symbolien suuri etu on se, että niistä näkee aina, mikä symboli on kyseessä.

kategoria: ohjelmointi


kommentoi (viimeksi muutettu 29.03.2017 12:31)