Olá!
Sim, o primeiro parâmetro é passado por referência (@) e é atualizado pela função. Se passar por valor (sem o @), não surtirá efeito.
Código: Selecionar todos
PROCEDURE Teste
LOCAL xVar := NIL
xVar := Default( xVar, "Novo Valor" ) // parâmetro passado por valor
? xVar // ==> NIL
xVar := Default( @xVar, "Novo Valor" ) // parâmetro passado por referência
? xVar // ==> "Novo Valor"
RETURN
Quando se passa um parâmetro por valor, como o próprio nome já diz, é passado o valor do parâmetro. Qualquer alteração deste valor dentro da função que recebeu o parâmetro não reflete no valor contido na variável, dentro da função de origem.
Ao contrârio, quando se parra por referência, é passado o endereço de memória da variável. Alterações da variável na função destino são refletidas no valor contido na variável, na função de origem.