Microsoft Power Fx översikt

Power Fx är det lågkodsspråk som Microsoft Power Platform använder. Det är ett allmänt, starkt skrivet, deklarativt och funktionellt programmeringsspråk.

Power Fx uttrycks i användarvänlig text. Det är ett lågkodsspråk som beslutsfattare kan arbeta med direkt i ett Excel-liknande formelfält eller Visual Studio Code-textfönster. "Låg" i låg kod kommer från språkets koncisa och enkla karaktär, vilket gör vanliga programmeringsuppgifter enkla för både tillverkare och utvecklare. Det möjliggör hela spektrumet av utveckling från ingen kod för dem som aldrig programmerade tidigare till "pro-code" för den erfarna proffsen, utan att lära sig eller skriva om klippor däremellan. Olika team kan samarbeta och spara tid och kostnader.

Kommentar

  • Microsoft Power Fx är det nya namnet på formelspråket för program i Power Apps. Den här översikten och tillhörande artiklar är ett pågående arbete eftersom Microsoft extraherar språket från arbetsyteappar, integrerar det med andra Microsoft Power Platform produkter och gör det tillgängligt som open-source. För att lära dig mer om och uppleva språket idag, börja med Komma igång med formler i arbetsyteappen i Power Apps dokumentation och registrera dig för en gratis Power Apps utvärderingsversion.
  • I den här artikeln refererar skapare till användare som kan använda en funktion i endera änden av programmeringsfärdighetsspektrumet. Utvecklare refererar till användare när funktionen är mer avancerad och sannolikt ligger utanför omfånget för en typisk Excel användare.

Power Fx binder samman objekt med deklarativa kalkylblads liknande formeln. Tänk till exempel på egenskapen Synlig för en UI-kontroll som en cell i ett Excel-kalkylblad, med en associerad formel som beräknar värdet utifrån egenskaperna för andra kontroller. Formellogiken beräknas om automatiskt, på samma sätt som i ett kalkylblad, vilket påverkar kontrollens synlighet.

Erbjuder även Power Fx nödvändig logik när det behövs. I kalkylblad finns vanligtvis inte knappar som kan skicka ändringar till en databas, men det gör ofta program. Samma uttrycksspråk används för både deklarativ och nödvändig logik.

Microsoft kommer att göra Power Fx tillgängligt som programvara med öppen källkod. Den är för närvarande integrerad i appar för arbetsytor och Microsoft håller på att extrahera den från Power Apps för användning i andra Microsoft Power Platform produkter och som open-source. Mer information: Microsoft Power Fx på GitHub

Den här artikeln innehåller en översikt över språket och dess designprinciper. Mer information finns i Power Fx, se följande artiklar:

Tänk kalkylblad

Tänk om du kunde bygga ett program så enkelt som du bygger ett kalkylblad i Excel?

Och om du skulle kunna dra nytta av den befintliga kalkylbladskunskapen?

Dessa frågor inspirerade skapandet av Power Apps och Power Fx. Hundratals miljoner människor skapar kalkylblad med Excel varje dag. Nu ska vi skapa appar som är enkla och som använder Excel begrepp som de redan känner till. Genom att bryta ut Power Fx från Power Apps kommer vi att få svar på de här frågorna om hur du skapar automatisering, en virtuell handläggare eller andra domäner.

Alla programmeringsspråk, inklusive Power Fx, har uttrycket ett sätt att göra beräkningar över tal, strängar eller andra datatyper. Till exempel uttrycker mass * acceleration på de flesta språk multiplikation av mass och acceleration. Du kan placera resultatet av ett uttryck i en variabel, använda det som ett argument i en procedur eller kapsla det i ett större uttryck.

Power Fx tar detta ett steg längre. Ett uttryck i sig själv säger inget om vad det beräknas på. Det är upp till tillverkaren att placera den i en variabel eller skicka den vidare till en funktion. I Power Fx, i stället för att bara skriva ett uttryck som inte har någon specifik betydelse, skriver du en formel som binds uttryck till en identifierare. Du skriver force = mass * acceleration som en formel för beräkning av force. När mass eller acceleration ändras force uppdateras automatiskt till ett nytt värde. Det uttryck som beskrivs en beräkning, en formel som beräkna ett namn och använde det som ett recept. Det är därför vi kallar Power Fx ett formelspråk.

Till exempel den här formeln från Stack Overflow söker efter en sträng i omvänd ordning. I Excel ser det ut som följande bild.

Omvänd sökning

Bild på ett formelfält i Excel med formeln: =RIGHT(A1,LEN(A1)- FIND("|", SUBSTITUTE(A1," ","|", LEN(A1)-LEN(SUBSTITUTE(A1," ","")))) Cell A1 innehåller texten "Hej världen! Det är jättekul att träffa dig!" Cell A2 innehåller texten "du".

Power Fx fungerar med samma formel och cellreferenserna ersätts med kontrollegenskapsreferenser:

Power Fx omvänd sökning.

Bild på ett Power Fx formelfält i Power Apps. Formeln är =RIGHT(Input.Text,Len(Input.Text)- FIND("|", SUBSTITUTE(Input.Text," ","|", Len(Input.Text)-Len(Substitute(Input.Text," ","")))) I indatarutan under formeln texten "Hej världen! Det är jättekul att träffa dig!" visas, bokstav för bokstav. Samtidigt visas bokstäverna i sista ordet i rutan Etikett. När den fullständiga texten visas i indatarutan står det "du" visas i rutan Etikett.

Input När kontrollvärdet ändras Label beräknar kontrollen automatiskt om formeln och visar det nya värdet. Det finns inga OnChange händelsehanterare här på samma sätt som på andra språk.

Ett annat exempel använder en formel för Fill skärmens färg. När skjutreglagen som styr Röd, Grön och Blå ändras ändras bakgrundsfärgen automatiskt när den beräknas om.

Reglage för färg.

Det finns inga OnChange händelser för reglagekontrollerna på samma sätt som för andra språk. Det finns inget sätt att uttryckligen ange Fill egenskapsvärdet alls. Om färgen inte fungerar som förväntat måste du titta på den här formeln för att förstå varför den inte fungerar. Du behöver inte söka i programmet för att hitta ett kodstycke som anger egenskapen vid en oväntad tidpunkt. det finns inget tidselement. De korrekta formelvärdena bevaras alltid.

Eftersom reglagen har färg ändras etiketterna för Röd, Grön och Blå till Vitt. Den här ändringen sker via en enkel formel på Color egenskapen för varje etikettkontroll.

Power Fx färgreglagen.

Det som är bra med den här formeln är att den är isolerad från det som händer för Fill färgen: det här är två helt olika beräkningar. I stället för stora enkla procedurer Power Fx består logik vanligtvis av många mindre formeln som är oberoende. Den här strukturen gör dem lättare att förstå och möjliggör förbättringar utan att störa befintlig logik.

Power Fx är ett deklarativt språk, precis som Excel är. Skaparen definierar vilket beteende de vill ha, men det är upp till systemet att avgöra och optimera hur och när de ska utföra det. För att göra detta praktiskt utförs det mesta av funktioner utan bi effekter, Power Fx vilket gör det till ett funktionellt språk (igen, precis som Excel är).

Publiceras alltid direkt

En viktig aspekt av kalkylblad är att de alltid är i gång och att ändringar återspeglas direkt. Det finns inget kompilerings- eller körningsläge i ett kalkylblad. När du ändrar en formel eller anger ett värde beräknas kalkylbladet omedelbart om för att återspegla ändringarna. Eventuella identifierade fel visas omedelbart och stör inte resten av kalkylbladet.

Power Fx implementerar samma sak. Den använder en inkrementell kompilator för att kontinuerligt hålla programmet synkroniserat med de data som det körs på. Ändringar sprids automatiskt via programmets graf, vilket påverkar resultatet av beroende beräkningar. Dessa beräkningar kan driva egenskaper för kontroller som färg eller position. Den begränsande kompilatorn ger också en omfattande redigeringsupplevelse med IntelliSense, förslag, automatisk komplettering och typkontroll.

I följande animering visas ordernumret i en etikettkontroll som är beroende av skjutreglagekontrollen, även om det finns två fel på etiketterna under den. programmet är i stort sett interaktiv. Det första försök att åtgärda formeln genom att ange .InvalidName resulterar i en omedelbar röd linje och ett fel som visas, som det ska, men appen fortsätter att köras.

Publiceras alltid direkt.

När du anger .Employeelägger fönstret Data till tabellen Anställda, hämtar metadata för den här tabellen och erbjuder omedelbart förslag på kolumner. Du gick bara över en relation från en tabell till en annan och systemet gjorde de nödvändiga justeringarna av appens referenser. Samma sak händer när du lägger till en .Customer.

Efter varje ändring fortsätter reglaget med sitt sista värde och alla variabler behåller sina värden. Ordernumret fortsätter att visas i den översta etiketten som det ska. Appen är live och bearbetar verkliga data hela tiden. Du kan spara den, gå iväg och andra kan öppna och använda den precis som Excel. Det finns inget byggsteg, ingen kompilering, det finns bara ett publiceringssteg för att avgöra vilken version av appen som är redo för användarna.

Lite kod

Power Fx beskriver affärslogiken med försynta, men ändå kraftfulla, formeln. De flesta logiken reduceras till en enda rad, med mycket uttrycksfullhet och kontroll för mer komplexa behov. Målet är att hålla antalet koncept som en tillverkare behöver förstå så lite som möjligt, vilket inte mer än en Excel-användare redan skulle veta.

För att till exempel slå upp förnamnet på en anställd för en beställning, skriver du Power Fx som du ser i följande artikel. Utöver Excel-koncept är det enda tillagda konceptet som används här punkten "." notering för borrning i en datastruktur, i detta fall .Employee.'First Name'. I artikeln visas mappningen mellan delarna i Power Fx formeln och begreppen som måste explicit kodas i motsvarande JavaScript.

JavaScript med lite kod.

Låt oss titta mer ingående på alla saker som Power Fx gör för oss och den frihet det har att optimera eftersom formeln är deklarativ:

  • Asynkron: Alla dataåtgärder i Power Fx är asynkrona. Tillverkaren behöver inte ange detta och tillverkaren behöver inte heller synkronisera åtgärder efter att samtalet är över. Skaparen behöver inte känna till det här konceptet alls, de behöver inte veta vad ett löfte eller lambda-funktion är.

  • Lokal och fjärransluten: Power Fx använder samma syntax och funktioner för data som är lokala i minnet och fjärransluter en databas eller tjänst. Användaren behöver inte tänka på den här skillnaden. Power Fx delegerar automatiskt vad det går till servern, för att bearbeta filter och sortera där mer effektivt.

  • Relationsdata: Order och Kunder är två olika tabeller med en många-till-en-relation. OData-frågan kräver en "$expand" med kunskaper i den externa nyckeln, ungefär som en anslutning i SQL. Formeln innehåller inget av detta, databasnycklar är ett annat koncept som tillverkaren inte behöver känna till. Tillverkaren kan använda enkel punktmarkering för att komma åt hela diagrammet med relationer från en post.

  • Projektion: När du skriver en fråga skriver select * from table många utvecklare, vilket tar tillbaka alla kolumner med data. Power Fx analyseras alla kolumner som används genom hela programmet, även över formelberoenden. Projektion optimeras automatiskt och återigen behöver en tillverkare inte veta vad "projektion" betyder.

  • Hämta bara det som behövs: I det LookUp här exemplet innebär funktionen att endast en post ska hämtas och att det är allt som returneras. Om fler poster begärs med hjälp av den Filter-funktionsom tusentals poster kan kvalificera endast en enskild sida med data returneras åt gången, på order av 100 poster per sida. Användaren måste ge gester via ett galleri eller en datatabell för att se mer data, och den hämtar automatiskt in mer data för dem. Skaparen kan hantera stora uppsättningar data utan att behöva tänka på att begränsa databegäran till hanterbara delar.

  • Körs endast när det behövs: Du definierar en formel för egenskapen för Text etikettkontrollen. När den valda variabeln ändras beräknas LookUp om automatiskt och etiketten uppdateras. Tillverkaren behöver inte skriva en OnChange-hanterare för urval och måste inte komma ihåg att etiketten är beroende av den. Detta är deklarativa programmering som nämnts tidigare, har tillverkaren angett vad de vill ha i etiketten, inte hur eller när den ska hämtas. Om den här etiketten inte är synlig på grund av att den finns på en skärm som inte är synlig, eller om dess Visible egenskap är falsk, kan du skjuta upp den här beräkningen tills etiketten är synlig och effektivt eliminera den om det sällan händer.

  • Excel syntaxöversättning: Många användare vet att &et (&) används för strängsammanfogning i Excel. JavaScript använder ett plustecken (+) och i andra språk används en prick (.).

  • Visningsnamn och lokalisering: First Name används i formeln Power Fx medan nwind_firstname den används i JavaScript-motsvarigheten. I Microsoft Dataverse och SharePoint, det finns ett visningsnamn för kolumner och tabeller förutom ett unikt logiskt namn. Visningsnamnen är ofta mycket mer användarvänliga, som i det här fallet, men de har en annan viktig kvalitet på så sätt att de kan lokaliseras. Om du har ett flerspråkigt team kan varje teammedlem se tabell- och fältnamn på sitt eget språk. I alla användningsfall Power Fx kontrollerar du att rätt logiska namn skickas till databasen automatiskt.

Ingen kod

Du behöver inte läsa eller skriva Power Fx för att börja uttrycka logik. Du kan uttrycka många anpassningar och logik via enkla växlar och UI-byggare. Dessa verktyg utan kod är byggda för att läsa och skriva Power Fx, så det finns gott om utrymme för någon att ta det vidare. Verktyg utan kod erbjuder dock aldrig hela språkets uttrycksfullhet. Även när du använder kodfria byggare ligger formelfältet framför och i mitten i Power Apps för att utbilda tillverkaren om vad som görs för deras räkning så att de kan börja lära sig Power Fx.

Låt oss titta på några exempel. I Power Apps ger egenskapspanelen ger "ingen kod"-knappar och rattar för kontrollernas egenskaper. De flesta egenskapsvärden är i praktiken statiska. Du kan använda färgverktyget och ändra bakgrundsfärg på Gallery. Observera att formelfältet reflekterar ändringen och uppdaterar formeln till ett annat RGBA samtal. När som helst kan du gå till formelfältet och ta den här ändringen ett steg längre – i det här exemplet med hjälp ColorFade av för att justera färgen. Färgegenskapen visas fortfarande i egenskapspanelen, men en fx-ikon visas bredvid markören och du dirigeras till formelfältet. Detta fungerar helt på två sätt: om du tar bort ColorFade samtalet returneras färgen till något som egenskapspanelen kan förstå och du kan använda den igen för att ange en färg.

Ingen kodfärg.

Här är ett mer invecklat exempel. I galleriet visas en lista över anställda från Dataverse. Dataverse innehåller vyer över tabelldata. Du kan välja en av dessa vyer och formeln ändras för att använda Filter funktionen med det här vynamnet. Du kan använda de två nedrullningsbara menyerna för att ringa i rätt tabell och vy utan att röra formelfältet. Låt oss säga att du vill gå längre och lägga till en sortering. Du kan lägga till den funktionen i formelfältet, och egenskapspanelen visar återigen en fx-ikon och dirigerar ändringar till formelfältet. Och om du förenklar formeln till något som egenskapspanelen kan läsa och skriva, kan den användas.

Ingen kodsortering.

De här exemplen är enkla. Power Fx är ett bra språk för att beskriva interaktioner utan kod. Det är koncist, kraftfullt och enkelt att parsa. Det ger det utrymme som så ofta behövs med "inga klippor" upp till låg kod.

Proffskod

Lågkodstillverkare skapar ibland lösningar som kräver hjälp av en expert eller tas över av en professionell utvecklare för att underhålla och förbättra. Tekniker uppskattar också att utveckling med låg kod kan vara enklare, snabbare och mindre användbart än att bygga ett professionellt verktyg. Alla situationer kräver inte den fullständiga kraften hos Visual Studio.

Professionella användare vill använda professionella verktyg för att vara mest produktiva. Du kan lagra Power Fx-formler i YAML-källfiler, som är enkla att redigera med hjälp av Visual Studio Code, Visual Studio eller någon annan textredigerare. Genom att lagra formler i YAML-filer kan du placera Power Fx under källkontroll med hjälp av GitHub, Azure DevOps eller något annat källkodskontrollsystem.

Proffskod Visual Studio Code.

GitHub för proffskod.

Power Fx stöder formelbaserade komponenter för delning och användning. Den stöder parametrar för komponentegenskaper, vilket gör det möjligt att skapa rena användardefinierade funktioner med fler förbättringar på vägen.

Är också Power Fx bra på att sammanfoga komponenter och tjänster som har skapats av professionella. Färdiga anslutningsappar ger åtkomst till hundratals datakällor och webbtjänster. Med anpassade anslutningsappar kan Power Fx kommunicera med alla REST-webbtjänster. Med kodkomponenter kan Power Fx interagera med helt anpassade JavaScript på skärmen och sidan.

Designprinciper

Enkel

Power Fx är utformat för att rikta sig till tillverkarens publik, vars medlemmar inte är utbildade till utvecklare. När det är möjligt använder språket kunskap som den här målgruppen redan känner till eller kan hämta snabbt. Antalet koncept som krävs för att lyckas behålls som ett minimum.

Att vara enkel är också bra för utvecklare. För utvecklarpubliken syftar Power Fx till att vara ett lågkodsspråk som minskar den tid som krävs för att skapa en lösning.

Excel-konsekvens

Microsoft Power Fx-språk lånar mycket från Excel-formelspråket. Det drar nytta av Excel kunskap och erfarenhet från de många tillverkare som också använder Excel. Typer, operatorer och funktionstyper ligger så nära Excel som möjligt.

Om Excel inte har något svar, ser Power Fx härnäst till SQL. Efter Excel är SQL det näst vanligaste deklarativa språket och kan vara till hjälp när det gäller dataåtgärder och kraftfulla skrivåtgärder som inte Excel använder.

Deklarativt

Skaparen beskriver vad de vill att logiken ska göra, inte exakt hur eller när de ska göra det. Med den här metoden kan kompilatorn optimera genom att utföra åtgärder parallellt, skjuta upp arbetet tills det behövs, samt förinställa och återanvända cachelagrade data.

I ett Excel kalkylblad definierar författaren till exempel relationerna mellan celler, men Excel bestämmer när och i vilken ordning formler ska utvärderas. På samma sätt kan du betrakta formler i en app som "omberäkning" efter behov baserat på användaråtgärder, databasändringar eller tidsinställda händelser.

Funktion

Använd rena funktioner som inte har biverkningar. Den här metoden resulterar i logik som är lättare att förstå och ger kompilatorn mest frihet att optimera.

Till skillnad från Excel muterar appar till sin natur tillståndet. Appar har till exempel knappar som sparar ändringar i posten i en databas. Vissa funktioner har därför biverkningar, men begränsa dessa biverkningar så mycket som är praktiskt.

Sammansättning

Lägg där möjligt till funktioner som fungerar bra med befintliga funktioner. Du kan dela upp kraftfulla funktioner i mindre delar som du enklare kan använda oberoende av varandra.

Till exempel en Galleri kontroll har inte separata Sort och Filter egenskaper. I stället skapar Sort du funktionerna och Filter tillsammans till en enda Items egenskap. Du lagrar användargränssnittet för att Sort uttrycka och Filter beteende ovanpå Items egenskapen med hjälp av en dubbelriktad redigerare för den här egenskapen.

Starkt typad

Typerna av alla värden är kända vid kompileringstillfället. Den här metoden möjliggör tidig identifiering av fel och omfattande förslag vid redigering.

Polymorfa typer stöds, men innan du kan använda dem måste du fästa deras typ på en statisk typ och den typen måste vara känd vid kompileringstillfället. Funktionerna IsType och AsType tillhandahålls för test- och omvandlingstyper.

Typ av inferens

Typerna härleds från användningen utan att de har förts in. Om du anger en variabel till ett tal kan variabelns typ exempelvis fastställas som ett tal.

Om en användning av en konflikt uppstår uppstår ett kompileringsfel.

Språkkänsliga decimalavgränsare

Vissa regioner i världen använder en prick (.) som decimaltecken, medan andra använder ett komma (,). Excel följer denna regionala konvention. Andra programmeringsspråk använder vanligtvis en kanonisk punkt (.) som decimalavgränsare för alla användare över hela världen. För att vara så tillgänglig som möjligt för tillverkare på alla nivåer är det viktigt att 3,14 är ett decimaltal för en person i Frankrike som har använt den syntaxen hela sitt liv.

Valet av decimalavgränsare påverkar listavgränsaren, som används för funktionsanropsargument och operatorn för länkning.

Decimaltecken på redigerarens språk Power Fx decimaltecken Power Fx listavgränsare Power Fx kedjeoperatör
. (prick) . (prick) , (komma) ; (semikolon)
, (komma) , (komma) ; (semikolon) ;; (dubbelt semikolon)

Mer information: Global support

Inte objektorienterad

Excel är inte objektinriktat och det är inte heller Power Fx. På vissa språk uttrycks till exempel stränglängden som en egenskap för strängen, till exempel "Hello World".length i JavaScript. Excel och Power Fx i stället uttrycka detta i termer av en funktion som Len( "Hello World" ).

Komponenter med egenskaper och metoder är objektfokuserade och Power Fx fungerar enkelt med dem. Men där det är möjligt föredrar du ett funktionellt tillvägagångssätt.

Utökningsbar

Beslutsfattare kan skapa sina komponenter och funktioner med hjälp av sig Power Fx själva. Utvecklare kan skapa sina komponenter och funktioner genom att skriva JavaScript.

Utvecklarvänliga

Även om skaparna är det primära målet kan du försöka vara utvecklarvänlig när det är möjligt. Om det inte står i konflikt med de designprinciper som beskrevs tidigare kan du göra saker på ett sätt som en utvecklare uppskattar. Excel har till exempel ingen funktion för att lägga till kommentarer, så använd C-liknande linje- och infogade kommentarer.

Språkutveckling

Att utveckla programmeringsspråk är både nödvändigt och svårt. Alla är med rätta oroliga för att en förändring, oavsett hur välmenad, kan bryta befintlig kod och kräva att användarna ska lära sig ett nytt mönster. Power Fx tar bakåtkompatibilitet på allvar, men Power Fx-teamet tror också starkt att de inte alltid kommer att få det rätt första gången och att samhället kollektivt kan lära sig vad som är bäst. Ett programmeringsspråk måste utvecklas och Power Fx har utformats för att stödja språkutvecklingen redan från början.

Varje sparat Power Fx-dokument innehåller en språkversionsstämpel. Om Power Fx-teamet vill göra en inkompatibel ändring skriver de vad de kallar en "back compat converter" som automatiskt skriver om formeln nästa gång den redigeras. Om ändringen är något större som teamet behöver utbilda användaren om, visar appen ett meddelande med en länk till dokumenten. Med hjälp av den här funktionen kan Power Fx fortfarande läsa in appar som har skapats med förhandsversionerna av Power Apps från många år sedan, trots alla ändringar som har inträffat sedan dess.

Till exempel introducerade ShowError Power Fx-teamet funktionen för att visa en felbanderoll med röd bakgrund.

Visa fel.

Användarna älskade det, men de bad också om ett sätt att visa en lyckad banderoll (grön bakgrund) eller en informationsbanderoll (blå bakgrund). Därför kom teamet fram till en mer allmän Notify funktion som tar ett andra argument för typen av meddelande. Teamet kunde bara ha lagt till Notify och hållit ShowError som det var, men istället ersatte ShowError de med Notify. De tog bort en funktion som tidigare var i produktion och ersatte den med något annat. Eftersom det skulle ha funnits två sätt att göra samma sak, skulle den här ändringen ha orsakat förvirring – särskilt för nya användare – och viktigast av allt skulle det ha skapat komplexitet. Ingen klagade, alla, uppskattade förändringen och gick sedan vidare till nästa meddelande-funktion.

Så här ser samma program ut när den läses in i den senaste versionen av Power Apps. Användaren krävde ingen åtgärd för att den här omvandlingen skulle inträffa, den inträffade automatiskt när programmet öppnades.

Meddelandefunktionen ersätter ShowError.

Med hjälp av den här funktionen kan Power Fx utvecklas snabbare och mer aggressivt än de flesta programmeringsspråk.

Inget odefinierat värde

På vissa språk, till exempel JavaScript, används konceptet med ett odefinierat värde för odefinierade variabler eller egenskaper som saknas. För enkelhetens skull undviker Power Fx det här konceptet. Instanser som skulle vara odefinierade på andra språk behandlas som antingen ett fel eller ett tomt värde. Alla oinslagna variabler börjar till exempel med ett tomt värde. Alla datatyper kan ha värdet tomt.

Datatyper
Operatorer och identifierare
Tabeller
Variabler
Imperativ logik
Globalt stöd
Uttryck grammatik
Grammatik för YAML-formel
Formler i arbetsyteappar