Nim: direcciones de parámetros y mutabilidad

Estoy tratando de decidir sobre la política de Nim detrásexpression has no address. En particular, tengo una función C que toma un puntero (+ longitud, etc.) de algún búfer de datos. Sé que esta funciónno modificar los datos 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 un lado, esto tiene sentido, ya que un parámetro parece comportarse exactamente como unlet vinculante, que también "no tiene dirección". Por otro lado, estoy desconcertado por esta declaración en el manual:

Los parámetros var nunca son necesarios para el paso eficiente de parámetros.

Por lo que puedo ver, la única manera de evitar copiar los datos es:

pasando el parámetro comobuf: var Bufferpasar una referencia, es decir, usar unref object.

En ambos casos, esto sugiere que mi función modifica los datos. Además, introduce mutabilidad en el sitio de la persona que llama (es decir, los usuarios ya no pueden usar enlaces let para sus buffers). La pregunta clave para mí es: desde "sé" quecallToC es de solo lectura, ¿puedo convencer a Nim para que permita la inmutabilidad sin una copia? Veo que esto es peligroso, ya que tengo que saber con certeza que la llamada es inmutable. Por lo tanto, ¿esto requeriría algún tipo de mecanismo de "dirección insegura", que permita forzar a los punteros a datos inmutables?

Y mi misterio final de las direcciones de parámetros: intenté hacer explícita la necesidad de la copia cambiando el tipo aBuffer {.bycopy.} = object. En este caso, la copia ya ocurre en el momento de la llamada, y esperaría tener acceso a la dirección ahora. ¿Por qué también se niega el acceso en este caso?

Respuestas a la pregunta(3)

Su respuesta a la pregunta