Meddelande av högre ordning
Ett meddelande av högre ordning ( HOM ) i ett datorprogrammeringsspråk är en form av högre ordningsprogrammering som tillåter meddelanden som har andra meddelanden som argument. Konceptet introducerades på MacHack 2003 av Marcel Weiher och presenterades i en mer komplett form 2005 av Marcel Weiher och Stéphane Ducasse. Slingor kan skrivas utan att namnge samlingarna som loopas över, meddelanden av högre ordning kan ses som en form av punktfri eller tyst programmering .
Exempel
I vanlig Smalltalk- kod, utan att använda HOM, skulle en samling av de anställda som har en lön på 1000 uppnås med följande kod:
avlönade := anställda väljer: [ : varje | varje har Lön: 1000 ]
Men med HOM kan det uttryckas på följande sätt:
avlönad := anställda väljer harLön: 1000 .
Här är select
ett meddelande av högre ordning, och hasSalary:
förstås anropas på själva select-meddelandet, snarare än på dess resultat. Smalltalk-språket modifierades inte för att implementera den här funktionen. Istället select
ett meddelande som förstärker select send, som sedan tolkar hasSalary:
-meddelandet .
Ett annat exempel är användningen av framtida meddelanden i Croquet Project :
( kubframtid : 1000 ) addRotationAroundY: 10 .
I det här exemplet orsakar meddelandet future: att meddelandet
addRotationAroundY:
skickas till kubobjektet efter 1 sekund.
Adoption
Referensimplementeringen i Objective-C utnyttjar egenskapen att i Objective-C, objekt som inte förstår ett meddelande som skickas till dem, ändå får det levererat i en speciell hook-metod, kallad forward:
. Högre ordningsmeddelanden implementerades på ett antal språk som delar denna funktion inklusive Ruby och Smalltalk.
ECMAScript Harmonys Proxies-dokumentation nämner specifikt meddelanden av högre ordning som en applikation för deras Catchall Proxies.
Liknande begrepp på andra språk
Programmeringsspråket J skiljer mellan verb och adverb . Adverb ändrar verbens funktion. Detta liknar meddelanden av högre ordning (adverben) som modifierar meddelandena som följer (verben). I krocketexemplet ovan, addRotationAroundY:
. meddelande skickas fortfarande och har sin normala betydelse, men leveransen ändras av future:1000
, det kommer att skickas någon gång i framtiden.