Nim: endereços de parâmetros e mutabilidade

Estou tentando me decidir sobre a política de Nim por trásexpression has no address. Em particular, eu tenho uma função C que leva um ponteiro (+ comprimento etc.) de algum buffer de dados. Eu sei que esta função iránão modificar os dados. Simplificado:

type
  Buffer = object
    data: seq[float]

proc wrapperForCCall(buf: Buffer) =
  # accessing either buf.addr nor buf.data.addr produces
  # Error: expression has no address
  # workaround:
  var tmp = buf.data          # costly copy
  callToC(tmp.len, tmp.addr)  # now it works

Por um lado, isso faz sentido, pois um parâmetro parece se comportar exatamente como umlet ligação, que também "não tem endereço". Por outro lado, estou intrigado com esta afirmação no manual:

Os parâmetros var nunca são necessários para a passagem eficiente de parâmetros.

Tanto quanto posso ver, a única maneira de evitar a cópia dos dados é:

passando o parâmetro comobuf: var Bufferpassando uma referência, ou seja, usando umref object.

Nos dois casos, isso sugere que minha função modifica os dados. Além disso, introduz mutabilidade no site do responsável pela chamada (ou seja, os usuários não podem mais usar as ligações let para seus buffers). A questão-chave para mim é: uma vez que "eu sei" quecallToC é somente leitura, posso convencer o Nim a permitir a imutabilidade sem uma cópia? Vejo que isso é perigoso, pois tenho que ter certeza de que a ligação é imutável. Assim, isso exigiria algum tipo de mecanismo de "endereço não seguro", permitindo forçar os ponteiros para dados imutáveis?

E meu mistério final dos endereços de parâmetro: tentei tornar explícita a necessidade da cópia alterando o tipo paraBuffer {.bycopy.} = object. Nesse caso, a cópia já acontece no momento da chamada e eu esperaria ter acesso ao endereço agora. Por que o acesso também é negado neste caso?

questionAnswers(3)

yourAnswerToTheQuestion