Regras de escrita da linguagem M

M

1. Maiúsculas e minúsculas

M diferencia maiúsculas de minúsculas em tudo: palavras-chave, nomes de passo e funções. Let, IF ou table.selectrows dão erro.

2. Nomes (identificadores)

FormaQuando usarExemplo
NormalLetras, números, _ e ponto, começando por letra ou _Origem, Vendas_2026, Table.SelectRows
#"..."Nome com espaço, com caractere como +, - ou /, que começa com número ou que é palavra-chave#"Linhas Filtradas", #"Total + Frete"
GeneralizadoDentro de [ ] de registro, espaços e palavras-chave são aceitos sem #"..."[Base Line = 100][Base Line]

Os nomes de passos criados pela interface com espaço aparecem como #"Nome do Passo" no Editor Avançado.

3. Comentários

M
// comentário de uma linha
/* comentário
   de várias linhas */

Comentários não se aninham e não valem dentro de texto entre aspas.

4. Texto e sequências de escape

Precisa deEscrevaResultado
Aspas dentro do texto"""O ""melhor"" preço" → O "melhor" preço
Quebra de linha#(cr,lf) ou #(lf)"Linha 1#(lf)Linha 2"
Tabulação#(tab)"A#(tab)B"
Caractere Unicode#(00E9)é
O próprio #(#(#)(#( literal

5. each e o _

each cria uma função de um parâmetro chamado _. Dentro dela, [Campo] é atalho para _[Campo]:

M
Table.SelectRows(Vendas, each [Valor] > 100)
Table.SelectRows(Vendas, (_) => _[Valor] > 100)   // equivalente
Table.SelectRows(Vendas, (linha) => linha[Valor] > 100)   // mais legível em lógica longa

6. try, otherwise e catch

M
let
    Resultado = try Number.FromText("abc"),
    // [HasError = true, Error = [Reason = "DataFormat.Error", Message = ..., Detail = ...]]

    ComPadrao = try Number.FromText("abc") otherwise null,

    ComMensagem = try Number.FromText("abc") catch (e) => "Erro: " & e[Message]
in
    ComMensagem

Atenção Trate o erro perto de onde ele nasce. O M é preguiçoso: um erro dentro de um campo de registro ou de um passo que ainda não foi lido só aparece quando alguém o lê — e aí o try que estava "em volta" já passou.

7. Recursão com @

Uma função só enxerga o próprio nome com @:

M
let
    Fatorial = (n) => if n = 0 then 1 else n * @Fatorial(n - 1)
in
    Fatorial(5)   // 120

8. ... para código em construção

... gera o erro "Not Implemented" e deixa o resto da consulta rodar:

M
(x, y) => if x > y then x - y else ...

Fontes

Conhecer a trilha Power BI ao vivo